9. Анти-паттерн
Лодырь
• Пустозвон
• Активный
• Случайный
//тестируем метод String.lastIndexOf()
int expected = 12;
String target = "I watch the watchers";
String lookFor = "watcher";
int actual = target.indexOf(lookFor);
assertTrue(expected == actual);
Тест не вызывает
тестируемый
метод, вообще
ничего не делая,
делая что-то или
вызывая другой
метод
10. Анти-паттерн
Правдолюб
• Всегда «да»
• Никогда «нет»
int expected = 5;
int actual = 2 + 2;
if(expected == actual){
assertTrue("Passed", true); }
else{
assertFalse("Failed!", false); }
Тест или всегда
говорит, что
прошел или не
может сказать что
упал
11. Анти-паттерн
Невыполнимый
• Недостижимое условие
• Неверный 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.
12. Анти-паттерн
Оборотень (vice versa)
//код теста
boolean expected = true; //must be false
boolean actual = Target.isNotNull(null);
assertEquals(expected, actual);
//код программы
boolean isNotNull(Object obj){
//must be !=
return (obj == null);
} Тест проходит,
когда должен
упасть и падает,
когда должен
пройти.
Возможен только
при наличии
дефекта в коде
программы!
15. Идея
Запуская тест против программы,Запуская тест против программы,
заведомо работающей неправильно,заведомо работающей неправильно,
мы в праве ожидать, что тест долженмы в праве ожидать, что тест должен
упастьупасть
16. Реализация
Давайте сделаем так, чтобыДавайте сделаем так, чтобы
тестируемая программа работалатестируемая программа работала
неправильно!неправильно!
17. Возможные вопросы
• Если каждый метод работает неправильно, как
это вообще работает?
• Как провести подготовительную стадию (setup)
теста, если все работает неправильно?
• Это очень дорого иметь две версии программы –
хорошую и плохую
• Как определить некорректное поведение
конкретного метода?
18. А вот так!
Stringstaticfinal
<T>Object
public int throws
1.Два режима работы
Оригинальный
Неправильный
5.Базируется на сигнатуре
3.Ломается по сигналу
2.Тест знает 'свой'
метод
Метод кода
Метод
кода
4.Сигнал посылается
перед запуском теста
?
21. Пример кода
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);
}
22. Пример кода
Зараженный метод
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;
}
}
24. Достоинства
Языко-
независим
Не зависит ни от
логики теста ни
от логики метода
Не требует
и
не вносит
изменения
в тесты
Универсален
Реализация зависит
от Test Framework
Не требует
наличия
какого-то
API
Автоматизированный подход
Применим к
исходному и
бинарному
коду