Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Применение Mock-объектов для нагрузочного и стресс- тестирования

HappyDev'13
December 07, 2013

Применение Mock-объектов для нагрузочного и стресс- тестирования

Евгений Тюменцев

HappyDev'13

December 07, 2013
Tweet

More Decks by HappyDev'13

Other Decks in Programming

Transcript

  1. О себе Тюменцев Евгений Разработка кросс-платформенных приложений Руководство отделом разработки

    ПО в 40 человек Тех. директор ИТ-компании в 70 человек Управляющий партнер стартапа “Тик-Так Коуч”
  2. 6 HappyDev’13 Аксиома присваивания {P[E/x]} x := E {P} {y=2

    & z = 3 & y+z+3 = 8} x:=y+z; {y=2 & z = 3 & x+3 =8}
  3. 11 HappyDev’13 Возведение в степень: рекурсия int power(int a, int

    n) { assert(n > 0 || (a != 0 || n != 0)); if (n == 0) return 1; else { int a2 = power(a, n/2); if (n & 1) return a*a2*a2; else return a2*a2; } } http://freehabr.ru/blog/programming/1933.html
  4. 12 HappyDev’13 Возведение в степень: итерация int power(int a, int

    n) { assert(n > 0 || (a != 0 || n != 0)); int r = 1, a0 = a, n0 = n; /* r == 1 and a0 == a and n0 == n and n >= 0 инвариант_цикла: a0**n0 == r*a**n ограничивающая_функция(n): n */
  5. 13 HappyDev’13 Возведение в степень: итерация while(n > 0) {

    /* n > 0 and ограничивающая_функция(n) > 0 and инвариант_цикла */ if (n & 1) r *= a; /* (n - нечетно and a0**n0*a == r*a**n) or инвариант_цикла */ n >>= 1;
  6. 15 HappyDev’13 Возведение в степень: итерация /* n == 0

    and инвариант_цикла and ограничивающая_функция(n) == 0 */ // a0**n0 == r return r; }
  7. 16 HappyDev’13 Очень трудоемко! Правило композиции {P} S {Q}, {Q}

    T {R} ╞ {P} S;T {R} Проверку каждого оператора заменить на проверку группы операторов
  8. 24 HappyDev’13 Необходимое условие 1 Принцип подстановки Лисков Функции, которые

    используют ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом.
  9. 25 HappyDev’13 Необходимое условие 2 Принцип обращения зависимостей Высокоуровневые компоненты

    не должны зависеть от низкоуровневых компонент. И те, и те должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
  10. 26 HappyDev’13 Что тестировать? Был ли вызван метод? Сколько раз

    был вызван? Порядок вызова методов С какими параметрами? Что вернул на выходе? Выбросил ли исключение?
  11. 27 HappyDev’13 Осторожно! Инкапсуляция class Backuper { public void BackupDirectory(string

    directoryPath, string backupPath) { fileSystem.CreateDirectory(backupPath); foreach (string file in fileSystem.EnumerateFiles(directoryPath)) { fileSystem.Copy(file, backupPath); } } private IFileSystem fileSystem; }
  12. 28 HappyDev’13 Осторожно! Инкапсуляция void BackupDirectoryTest() { // Arrange... //

    Act... // Assert fileSystemMock.Verify(x => x.Copy("file1", "backupPath")); fileSystemMock.Verify(x => x.Copy("file2", "backupPath")); }
  13. 29 HappyDev’13 Осторожно! Инкапсуляция // ... void BackupDirectory(string directoryPath, string

    backupPath) { fileSystem.CreateDirectory(backupPath); fileSystem.DirectoryCopy(directoryPath, backupPath); // test fail }
  14. 30 HappyDev’13 Mock vs «классика»: кто мощнее? Можно ли с

    помощью Mock написать тест, который нельзя было бы сделать с помощью тестов состояния?
  15. 31 HappyDev’13 Mock vs «классика»: кто мощнее? Тюменцев Е.А. Автоматизированное

    тестирование сложности алгоритмов с помощью Mock-объектов. Математические структуры и моделирование. - Омск : Ом. гос. ун-т, 2013. Том. 27, № 1. 122 с.
  16. 32 HappyDev’13 Алгоритмическая сложность - Mock class A { private:

    int someValue; public: static int readCounter; static int writeCounter; A(A const& other) { ++other.writeCounter; this->someValue = other.someValue; }
  17. 33 HappyDev’13 Алгоритмическая сложность - Mock A& operator=(A const& other)

    { ++other.writeCounter; this->someValue = other.someValue; return *this; } friend bool operator==(A const& a1, A const & a2); friend bool operator<(A const& a1, A const & a2); };
  18. 34 HappyDev’13 Алгоритмическая сложность - Mock bool operator==(A const& a1,

    A const & a2) { ++a1.readCounter; return a1.someValue == a2.someValue; } bool operator<(A const& a1, A const & a2) { ++a1.readCounter; return a1.someValue < a2.someValue; }
  19. 35 HappyDev’13 Алгоритмическая сложность - List list<A> list; for(int i

    = 999; i >= 0; --i) list.insert(list.begin(), A(i)); >Insert: read 0 write 1000.
  20. 37 HappyDev’13 Алгоритмическая сложность - map bool operator==(pair<const A, int>

    & p1, pair<const A, int> & p2) { return p1.first == p2.first; } map<A,int> map; for(int i = 0; i < 1024; ++i) map[A(i)] = i; >Insert: read 31828 write 2048.
  21. 38 HappyDev’13 Алгоритмическая сложность - tree Наихудший случай >Insert 1024:

    read 1047552 write 1024 Наилучший случай >Insert 1024: read 41483 write 1024
  22. 39 HappyDev’13 Тесты производительности void TestTemplate() { Time startTime =

    Date.Now(); TestingFeature(); Time timeDiff = Date.Now() – startTime; Assert(timeDiff < etalonTime); }
  23. 40 HappyDev’13 Как выбрать эталон? Тесты должны:  Выявлять ошибки,

    влияющие на производительность  Подтверждать, что внесенные изменения улучшают производительность
  24. 41 TIKTOKCOACH.RU Карты Шухарта 1923 г. AT&T Ламповые усилители сигнала

    Количество аварийных бригад и транстпорта? Bell Labs 1924 г. Уолтер Шухарт