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

39
Случайное тестирование Software Testing 101 Марат Ахин Санкт-Петербургский государственный политехнический университет 2014 Марат Ахин (СПбГПУ) RT 2014 245 / 346

description

 

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

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

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

Марат Ахин

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

2014

Марат Ахин (СПбГПУ) RT 2014 245 / 346

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

Quiz

Марат Ахин (СПбГПУ) RT 2014 246 / 346

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

Recap

Марат Ахин (СПбГПУ) RT 2014 247 / 346

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

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

Содержание

1 Случайное тестированиеГенерация тестовFuzzingGenerative random testingMutation random testingDirected random testing

Марат Ахин (СПбГПУ) RT 2014 248 / 346

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

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

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

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

Марат Ахин (СПбГПУ) RT 2014 249 / 346

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

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

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

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

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

Марат Ахин (СПбГПУ) RT 2014 250 / 346

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

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

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

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

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

Марат Ахин (СПбГПУ) RT 2014 251 / 346

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

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

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

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

kd-treestoimd5sumPDF reader

Марат Ахин (СПбГПУ) RT 2014 252 / 346

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

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

Fuzzing

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

Полностью случайные данныеВариант smoke testing

P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791TJcs5t9ZbxQAsLZx436PdJcxk3vq61192

Марат Ахин (СПбГПУ) RT 2014 253 / 346

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

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

Fuzzing

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

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

Марат Ахин (СПбГПУ) RT 2014 254 / 346

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

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

Fuzzing

1989 – первое применение фаззинга на утилитах *NIX1995 – повторная проверка утилит *NIX2000 – проверка Windows NT/Windows 20002006 – проверка утилит Mac OS X

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

Марат Ахин (СПбГПУ) RT 2014 255 / 346

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

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

Fuzzing

Нет!

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

GUI: 26% -> 45% -> 64% -> 73%Многие баги, обнаруженные фаззингом, были исправлены......но появилось еще больше новых!

Марат Ахин (СПбГПУ) RT 2014 256 / 346

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

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

Fuzzing

Марат Ахин (СПбГПУ) RT 2014 257 / 346

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

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

Fuzzing

md5sumkd-treestoiPDF reader

Работает для всех программНо есть одно «но»... c©

Марат Ахин (СПбГПУ) RT 2014 258 / 346

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

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

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

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

Марат Ахин (СПбГПУ) RT 2014 259 / 346

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

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

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

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

P8FT8PjBG7s71Bw1a8EP4svDPL5g4E791TJcs5t9ZbxQAsLZx436PdJcxk3vq61192

vs3.1415926535897932384626433832797[(1,0,0),(0,1,0),(0,0,1),(1,1,1)]

Марат Ахин (СПбГПУ) RT 2014 260 / 346

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

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

Generative random testing

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

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

Марат Ахин (СПбГПУ) RT 2014 261 / 346

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

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

Generative random testing

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

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

Марат Ахин (СПбГПУ) RT 2014 262 / 346

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

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

Generative random testing

kd-treestoiPDF reader

Работает для структурированных входных данныхНо есть одно «но»... c©

Марат Ахин (СПбГПУ) RT 2014 263 / 346

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

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

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

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

Марат Ахин (СПбГПУ) RT 2014 264 / 346

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

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

Mutation random testing

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

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

Марат Ахин (СПбГПУ) RT 2014 265 / 346

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

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

Mutation random testing

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

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

Обмен двух фрагментов местамиЗамена значений на граничные

Марат Ахин (СПбГПУ) RT 2014 266 / 346

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

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

Mutation random testing

PDF readerWeb browser

Работает практически для всегоНо есть одно «но»... c©

Марат Ахин (СПбГПУ) RT 2014 267 / 346

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

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

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

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

Марат Ахин (СПбГПУ) RT 2014 268 / 346

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

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

Directed random testing

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

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

Марат Ахин (СПбГПУ) RT 2014 269 / 346

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

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

Directed random testing

Марат Ахин (СПбГПУ) RT 2014 270 / 346

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

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

Directed random testing

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

Более строгие правила генерации/мутацииЯвный учет некорректных тестов

Марат Ахин (СПбГПУ) RT 2014 271 / 346

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

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

Directed random testing

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

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

СтатическиДинамически

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

Марат Ахин (СПбГПУ) RT 2014 272 / 346

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

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

Directed random testing

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

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

Delta debugging

Марат Ахин (СПбГПУ) RT 2014 273 / 346

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

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

Directed random testing

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

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

Марат Ахин (СПбГПУ) RT 2014 274 / 346

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

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

Concolic testing

Concolic testing

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

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

Марат Ахин (СПбГПУ) RT 2014 275 / 346

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

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

Satisfiability modulo theories

1 void f(int x) {2 int y = x^2;34 bool A = x > 0;5 bool B = x < 10;6 bool C = y > 20;78 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’)34 s = Solver ()56 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

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

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

Satisfiability modulo theories

1 print s.check(B and C, A)2 print s.model ()3 # sat4 # [A = True , B = True , y = 25, x = 5, C = True]56 print s.check(B and C, Not(A))7 print s.model ()8 # sat9 # [A = False , B = True , y = 25, x = -5, C = True]

1011 print s.check(Not(B and C))12 print s.model ()13 # sat14 # [A = False , B = True , y = 0, x = 0, C = False]

Марат Ахин (СПбГПУ) RT 2014 277 / 346

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

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

Проблемы concolic testing

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

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

Марат Ахин (СПбГПУ) RT 2014 278 / 346

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

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

Проблемы concolic testing

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

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

Марат Ахин (СПбГПУ) RT 2014 279 / 346

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

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

Concolic testing

SAGE

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

Марат Ахин (СПбГПУ) RT 2014 280 / 346

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

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

Directed random testing

Visual StudioMicrosoft Office

Работает для всегоНо есть одно «но»... c©

Марат Ахин (СПбГПУ) RT 2014 281 / 346

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

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

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

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

Марат Ахин (СПбГПУ) RT 2014 282 / 346

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

W.I.L.T. What I Learned Today?

W.I.L.T.

Марат Ахин (СПбГПУ) RT 2014 283 / 346