Случайное тестирование
Software Testing 101
Марат Ахин
Санкт-Петербургский государственный политехнический университет
2014
Марат Ахин (СПбГПУ) RT 2014 245 / 346
Quiz
Марат Ахин (СПбГПУ) RT 2014 246 / 346
Recap
Марат Ахин (СПбГПУ) RT 2014 247 / 346
Случайное тестирование
Содержание
1 Случайное тестирование
Генерация тестов
Fuzzing
Generative random testing
Mutation random testing
Directed random testing
Марат Ахин (СПбГПУ) RT 2014 248 / 346
Случайное тестирование Генерация тестов
Генерация тестов
Развитие идеи генерации тестовых оракулов
Полная автоматизация процесса тестирования
Марат Ахин (СПбГПУ) RT 2014 249 / 346
Случайное тестирование Генерация тестов
Генерация тестов
Основная идея
Заставить компьютер работать вместо нас
Дешевле
Быстрее
Нет человеческого фактора
Марат Ахин (СПбГПУ) RT 2014 250 / 346
Случайное тестирование Генерация тестов
Генерация тестов
Автоматическая генерация компонентов тестов
Входные данные
Последовательности вызовов API
Тестовые оракулы
Марат Ахин (СПбГПУ) RT 2014 251 / 346
Случайное тестирование Генерация тестов
Генерация тестов
Результаты очень сильно зависят от того, что именно мы тестируем...
kd-tree
stoi
md5sum
PDF reader
Марат Ахин (СПбГПУ) RT 2014 252 / 346
Случайное тестирование Fuzzing
Fuzzing
Прародитель случайного тестирования
Полностью случайные данные
Вариант smoke testing
P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791
TJcs5t9ZbxQAsLZx436PdJcxk3vq61192
Марат Ахин (СПбГПУ) RT 2014 253 / 346
Случайное тестирование Fuzzing
Fuzzing
Используем слабые оракулы
При необходимости вставляем заглушки
Что такое случайные данные?
Набор байт
Вызовы функций API
Пользовательский ввод
Марат Ахин (СПбГПУ) RT 2014 254 / 346
Случайное тестирование Fuzzing
Fuzzing
1989 – первое применение фаззинга на утилитах *NIX
1995 – повторная проверка утилит *NIX
2000 – проверка Windows NT/Windows 2000
2006 – проверка утилит Mac OS X
Стали ли результаты лучше?
Марат Ахин (СПбГПУ) RT 2014 255 / 346
Случайное тестирование Fuzzing
Fuzzing
Нет!
Все стало еще хуже!
GUI: 26% -> 45% -> 64% -> 73%
Многие баги, обнаруженные фаззингом, были исправлены...
...но появилось еще больше новых!
Марат Ахин (СПбГПУ) RT 2014 256 / 346
Случайное тестирование Fuzzing
Fuzzing
Марат Ахин (СПбГПУ) RT 2014 257 / 346
Случайное тестирование Fuzzing
Fuzzing
md5sum
kd-tree
stoi
PDF reader
Работает для всех программ
Но есть одно «но»... c
Марат Ахин (СПбГПУ) RT 2014 258 / 346
Случайное тестирование Fuzzing
Проблема валидности данных
Полностью случайные данные являются невалидными входными
данными для большинства программ
Марат Ахин (СПбГПУ) RT 2014 259 / 346
Случайное тестирование Fuzzing
Проблема валидности данных
Большинство программ ожидают структурированные входные
данные
P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791
TJcs5t9ZbxQAsLZx436PdJcxk3vq61192
vs
3.1415926535897932384626433832797
[(1,0,0),(0,1,0),(0,0,1),(1,1,1)]
Марат Ахин (СПбГПУ) RT 2014 260 / 346
Случайное тестирование Generative random testing
Generative random testing
Если мы знаем структуру, то мы можем ей воспользоваться
Генерируем отдельные элементы
Комбинируем их в соответствии с заданной структурой
Вносим случайные нарушения структуры
Марат Ахин (СПбГПУ) RT 2014 261 / 346
Случайное тестирование Generative random testing
Generative random testing
Что такое структура?
Набор правил генерации
Грамматика
Формальная спецификация
Стандарт на формат входных файлов
Марат Ахин (СПбГПУ) RT 2014 262 / 346
Случайное тестирование Generative random testing
Generative random testing
kd-tree
stoi
PDF reader
Работает для структурированных входных данных
Но есть одно «но»... c
Марат Ахин (СПбГПУ) RT 2014 263 / 346
Случайное тестирование Generative random testing
Проблема сложной структуры
Иногда структура входных данных является слишком сложной
Марат Ахин (СПбГПУ) RT 2014 264 / 346
Случайное тестирование Mutation random testing
Mutation random testing
Обычно у нас есть какой-то набор тестовых входных данных
Подвергаем тестовые данные мутации
При этом возможно использование знания структуры данных
Часть данных может генерироваться случайно
Марат Ахин (СПбГПУ) RT 2014 265 / 346
Случайное тестирование Mutation random testing
Mutation random testing
Какие могут быть мутационные трансформации?
Добавление нового фрагмента
Удаление старого фрагмента
Изменение фрагмента
Обмен двух фрагментов местами
Замена значений на граничные
Марат Ахин (СПбГПУ) RT 2014 266 / 346
Случайное тестирование Mutation random testing
Mutation random testing
PDF reader
Web browser
Работает практически для всего
Но есть одно «но»... c
Марат Ахин (СПбГПУ) RT 2014 267 / 346
Случайное тестирование Mutation random testing
Проблема скелета в шкафу
Добраться до самых дальних закоулков нельзя
Марат Ахин (СПбГПУ) RT 2014 268 / 346
Случайное тестирование Directed random testing
Directed random testing
В чем заключаются основные проблемы случайного тестирования?
Некорректные тесты
Эквивалентные тесты
Длинные тесты
Марат Ахин (СПбГПУ) RT 2014 269 / 346
Случайное тестирование Directed random testing
Directed random testing
Марат Ахин (СПбГПУ) RT 2014 270 / 346
Случайное тестирование Directed random testing
Directed random testing
Некорректные тесты
Более строгие правила генерации/мутации
Явный учет некорректных тестов
Марат Ахин (СПбГПУ) RT 2014 271 / 346
Случайное тестирование Directed random testing
Directed random testing
Эквивалентные тесты
Обнаружение тестов, на которых программа ведет себя
одинаковым образом
Статически
Динамически
Вспомним про тестовое покрытие...
Марат Ахин (СПбГПУ) RT 2014 272 / 346
Случайное тестирование Directed random testing
Directed random testing
Длинные тесты
Минимизация тестов
Дихотомия
Стохастический поиск
Эволюционные алгоритмы
Delta debugging
Марат Ахин (СПбГПУ) RT 2014 273 / 346
Случайное тестирование Directed random testing
Directed random testing
А можно ли еще лучше?
Каждый новый тест минимально отличается от имеющихся
Каждый новый тест улучшает тестовое покрытие
Каждый новый тест должен генерироваться достаточно быстро
Марат Ахин (СПбГПУ) RT 2014 274 / 346
Случайное тестирование Directed random testing
Concolic testing
Concolic testing
Комбинируем информацию о конкретных выполнениях
программы...
...и информацию о символическом поведении программы
Комбинация статического и динамического анализов
Марат Ахин (СПбГПУ) RT 2014 275 / 346
Случайное тестирование 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
Случайное тестирование 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
Случайное тестирование Directed random testing
Проблемы concolic testing
Почему я слышу об этом впервые в жизни?
Это сложно
Это очень сложно
Это очень-очень сложно
Марат Ахин (СПбГПУ) RT 2014 278 / 346
Случайное тестирование Directed random testing
Проблемы concolic testing
Инструментирование программы
Моделирование памяти
Взрыв пространства состояний
Оптимизации!
Марат Ахин (СПбГПУ) RT 2014 279 / 346
Случайное тестирование Directed random testing
Concolic testing
SAGE
Microsoft Research
500+ машино-лет
Более трети всех багов в различных проектах Microsoft
Развивается вместе с тестируемым им ПО
Марат Ахин (СПбГПУ) RT 2014 280 / 346
Случайное тестирование Directed random testing
Directed random testing
Visual Studio
Microsoft Office
Работает для всего
Но есть одно «но»... c
Марат Ахин (СПбГПУ) RT 2014 281 / 346
Случайное тестирование Directed random testing
Проблема мистера Икс
Некоторые части системы могут быть «черным ящиком»
Марат Ахин (СПбГПУ) RT 2014 282 / 346
W.I.L.T. What I Learned Today?
W.I.L.T.
Марат Ахин (СПбГПУ) RT 2014 283 / 346

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

  • 1.
    Случайное тестирование Software Testing101 Марат Ахин Санкт-Петербургский государственный политехнический университет 2014 Марат Ахин (СПбГПУ) RT 2014 245 / 346
  • 2.
  • 3.
  • 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
  • 7.
    Случайное тестирование Генерациятестов Генерация тестов Автоматическая генерация компонентов тестов Входные данные Последовательности вызовов API Тестовые оракулы Марат Ахин (СПбГПУ) RT 2014 251 / 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
  • 13.
  • 14.
    Случайное тестирование Fuzzing Fuzzing md5sum kd-tree stoi PDFreader Работает для всех программ Но есть одно «но»... c Марат Ахин (СПбГПУ) RT 2014 258 / 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.
    Случайное тестирование Generativerandom testing Generative random testing Если мы знаем структуру, то мы можем ей воспользоваться Генерируем отдельные элементы Комбинируем их в соответствии с заданной структурой Вносим случайные нарушения структуры Марат Ахин (СПбГПУ) RT 2014 261 / 346
  • 18.
    Случайное тестирование Generativerandom testing Generative random testing Что такое структура? Набор правил генерации Грамматика Формальная спецификация Стандарт на формат входных файлов Марат Ахин (СПбГПУ) RT 2014 262 / 346
  • 19.
    Случайное тестирование Generativerandom testing Generative random testing kd-tree stoi PDF reader Работает для структурированных входных данных Но есть одно «но»... c Марат Ахин (СПбГПУ) RT 2014 263 / 346
  • 20.
    Случайное тестирование Generativerandom testing Проблема сложной структуры Иногда структура входных данных является слишком сложной Марат Ахин (СПбГПУ) RT 2014 264 / 346
  • 21.
    Случайное тестирование Mutationrandom testing Mutation random testing Обычно у нас есть какой-то набор тестовых входных данных Подвергаем тестовые данные мутации При этом возможно использование знания структуры данных Часть данных может генерироваться случайно Марат Ахин (СПбГПУ) RT 2014 265 / 346
  • 22.
    Случайное тестирование Mutationrandom testing Mutation random testing Какие могут быть мутационные трансформации? Добавление нового фрагмента Удаление старого фрагмента Изменение фрагмента Обмен двух фрагментов местами Замена значений на граничные Марат Ахин (СПбГПУ) RT 2014 266 / 346
  • 23.
    Случайное тестирование Mutationrandom testing Mutation random testing PDF reader Web browser Работает практически для всего Но есть одно «но»... c Марат Ахин (СПбГПУ) RT 2014 267 / 346
  • 24.
    Случайное тестирование Mutationrandom testing Проблема скелета в шкафу Добраться до самых дальних закоулков нельзя Марат Ахин (СПбГПУ) RT 2014 268 / 346
  • 25.
    Случайное тестирование Directedrandom testing Directed random testing В чем заключаются основные проблемы случайного тестирования? Некорректные тесты Эквивалентные тесты Длинные тесты Марат Ахин (СПбГПУ) RT 2014 269 / 346
  • 26.
    Случайное тестирование Directedrandom testing Directed random testing Марат Ахин (СПбГПУ) RT 2014 270 / 346
  • 27.
    Случайное тестирование Directedrandom testing Directed random testing Некорректные тесты Более строгие правила генерации/мутации Явный учет некорректных тестов Марат Ахин (СПбГПУ) RT 2014 271 / 346
  • 28.
    Случайное тестирование Directedrandom testing Directed random testing Эквивалентные тесты Обнаружение тестов, на которых программа ведет себя одинаковым образом Статически Динамически Вспомним про тестовое покрытие... Марат Ахин (СПбГПУ) RT 2014 272 / 346
  • 29.
    Случайное тестирование Directedrandom testing Directed random testing Длинные тесты Минимизация тестов Дихотомия Стохастический поиск Эволюционные алгоритмы Delta debugging Марат Ахин (СПбГПУ) RT 2014 273 / 346
  • 30.
    Случайное тестирование Directedrandom testing Directed random testing А можно ли еще лучше? Каждый новый тест минимально отличается от имеющихся Каждый новый тест улучшает тестовое покрытие Каждый новый тест должен генерироваться достаточно быстро Марат Ахин (СПбГПУ) RT 2014 274 / 346
  • 31.
    Случайное тестирование Directedrandom testing Concolic testing Concolic testing Комбинируем информацию о конкретных выполнениях программы... ...и информацию о символическом поведении программы Комбинация статического и динамического анализов Марат Ахин (СПбГПУ) RT 2014 275 / 346
  • 32.
    Случайное тестирование Directedrandom 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.
    Случайное тестирование Directedrandom 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.
    Случайное тестирование Directedrandom testing Проблемы concolic testing Почему я слышу об этом впервые в жизни? Это сложно Это очень сложно Это очень-очень сложно Марат Ахин (СПбГПУ) RT 2014 278 / 346
  • 35.
    Случайное тестирование Directedrandom testing Проблемы concolic testing Инструментирование программы Моделирование памяти Взрыв пространства состояний Оптимизации! Марат Ахин (СПбГПУ) RT 2014 279 / 346
  • 36.
    Случайное тестирование Directedrandom testing Concolic testing SAGE Microsoft Research 500+ машино-лет Более трети всех багов в различных проектах Microsoft Развивается вместе с тестируемым им ПО Марат Ахин (СПбГПУ) RT 2014 280 / 346
  • 37.
    Случайное тестирование Directedrandom testing Directed random testing Visual Studio Microsoft Office Работает для всего Но есть одно «но»... c Марат Ахин (СПбГПУ) RT 2014 281 / 346
  • 38.
    Случайное тестирование Directedrandom testing Проблема мистера Икс Некоторые части системы могут быть «черным ящиком» Марат Ахин (СПбГПУ) RT 2014 282 / 346
  • 39.
    W.I.L.T. What ILearned Today? W.I.L.T. Марат Ахин (СПбГПУ) RT 2014 283 / 346