25
Методика автоматизации поиска некорректных модульных тестов Алексей Лянгузов. Sun Microsystems, Inc.

Алексей Лянгузов

  • Upload
    sqalab

  • View
    980

  • Download
    6

Embed Size (px)

Citation preview

Page 1: Алексей Лянгузов

Методика автоматизации поиска некорректных модульных тестов

Алексей Лянгузов. Sun Microsystems, Inc.

Page 2: Алексей Лянгузов

План

• Введение

• Чужой среди своих или «Who Watches

the Watchers?»

• Знай своего врага в лицо

• Как отыскать затаившегося врага

Page 3: Алексей Лянгузов

Введение

Признать проблемуПризнать проблему

Изучить проблемуИзучить проблему

Решить проблемуРешить проблему

Page 4: Алексей Лянгузов

Далее...

• Введение

• Чужой среди своих или «Who Watches

the Watchers?»

• Знай своего врага в лицо

• Как отыскать затаившегося врага

Page 5: Алексей Лянгузов

Признаем проблему

Верны ли измерения

сделанные неисправным

инструментом?

Тесты содержат ошибки!

Page 6: Алексей Лянгузов

Плохие и хорошие тесты

1 3

2

ТестИсправен

ТестНеисправен

Программа Исправна

Программа Неисправна

Page 7: Алексей Лянгузов

А вы уверены...

... что тест найдет ошибку в коде?

... что тест не маскирует ошибку в коде?

Page 8: Алексей Лянгузов

Далее...

• Введение

• Чужой среди своих или «Who Watches

the Watchers?»

• Знай своего врага в лицо

• Как отыскать затаившегося врага

Page 9: Алексей Лянгузов

Анти-паттернЛодырь

• Пустозвон• Активный• Случайный

//тестируем метод String.lastIndexOf()int expected = 12;String target = "I watch the watchers";String lookFor = "watcher";int actual = target.indexOf(lookFor);assertTrue(expected == actual);

Тест не вызывает тестируемый метод, вообще ничего не делая, делая что-то или вызывая другой метод

Page 10: Алексей Лянгузов

Анти-паттернПравдолюб

• Всегда «да»• Никогда «нет»

int expected = 5;int actual = 2 + 2;if(expected == actual){ assertTrue("Passed", true); }else{ assertFalse("Failed!", false); }

Тест или всегда говорит, что прошел или не может сказать что упал

Page 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.

Page 12: Алексей Лянгузов

Анти-паттернОборотень (vice versa)

//код тестаboolean expected = true; //must be falseboolean actual = Target.isNotNull(null);assertEquals(expected, actual);

//код программыboolean isNotNull(Object obj){ //must be != return (obj == null); } Тест проходит,

когда должен упасть и падает, когда должен пройти.Возможен только при наличии дефекта в коде программы!

Page 13: Алексей Лянгузов

Далее...

• Введение

• Чужой среди своих или «Who Watches

the Watchers?»

• Знай своего врага в лицо

• Как отыскать затаившегося врага

Page 14: Алексей Лянгузов

Существующие методы

• Инспекция кода тестов

• Автоматические методы

– Статическая проверка покрытия

– Динамическая проверка покрытия

– Аудит кода тестов

– Запуск тестов

Page 15: Алексей Лянгузов

Идея

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

упастьупасть

Page 16: Алексей Лянгузов

Реализация

Давайте сделаем так, чтобы Давайте сделаем так, чтобы тестируемая программа работала тестируемая программа работала

неправильно!неправильно!

Page 17: Алексей Лянгузов

Возможные вопросы

• Если каждый метод работает неправильно, как это вообще работает?

• Как провести подготовительную стадию (setup) теста, если все работает неправильно?

• Это очень дорого иметь две версии программы – хорошую и плохую

• Как определить некорректное поведение конкретного метода?

Page 18: Алексей Лянгузов

А вот так!

Stringstaticfinal

<T>Object

public int throws

1.Два режима работы

Оригинальный

Неправильный

5.Базируется на сигнатуре

3.Ломается по сигналу

2.Тест знает 'свой' метод

Метод кода

Методкода

4.Сигнал посылается перед запуском теста

?

Page 19: Алексей Лянгузов

Компоненты

CodeInfecter

Tests

BrokenCode

Emulator

PatchedTest

Framework

Test-to-CodeMap

SoftwareProduct

InfectedSoftwareProduct

Page 20: Алексей Лянгузов

Процесс

Создатьmap

Заразитькод

ПрохачитьTest

Framework Запуститьтесты

Page 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);}

Page 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; }}

Page 23: Алексей Лянгузов

Недостатки и ограничения

Необходимость

«подправить»

Test Framework

Применим в основном только к unit тестам

Время прогонатестовувеличивается

Подразумеваетсявозможностьопределить какойметод будеттестироваться

Page 24: Алексей Лянгузов

Достоинства

Языко- независим

Не зависит ни отлогики теста ниот логики метода

Не требует и

не вноситизменения

в тесты

Универсален

Реализация зависит

от Test Framework Не требуетналичиякакого-то

API

Автоматизированный подход

Применим к исходному и

бинарномукоду

Page 25: Алексей Лянгузов

Вопросы

Q&A

Alexey LyanguzovSun Microsystems, Inc.Patent pending