Вы находитесь на странице: 1из 39

Случайное тестирование

Software Testing 101

Марат Ахин

Санкт-Петербургский политехнический университет

2018

Марат Ахин (СПбПУ) RT 2018 243 / 347


Quiz

Марат Ахин (СПбПУ) RT 2018 244 / 347


Recap

Марат Ахин (СПбПУ) RT 2018 245 / 347


Содержание

1 Случайное тестирование
Генерация тестов
Fuzzing
Generative random testing
Mutation random testing
Directed random testing

Марат Ахин (СПбПУ) RT 2018 246 / 347


Генерация тестов

Развитие идеи генерации тестовых оракулов


Полная автоматизация процесса тестирования

Марат Ахин (СПбПУ) RT 2018 247 / 347


Генерация тестов

Основная идея
Заставить компьютер работать вместо нас

Дешевле
Быстрее
Нет человеческого фактора

Марат Ахин (СПбПУ) RT 2018 248 / 347


Генерация тестов

Автоматическая генерация компонентов тестов

Входные данные
Последовательности вызовов API
Тестовые оракулы

Марат Ахин (СПбПУ) RT 2018 249 / 347


Генерация тестов

Результаты очень сильно зависят от того, что именно мы тестируем...

kd-tree
stoi
md5sum
PDF reader

Марат Ахин (СПбПУ) RT 2018 250 / 347


Fuzzing

Прародитель случайного тестирования

Полностью случайные данные


Вариант smoke testing

P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791
TJcs5t9ZbxQAsLZx436PdJcxk3vq61192

Марат Ахин (СПбПУ) RT 2018 251 / 347


Fuzzing

Используем слабые оракулы


При необходимости вставляем заглушки

Что такое случайные данные?


Набор байт
Вызовы функций API
Пользовательский ввод

Марат Ахин (СПбПУ) RT 2018 252 / 347


Fuzzing

1989 – первое применение фаззинга на утилитах *NIX


1995 – повторная проверка утилит *NIX
2000 – проверка Windows NT/Windows 2000
2006 – проверка утилит Mac OS X

Стали ли результаты лучше?

Марат Ахин (СПбПУ) RT 2018 253 / 347


Fuzzing

Нет!

Все стало еще хуже!

GUI: 26% -> 45% -> 64% -> 73%


Многие баги, обнаруженные фаззингом, были исправлены...
...но появилось еще больше новых!

Марат Ахин (СПбПУ) RT 2018 254 / 347


Fuzzing

Марат Ахин (СПбПУ) RT 2018 255 / 347


Fuzzing

md5sum
kd-tree
stoi
PDF reader

Работает для всех программ


c
Но есть одно «но»...

Марат Ахин (СПбПУ) RT 2018 256 / 347


Проблема валидности данных

Полностью случайные данные являются невалидными входными


данными для большинства программ

Марат Ахин (СПбПУ) RT 2018 257 / 347


Проблема валидности данных

Большинство программ ожидают структурированные входные


данные
P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791
TJcs5t9ZbxQAsLZx436PdJcxk3vq61192
vs
3.1415926535897932384626433832797
[(1,0,0),(0,1,0),(0,0,1),(1,1,1)]

Марат Ахин (СПбПУ) RT 2018 258 / 347


Generative random testing

Если мы знаем структуру, то мы можем ей воспользоваться

Генерируем отдельные элементы


Комбинируем их в соответствии с заданной структурой
Вносим случайные нарушения структуры

Марат Ахин (СПбПУ) RT 2018 259 / 347


Generative random testing

Что такое структура?

Набор правил генерации


Грамматика
Формальная спецификация
Стандарт на формат входных файлов

Марат Ахин (СПбПУ) RT 2018 260 / 347


Generative random testing

kd-tree
stoi
PDF reader

Работает для структурированных входных данных


c
Но есть одно «но»...

Марат Ахин (СПбПУ) RT 2018 261 / 347


Проблема сложной структуры

Иногда структура входных данных является слишком сложной

Марат Ахин (СПбПУ) RT 2018 262 / 347


Mutation random testing

Обычно у нас есть какой-то набор тестовых входных данных

Подвергаем тестовые данные мутации


При этом возможно использование знания структуры данных
Часть данных может генерироваться случайно

Марат Ахин (СПбПУ) RT 2018 263 / 347


Mutation random testing

Какие могут быть мутационные трансформации?

Добавление нового фрагмента


Удаление старого фрагмента
Изменение фрагмента

Обмен двух фрагментов местами


Замена значений на граничные

Марат Ахин (СПбПУ) RT 2018 264 / 347


Mutation random testing

PDF reader
Web browser

Работает практически для всего


c
Но есть одно «но»...

Марат Ахин (СПбПУ) RT 2018 265 / 347


Проблема скелета в шкафу

Добраться до самых дальних закоулков нельзя

Марат Ахин (СПбПУ) RT 2018 266 / 347


Directed random testing

В чем заключаются основные проблемы случайного тестирования?

Некорректные тесты
Эквивалентные тесты
Длинные тесты

Марат Ахин (СПбПУ) RT 2018 267 / 347


Directed random testing

Марат Ахин (СПбПУ) RT 2018 268 / 347


Directed random testing

Некорректные тесты

Более строгие правила генерации/мутации


Явный учет некорректных тестов

Марат Ахин (СПбПУ) RT 2018 269 / 347


Directed random testing

Эквивалентные тесты

Обнаружение тестов, на которых программа ведет себя


одинаковым образом
Статически
Динамически

Вспомним про тестовое покрытие...

Марат Ахин (СПбПУ) RT 2018 270 / 347


Directed random testing

Длинные тесты

Минимизация тестов
Дихотомия
Стохастический поиск
Эволюционные алгоритмы

Delta debugging

Марат Ахин (СПбПУ) RT 2018 271 / 347


Directed random testing

А можно ли еще лучше?

Каждый новый тест минимально отличается от имеющихся


Каждый новый тест улучшает тестовое покрытие
Каждый новый тест должен генерироваться достаточно быстро

Марат Ахин (СПбПУ) RT 2018 272 / 347


Concolic testing

Concolic testing

Комбинируем информацию о конкретных выполнениях


программы...
...и информацию о символическом поведении программы

Комбинация статического и динамического анализов

Марат Ахин (СПбПУ) RT 2018 273 / 347


Satisfiability modulo theories

1 void f ( int x ) { SMT to the rescue


2 int y = x ^2;
3
4 bool A = x > 0;
1 x , y = Ints ( ’x y ’)
5 bool B = x < 10;
2 A , B , C = Bools ( ’A B C ’)
6 bool C = y > 20;
3
7
4 s = Solver ()
8 if ( B && C ) {
5
9 if ( A ) {
6 s . add ( y == x * x)
10 ...
7 s . add ( A == ( x > 0))
11 }
8 s . add ( B == ( x < 10))
12 }
9 s . add ( C == ( y > 20))
13 }

Марат Ахин (СПбПУ) RT 2018 274 / 347


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 2018 275 / 347


Проблемы concolic testing

Почему я слышу об этом впервые в жизни?

Это сложно
Это очень сложно
Это очень-очень сложно

Марат Ахин (СПбПУ) RT 2018 276 / 347


Проблемы concolic testing

Инструментирование программы
Моделирование памяти
Взрыв пространства состояний

Оптимизации!

Марат Ахин (СПбПУ) RT 2018 277 / 347


Concolic testing

SAGE

Microsoft Research
500+ машино-лет
Более трети всех багов в различных проектах Microsoft
Развивается вместе с тестируемым им ПО

Марат Ахин (СПбПУ) RT 2018 278 / 347


Directed random testing

Visual Studio
Microsoft Office

Работает для всего


c
Но есть одно «но»...

Марат Ахин (СПбПУ) RT 2018 279 / 347


Проблема мистера Икс

Некоторые части системы могут быть «черным ящиком»

Марат Ахин (СПбПУ) RT 2018 280 / 347


W.I.L.T.

Марат Ахин (СПбПУ) RT 2018 281 / 347