4. Случайное тестирование
Содержание
1 Случайное тестирование
Генерация тестов
Fuzzing
Generative random testing
Mutation random testing
Directed random testing
Марат Ахин (СПбГПУ) RT 2014 248 / 346
5. Случайное тестирование Генерация тестов
Генерация тестов
Развитие идеи генерации тестовых оракулов
Полная автоматизация процесса тестирования
Марат Ахин (СПбГПУ) RT 2014 249 / 346
6. Случайное тестирование Генерация тестов
Генерация тестов
Основная идея
Заставить компьютер работать вместо нас
Дешевле
Быстрее
Нет человеческого фактора
Марат Ахин (СПбГПУ) RT 2014 250 / 346
8. Случайное тестирование Генерация тестов
Генерация тестов
Результаты очень сильно зависят от того, что именно мы тестируем...
kd-tree
stoi
md5sum
PDF reader
Марат Ахин (СПбГПУ) RT 2014 252 / 346
9. Случайное тестирование Fuzzing
Fuzzing
Прародитель случайного тестирования
Полностью случайные данные
Вариант smoke testing
P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791
TJcs5t9ZbxQAsLZx436PdJcxk3vq61192
Марат Ахин (СПбГПУ) RT 2014 253 / 346
10. Случайное тестирование Fuzzing
Fuzzing
Используем слабые оракулы
При необходимости вставляем заглушки
Что такое случайные данные?
Набор байт
Вызовы функций API
Пользовательский ввод
Марат Ахин (СПбГПУ) RT 2014 254 / 346
11. Случайное тестирование Fuzzing
Fuzzing
1989 – первое применение фаззинга на утилитах *NIX
1995 – повторная проверка утилит *NIX
2000 – проверка Windows NT/Windows 2000
2006 – проверка утилит Mac OS X
Стали ли результаты лучше?
Марат Ахин (СПбГПУ) RT 2014 255 / 346
12. Случайное тестирование Fuzzing
Fuzzing
Нет!
Все стало еще хуже!
GUI: 26% -> 45% -> 64% -> 73%
Многие баги, обнаруженные фаззингом, были исправлены...
...но появилось еще больше новых!
Марат Ахин (СПбГПУ) RT 2014 256 / 346
15. Случайное тестирование Fuzzing
Проблема валидности данных
Полностью случайные данные являются невалидными входными
данными для большинства программ
Марат Ахин (СПбГПУ) RT 2014 259 / 346
16. Случайное тестирование Fuzzing
Проблема валидности данных
Большинство программ ожидают структурированные входные
данные
P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791
TJcs5t9ZbxQAsLZx436PdJcxk3vq61192
vs
3.1415926535897932384626433832797
[(1,0,0),(0,1,0),(0,0,1),(1,1,1)]
Марат Ахин (СПбГПУ) RT 2014 260 / 346
17. Случайное тестирование Generative random testing
Generative random testing
Если мы знаем структуру, то мы можем ей воспользоваться
Генерируем отдельные элементы
Комбинируем их в соответствии с заданной структурой
Вносим случайные нарушения структуры
Марат Ахин (СПбГПУ) RT 2014 261 / 346
18. Случайное тестирование Generative random testing
Generative random testing
Что такое структура?
Набор правил генерации
Грамматика
Формальная спецификация
Стандарт на формат входных файлов
Марат Ахин (СПбГПУ) RT 2014 262 / 346
19. Случайное тестирование Generative random testing
Generative random testing
kd-tree
stoi
PDF reader
Работает для структурированных входных данных
Но есть одно «но»... c
Марат Ахин (СПбГПУ) RT 2014 263 / 346
20. Случайное тестирование Generative random testing
Проблема сложной структуры
Иногда структура входных данных является слишком сложной
Марат Ахин (СПбГПУ) RT 2014 264 / 346
21. Случайное тестирование Mutation random testing
Mutation random testing
Обычно у нас есть какой-то набор тестовых входных данных
Подвергаем тестовые данные мутации
При этом возможно использование знания структуры данных
Часть данных может генерироваться случайно
Марат Ахин (СПбГПУ) RT 2014 265 / 346
22. Случайное тестирование Mutation random testing
Mutation random testing
Какие могут быть мутационные трансформации?
Добавление нового фрагмента
Удаление старого фрагмента
Изменение фрагмента
Обмен двух фрагментов местами
Замена значений на граничные
Марат Ахин (СПбГПУ) RT 2014 266 / 346
23. Случайное тестирование Mutation random testing
Mutation random testing
PDF reader
Web browser
Работает практически для всего
Но есть одно «но»... c
Марат Ахин (СПбГПУ) RT 2014 267 / 346
24. Случайное тестирование Mutation random testing
Проблема скелета в шкафу
Добраться до самых дальних закоулков нельзя
Марат Ахин (СПбГПУ) RT 2014 268 / 346
25. Случайное тестирование Directed random testing
Directed random testing
В чем заключаются основные проблемы случайного тестирования?
Некорректные тесты
Эквивалентные тесты
Длинные тесты
Марат Ахин (СПбГПУ) RT 2014 269 / 346
27. Случайное тестирование Directed random testing
Directed random testing
Некорректные тесты
Более строгие правила генерации/мутации
Явный учет некорректных тестов
Марат Ахин (СПбГПУ) RT 2014 271 / 346
28. Случайное тестирование Directed random testing
Directed random testing
Эквивалентные тесты
Обнаружение тестов, на которых программа ведет себя
одинаковым образом
Статически
Динамически
Вспомним про тестовое покрытие...
Марат Ахин (СПбГПУ) RT 2014 272 / 346
30. Случайное тестирование Directed random testing
Directed random testing
А можно ли еще лучше?
Каждый новый тест минимально отличается от имеющихся
Каждый новый тест улучшает тестовое покрытие
Каждый новый тест должен генерироваться достаточно быстро
Марат Ахин (СПбГПУ) RT 2014 274 / 346
31. Случайное тестирование Directed random testing
Concolic testing
Concolic testing
Комбинируем информацию о конкретных выполнениях
программы...
...и информацию о символическом поведении программы
Комбинация статического и динамического анализов
Марат Ахин (СПбГПУ) RT 2014 275 / 346
32. Случайное тестирование Directed random testing
Satisfiability modulo theories
1 void f(int x) {
2 int y = x^2;
3
4 bool A = x > 0;
5 bool B = x < 10;
6 bool C = y > 20;
7
8 if (B && C) {
9 if (A) {
10 ...
11 }
12 }
13 }
SMT to the rescue
1 x, y = Ints(’x y’)
2 A, B, C = Bools(’A B C’)
3
4 s = Solver ()
5
6 s.add(y == x * x)
7 s.add(A == (x > 0))
8 s.add(B == (x < 10))
9 s.add(C == (y > 20))
Марат Ахин (СПбГПУ) RT 2014 276 / 346
33. Случайное тестирование Directed random testing
Satisfiability modulo theories
1 print s.check(B and C, A)
2 print s.model ()
3 # sat
4 # [A = True , B = True , y = 25, x = 5, C = True]
5
6 print s.check(B and C, Not(A))
7 print s.model ()
8 # sat
9 # [A = False , B = True , y = 25, x = -5, C = True]
10
11 print s.check(Not(B and C))
12 print s.model ()
13 # sat
14 # [A = False , B = True , y = 0, x = 0, C = False]
Марат Ахин (СПбГПУ) RT 2014 277 / 346
34. Случайное тестирование Directed random testing
Проблемы concolic testing
Почему я слышу об этом впервые в жизни?
Это сложно
Это очень сложно
Это очень-очень сложно
Марат Ахин (СПбГПУ) RT 2014 278 / 346
35. Случайное тестирование Directed random testing
Проблемы concolic testing
Инструментирование программы
Моделирование памяти
Взрыв пространства состояний
Оптимизации!
Марат Ахин (СПбГПУ) RT 2014 279 / 346
36. Случайное тестирование Directed random testing
Concolic testing
SAGE
Microsoft Research
500+ машино-лет
Более трети всех багов в различных проектах Microsoft
Развивается вместе с тестируемым им ПО
Марат Ахин (СПбГПУ) RT 2014 280 / 346
37. Случайное тестирование Directed random testing
Directed random testing
Visual Studio
Microsoft Office
Работает для всего
Но есть одно «но»... c
Марат Ахин (СПбГПУ) RT 2014 281 / 346
38. Случайное тестирование Directed random testing
Проблема мистера Икс
Некоторые части системы могут быть «черным ящиком»
Марат Ахин (СПбГПУ) RT 2014 282 / 346
39. W.I.L.T. What I Learned Today?
W.I.L.T.
Марат Ахин (СПбГПУ) RT 2014 283 / 346