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

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

Jul 23, 2015

Download

Documents

SQALab
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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