Upload
sqalab
View
980
Download
6
Embed Size (px)
Citation preview
Методика автоматизации поиска некорректных модульных тестов
Алексей Лянгузов. Sun Microsystems, Inc.
План
• Введение
• Чужой среди своих или «Who Watches
the Watchers?»
• Знай своего врага в лицо
• Как отыскать затаившегося врага
Введение
Признать проблемуПризнать проблему
Изучить проблемуИзучить проблему
Решить проблемуРешить проблему
Далее...
• Введение
• Чужой среди своих или «Who Watches
the Watchers?»
• Знай своего врага в лицо
• Как отыскать затаившегося врага
Признаем проблему
Верны ли измерения
сделанные неисправным
инструментом?
Тесты содержат ошибки!
Плохие и хорошие тесты
1 3
2
4а
4б
ТестИсправен
ТестНеисправен
Программа Исправна
Программа Неисправна
А вы уверены...
... что тест найдет ошибку в коде?
... что тест не маскирует ошибку в коде?
Далее...
• Введение
• Чужой среди своих или «Who Watches
the Watchers?»
• Знай своего врага в лицо
• Как отыскать затаившегося врага
Анти-паттернЛодырь
• Пустозвон• Активный• Случайный
//тестируем метод String.lastIndexOf()int expected = 12;String target = "I watch the watchers";String lookFor = "watcher";int actual = target.indexOf(lookFor);assertTrue(expected == actual);
Тест не вызывает тестируемый метод, вообще ничего не делая, делая что-то или вызывая другой метод
Анти-паттернПравдолюб
• Всегда «да»• Никогда «нет»
int expected = 5;int actual = 2 + 2;if(expected == actual){ assertTrue("Passed", true); }else{ assertFalse("Failed!", false); }
Тест или всегда говорит, что прошел или не может сказать что упал
Анти-паттернНевыполнимый
• Недостижимое условие• Неверный Setup
// must be "os.name"String os = System.getProperty("os_name");if("Windows XP".equals(os)){ //do something assertTrue(false);} else { System.out.println(“Not applicable”); }
Тест не может начаться из-за неверного условия или невыполнимой стадии setup.
Анти-паттернОборотень (vice versa)
//код тестаboolean expected = true; //must be falseboolean actual = Target.isNotNull(null);assertEquals(expected, actual);
//код программыboolean isNotNull(Object obj){ //must be != return (obj == null); } Тест проходит,
когда должен упасть и падает, когда должен пройти.Возможен только при наличии дефекта в коде программы!
Далее...
• Введение
• Чужой среди своих или «Who Watches
the Watchers?»
• Знай своего врага в лицо
• Как отыскать затаившегося врага
Существующие методы
• Инспекция кода тестов
• Автоматические методы
– Статическая проверка покрытия
– Динамическая проверка покрытия
– Аудит кода тестов
– Запуск тестов
Идея
Запуская тест против программы, Запуская тест против программы, заведомо работающей неправильно, заведомо работающей неправильно, мы в праве ожидать, что тест должен мы в праве ожидать, что тест должен
упастьупасть
Реализация
Давайте сделаем так, чтобы Давайте сделаем так, чтобы тестируемая программа работала тестируемая программа работала
неправильно!неправильно!
Возможные вопросы
• Если каждый метод работает неправильно, как это вообще работает?
• Как провести подготовительную стадию (setup) теста, если все работает неправильно?
• Это очень дорого иметь две версии программы – хорошую и плохую
• Как определить некорректное поведение конкретного метода?
А вот так!
Stringstaticfinal
<T>Object
public int throws
1.Два режима работы
Оригинальный
Неправильный
5.Базируется на сигнатуре
3.Ломается по сигналу
2.Тест знает 'свой' метод
Метод кода
Методкода
4.Сигнал посылается перед запуском теста
?
Компоненты
CodeInfecter
Tests
BrokenCode
Emulator
PatchedTest
Framework
Test-to-CodeMap
SoftwareProduct
InfectedSoftwareProduct
Процесс
Создатьmap
Заразитькод
ПрохачитьTest
Framework Запуститьтесты
Пример кодаPatched Test Framework
public void runTest(Test test){ String testName = test.getName(); Resulter.setTestName(testName); Status status = test.run(); BCE.infect(test, status); while(BCE.hasNextEmulation()){ status = test.run(); BCE.remember(status); } status=BCE.disinfect(); Resulter.setStatus(status);}
Пример кодаЗараженный метод
package pack1;public class Class1{ public method int meth1(){ if(BCE.isInfected("pack1.Class1.meth1()")){ return BCE.emulateIntMethod(); } int result = 0; //method body return result; }}
Недостатки и ограничения
Необходимость
«подправить»
Test Framework
Применим в основном только к unit тестам
Время прогонатестовувеличивается
Подразумеваетсявозможностьопределить какойметод будеттестироваться
Достоинства
Языко- независим
Не зависит ни отлогики теста ниот логики метода
Не требует и
не вноситизменения
в тесты
Универсален
Реализация зависит
от Test Framework Не требуетналичиякакого-то
API
Автоматизированный подход
Применим к исходному и
бинарномукоду
Вопросы
Q&A
Alexey LyanguzovSun Microsystems, Inc.Patent pending