SlideShare a Scribd company logo
1 of 49
Download to read offline
ТЕСТИРУЕМ
ТЕСТЫ
С PIT
15 сентября 2016
Кто я?
Евгений Барановский
Я здесь, потому что люблю Java,
качественный код и спокойствие.
Связаться со мной меня можно
через judzin.baranovsky@gmail.com.
План выступления
▷Текущие ограничения тестов
▷Мутационное тестирование
▷Мутационное тестирование с PIT
▷Проблемы мутационного
тестирования
▷Будет много кода 
РАССМОТРИМ ПРИМЕР
Нет ничего лучше примера
public class TimeLine {
private int fetchCount;
public TimeLine(int fetchCount) {
setFetchCount(fetchCount);
}
public void setFetchCount(int fetchCount) {
if (fetchCount <= 0) {
throw new IllegalArgumentException("Count must be > 0");
}
this.fetchCount = fetchCount;
}
public int getFetchCount() {
return fetchCount;
}
// Some service logic, omitted for simplicity......
}
public class TimeLineTest {
private TimeLine timeLine;
@BeforeMethod
protected void setUp() {
timeLine = new TimeLine(10);
}
@Test
public void shouldUpdateFetchCount() {
int expected = 5;
timeLine.setFetchCount(expected);
assertEquals(timeLine.getFetchCount(), expected);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void shouldNotAllowNegativeFetchCount() {
timeLine.setFetchCount(-10);
}
}
Что же не так с
традиционным
тестированием?
Уберем вызов
▷Успешно прошедшие тесты не
всегда правы.
▷Существует много критериев
покрытия кода.
▷И даже эти критерии могут быть
неточными.
Текущие ограничения
Это искусственный баг. Если набор тестов не
в состоянии обнаружить мутацию, то он
рассматривается как недостаточный.
Мутация
Мутант – это система с мутациями.
Мутант
в 1970х
Причины низкой популярности:
– недостаток технологий и
– недостаток вычислительных мощностей.
Мутационное тестирование
было разработано еще
Итак, как работает
мутационное тестирование?
1. Написать тест
2. Выбрать мутации
3. Получить мутантов
4. Прогнать тесты на мутантах
5. Пересмотреть тесты
6. Прогнать тесты снова
Итак, как работает
мутационное тестирование?
2. Выбрать мутации
3. Получить мутантов
4. Прогнать тесты на мутантах
5. Пересмотреть тесты
6. Прогнать тесты снова
1. Написать тест
1. Для знакомого класса ...
public class TimeLine {
private int fetchCount;
public TimeLine(int fetchCount) {
setFetchCount(fetchCount);
}
public void setFetchCount(int fetchCount) {
if (fetchCount <= 0) {
throw new IllegalArgumentException("Count must be > 0");
}
this.fetchCount = fetchCount;
}
public int getFetchCount() {
return fetchCount;
}
// Some service logic
}
... напишем такой тест
@BeforeMethod
protected void setUp() {
timeLine = new TimeLine(10);
}
@Test
public void shouldUpdateFetchCount() {
int expected = 5;
timeLine.setFetchCount(expected);
assertEquals(timeLine.getFetchCount(), expected);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void shouldNotAllowNegativeFetchCount() {
timeLine.setFetchCount(-10);
}
Итак, как работает
мутационное тестирование?
1. Написать тест
3. Получить мутантов
4. Прогнать тесты на мутантах
5. Пересмотреть тесты
6. Прогнать тесты снова
2. Выбрать мутации
2. Выбрать мутации для кода
public class TimeLine {
private int fetchCount;
public TimeLine(int fetchCount) {
setFetchCount(fetchCount);
}
public void setFetchCount(int fetchCount) {
if (fetchCount <= 0) {
throw new IllegalArgumentException("Count must be > 0");
}
this.fetchCount = fetchCount;
}
public int getFetchCount() {
return fetchCount;
}
// Some service logic
}
Можно удалить вызов
Можно инвертировать
условие
Можно изменить границу
условия
Итак, как работает
мутационное тестирование?
1. Написать тест
2. Выбрать мутации
4. Прогнать тесты на мутантах
5. Пересмотреть тесты
6. Прогнать тесты снова
3. Получить мутантов
3. Получить мутантов системы
public class TimeLine {
private int fetchCount;
public TimeLine(int fetchCount) {
setFetchCount(fetchCount);
}
public void setFetchCount(int fetchCount) {
if (fetchCount <= 0) {
throw new IllegalArgumentException("Count must be > 0");
}
this.fetchCount = fetchCount;
}
public int getFetchCount() {
return fetchCount;
}
// Some service logic
}
public TimeLine(int fetchCount) {
}
3. Получить мутантов системы
public class TimeLine {
private int fetchCount;
public TimeLine(int fetchCount) {
setFetchCount(fetchCount);
}
public void setFetchCount(int fetchCount) {
if (fetchCount <= 0) {
throw new IllegalArgumentException("Count must be > 0");
}
this.fetchCount = fetchCount;
}
public int getFetchCount() {
return fetchCount;
}
// Some service logic
}
if (fetchCount < 0) {
if (fetchCount > 0) {
Итак, как работает
мутационное тестирование?
1. Написать тест
2. Выбрать мутации
3. Получить мутантов
5. Пересмотреть тесты
6. Прогнать тесты снова
4. Прогнать тесты на мутантах
4. Прогнать тесты на мутантах
Не покрыто... Как так-то?
Итак, как работает
мутационное тестирование?
1. Написать тест
2. Выбрать мутации
3. Получить мутантов
4. Прогнать тесты на мутантах
6. Прогнать тесты снова
5. Пересмотреть тесты
5. Пересмотреть тесты
@BeforeMethod
protected void setUp() {
timeLine = new TimeLine(10);
}
@Test
public void shouldSetTheConstructorFetchValue() {
assertEquals(timeLine.getFetchCount(), 10);
}
@Test
public void shouldUpdateFetchCount() {
int expected = 5;
timeLine.setFetchCount(expected);
assertEquals(timeLine.getFetchCount(), expected);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void shouldNotAllowNegativeFetchCount() {
timeLine.setFetchCount(-10);
}
Итак, как работает
мутационное тестирование?
1. Написать тест
2. Выбрать мутации
3. Получить мутантов
4. Прогнать тесты на мутантах
5. Пересмотреть тесты
6. Прогнать тесты снова
6. Прогнать тесты снова
Мутационное тестирование
1. Написать тест
Просто пишем обычные тесты
безо всяких предположений о
том, что будет дальше.
2. Выбрать мутации
Код автоматически
анализируется и к нему
подбираются мутации.
3. Получить мутантов
Звучит зловеще, но это тоже
происходит автоматически.
4. Прогнать тесты на
мутантах
Никаких дополнительных
действий от программиста тут
не требуется – не зря же мы
писали тесты на самом первом
шаге.
5. Пересмотреть тесты
Если мы получили ошибки,
либо имеющиеся тесты, либо
настройки мутаций надо
пересмотреть.
6. Прогнать тесты снова
Запустить мутационное
тестирование снова, но уже с
исправленными
тестами/конфигурацией.
ИНСТРУМЕНТЫ
Почему PIT?
Jester
Nester
Pester
PIT
БАЙТ-КОД
– Работает напрямую с байт-кодом.
ДОКУМЕНТАЦИЯ
– Хорошая документация + открытый код.
– http://www.pitest.org + GitHub
ПРОСТОТА
– Подсчитывает обычное покрытие строк.
– Поддерживает различные оптимизации.
PIT
PIT – Пример отчета
PIT – Пример отчета
PIT – Пример отчета
PIT – Пример отчета
PIT – Пример отчета
▷Стабильные:
– простые,
– но эффективные.
▷Нестабильные:
– мощные,
– но чреваты ошибками.
PIT – Виды мутаций
▷Изменение граничных условий
PIT – Стабильные мутации
if (a < b) {// if (a <= b)
// do something
}
▷Изменение граничных условий
▷Инверсия условий
PIT – Стабильные мутации
if (a == b) {// if (a != b)
// do something
}
▷Изменение граничных условий
▷Инверсия условий
▷Инверсия операторов
PIT – Стабильные мутации
if (a >>> b) {// if (a << b)
// do something
}
▷Удаление условий
PIT – Нестабильные мутации
if (a == b) {// if (true)
// do something
}
▷Удаление условий
▷Удаление вызова конструктора
PIT – Нестабильные мутации
public int foo() {
// Object o = null;
Object o = new Object();
return o;
}
▷Maven
▷Gradle
▷SonarQube
PIT – Интеграция со сборкой
▷Правильно настраивать плагины
сборки.
▷Избегать сгенерированных
классов (например, JAXB).
▷Избегать конфликтов со
смежными инструментами
(например, Clover, Cobertura).
С PIT нужно:
▷Может занимать много времени
▷Сложней реализовать
▷Трудно применить к тестам
уровнем выше интеграционных
Проблемы мутационного
тестирования
Спасибо за внимание!
Вопросы?

More Related Content

What's hot

OpenMP и статический анализ кода
OpenMP и статический анализ кодаOpenMP и статический анализ кода
OpenMP и статический анализ кодаTatyanazaxarova
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)Ontico
 
20100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture0820100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture08Computer Science Club
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2Technopark
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work» Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work» LogeekNightUkraine
 
Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Fwdays
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04Computer Science Club
 
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Tatyanazaxarova
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
Белым по черному или альтернативное использование unit-тестирования
Белым по черному или альтернативное использование unit-тестированияБелым по черному или альтернативное использование unit-тестирования
Белым по черному или альтернативное использование unit-тестированияSQALab
 

What's hot (20)

OpenMP и статический анализ кода
OpenMP и статический анализ кодаOpenMP и статический анализ кода
OpenMP и статический анализ кода
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
 
20100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture0820100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture08
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Groovy
GroovyGroovy
Groovy
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work» Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
 
Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04
 
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Белым по черному или альтернативное использование unit-тестирования
Белым по черному или альтернативное использование unit-тестированияБелым по черному или альтернативное использование unit-тестирования
Белым по черному или альтернативное использование unit-тестирования
 

Viewers also liked

Разработка в долг
Разработка в долгРазработка в долг
Разработка в долгVitebsk Miniq
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!Vitebsk Miniq
 
Оптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноОптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноVitebsk DSC
 
Соревнования по программированию
Соревнования по программированиюСоревнования по программированию
Соревнования по программированиюVitebsk Miniq
 
Blockchain: is just buzzword?
Blockchain: is just buzzword?Blockchain: is just buzzword?
Blockchain: is just buzzword?Vitebsk Miniq
 
Собираем будильник правильно
Собираем будильник правильноСобираем будильник правильно
Собираем будильник правильноVitebsk Miniq
 
Виртуализация
ВиртуализацияВиртуализация
ВиртуализацияVitebsk Miniq
 
Reactивная тяга
Reactивная тягаReactивная тяга
Reactивная тягаVitebsk Miniq
 
Строим плот - Как не утонуть в данных
Строим плот - Как не утонуть в данныхСтроим плот - Как не утонуть в данных
Строим плот - Как не утонуть в данныхVitebsk Miniq
 
Что надо знать о HTTP/2
Что надо знать о HTTP/2Что надо знать о HTTP/2
Что надо знать о HTTP/2Badoo Development
 
Классическое программирование для фронтендеров
Классическое программирование для фронтендеровКлассическое программирование для фронтендеров
Классическое программирование для фронтендеровBadoo Development
 
Как мы общаемся с пользователями на 46 языках и понимаем друг друга
Как мы общаемся с пользователями на 46 языках и понимаем друг другаКак мы общаемся с пользователями на 46 языках и понимаем друг друга
Как мы общаемся с пользователями на 46 языках и понимаем друг другаBadoo Development
 
DevCon School. Advaced Cloud Scenarios
DevCon School. Advaced Cloud ScenariosDevCon School. Advaced Cloud Scenarios
DevCon School. Advaced Cloud ScenariosStas Pavlov
 
TEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkTEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkVolker Hirsch
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareEmpowered Presentations
 

Viewers also liked (17)

Разработка в долг
Разработка в долгРазработка в долг
Разработка в долг
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!
 
Оптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноОптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильно
 
Соревнования по программированию
Соревнования по программированиюСоревнования по программированию
Соревнования по программированию
 
Blockchain: is just buzzword?
Blockchain: is just buzzword?Blockchain: is just buzzword?
Blockchain: is just buzzword?
 
Собираем будильник правильно
Собираем будильник правильноСобираем будильник правильно
Собираем будильник правильно
 
Виртуализация
ВиртуализацияВиртуализация
Виртуализация
 
Reactивная тяга
Reactивная тягаReactивная тяга
Reactивная тяга
 
Строим плот - Как не утонуть в данных
Строим плот - Как не утонуть в данныхСтроим плот - Как не утонуть в данных
Строим плот - Как не утонуть в данных
 
Что надо знать о HTTP/2
Что надо знать о HTTP/2Что надо знать о HTTP/2
Что надо знать о HTTP/2
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Классическое программирование для фронтендеров
Классическое программирование для фронтендеровКлассическое программирование для фронтендеров
Классическое программирование для фронтендеров
 
S.O.L.I.D-ый JavaScript
S.O.L.I.D-ый JavaScriptS.O.L.I.D-ый JavaScript
S.O.L.I.D-ый JavaScript
 
Как мы общаемся с пользователями на 46 языках и понимаем друг друга
Как мы общаемся с пользователями на 46 языках и понимаем друг другаКак мы общаемся с пользователями на 46 языках и понимаем друг друга
Как мы общаемся с пользователями на 46 языках и понимаем друг друга
 
DevCon School. Advaced Cloud Scenarios
DevCon School. Advaced Cloud ScenariosDevCon School. Advaced Cloud Scenarios
DevCon School. Advaced Cloud Scenarios
 
TEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkTEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of Work
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
 

Similar to Тестируем тесты с PIT (мутационное тестирование)

Анастасия Бордонос - Проектирование тестов
Анастасия Бордонос - Проектирование тестовАнастасия Бордонос - Проектирование тестов
Анастасия Бордонос - Проектирование тестовYandex
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовMskDotNet Community
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysLiloSEA
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019GoQA
 
"70% of what?" or various metrics to measure code coverage
"70% of what?" or various metrics to measure code coverage"70% of what?" or various metrics to measure code coverage
"70% of what?" or various metrics to measure code coveragefazunenko
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Тестирование spring boot приложений
Тестирование spring boot приложенийТестирование spring boot приложений
Тестирование spring boot приложенийSemyonKirekov
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
Java mocking frameworks: Mockito and PowerMock
Java mocking frameworks: Mockito and PowerMockJava mocking frameworks: Mockito and PowerMock
Java mocking frameworks: Mockito and PowerMockkhayrutdinov
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализаторAndrey Karpov
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5SQALab
 

Similar to Тестируем тесты с PIT (мутационное тестирование) (20)

Анастасия Бордонос - Проектирование тестов
Анастасия Бордонос - Проектирование тестовАнастасия Бордонос - Проектирование тестов
Анастасия Бордонос - Проектирование тестов
 
10M tests per day
10M tests per day10M tests per day
10M tests per day
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDays
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
 
Seamy side of autotests
Seamy side of autotestsSeamy side of autotests
Seamy side of autotests
 
"70% of what?" or various metrics to measure code coverage
"70% of what?" or various metrics to measure code coverage"70% of what?" or various metrics to measure code coverage
"70% of what?" or various metrics to measure code coverage
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Тестирование spring boot приложений
Тестирование spring boot приложенийТестирование spring boot приложений
Тестирование spring boot приложений
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Java mocking frameworks: Mockito and PowerMock
Java mocking frameworks: Mockito and PowerMockJava mocking frameworks: Mockito and PowerMock
Java mocking frameworks: Mockito and PowerMock
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализатор
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5
 

More from Vitebsk Miniq

Runtime compilation and code execution in groovy
Runtime compilation and code execution in groovyRuntime compilation and code execution in groovy
Runtime compilation and code execution in groovyVitebsk Miniq
 
The 5 Laws of Software Estimates
The 5 Laws of Software EstimatesThe 5 Laws of Software Estimates
The 5 Laws of Software EstimatesVitebsk Miniq
 
Latest & Greatest Observability Release 7.9
Latest & Greatest Observability Release 7.9Latest & Greatest Observability Release 7.9
Latest & Greatest Observability Release 7.9Vitebsk Miniq
 
Тестирование Spring-based приложений
Тестирование Spring-based приложенийТестирование Spring-based приложений
Тестирование Spring-based приложенийVitebsk Miniq
 
Семантический поиск - что это, как работает и чем отличается от просто поиска
Семантический поиск - что это, как работает и чем отличается от просто поискаСемантический поиск - что это, как работает и чем отличается от просто поиска
Семантический поиск - что это, как работает и чем отличается от просто поискаVitebsk Miniq
 
Локализационное тестирование - это не только перевод
Локализационное тестирование - это не только переводЛокализационное тестирование - это не только перевод
Локализационное тестирование - это не только переводVitebsk Miniq
 
ISTQB Сертификация тестировщиков: быть или не быть?
ISTQB Сертификация тестировщиков: быть или не быть?ISTQB Сертификация тестировщиков: быть или не быть?
ISTQB Сертификация тестировщиков: быть или не быть?Vitebsk Miniq
 
Apollo GraphQL Federation
Apollo GraphQL FederationApollo GraphQL Federation
Apollo GraphQL FederationVitebsk Miniq
 
Who is a functional tester
Who is a functional testerWho is a functional tester
Who is a functional testerVitebsk Miniq
 
Вперед в прошлое
Вперед в прошлоеВперед в прошлое
Вперед в прошлоеVitebsk Miniq
 
CloudFormation experience
CloudFormation experienceCloudFormation experience
CloudFormation experienceVitebsk Miniq
 
Learning Intelligence: the story of mine
Learning Intelligence: the story of mineLearning Intelligence: the story of mine
Learning Intelligence: the story of mineVitebsk Miniq
 
Как программисты могут спасти мир
Как программисты могут спасти мирКак программисты могут спасти мир
Как программисты могут спасти мирVitebsk Miniq
 
Использование AzureDevOps при разработке микросервисных приложений
Использование AzureDevOps при разработке микросервисных приложенийИспользование AzureDevOps при разработке микросервисных приложений
Использование AzureDevOps при разработке микросервисных приложенийVitebsk Miniq
 
Distributed tracing system in action. Instana Tracing.
Distributed tracing system in action. Instana Tracing.Distributed tracing system in action. Instana Tracing.
Distributed tracing system in action. Instana Tracing.Vitebsk Miniq
 
Насорил - убери!
Насорил - убери!Насорил - убери!
Насорил - убери!Vitebsk Miniq
 
Styled-components. Что? Когда? И зачем?
Styled-components. Что? Когда? И зачем?Styled-components. Что? Когда? И зачем?
Styled-components. Что? Когда? И зачем?Vitebsk Miniq
 
Красные флаги и розовые очки
Красные флаги и розовые очкиКрасные флаги и розовые очки
Красные флаги и розовые очкиVitebsk Miniq
 
CSS. Практика
CSS. ПрактикаCSS. Практика
CSS. ПрактикаVitebsk Miniq
 

More from Vitebsk Miniq (20)

Runtime compilation and code execution in groovy
Runtime compilation and code execution in groovyRuntime compilation and code execution in groovy
Runtime compilation and code execution in groovy
 
The 5 Laws of Software Estimates
The 5 Laws of Software EstimatesThe 5 Laws of Software Estimates
The 5 Laws of Software Estimates
 
Latest & Greatest Observability Release 7.9
Latest & Greatest Observability Release 7.9Latest & Greatest Observability Release 7.9
Latest & Greatest Observability Release 7.9
 
Тестирование Spring-based приложений
Тестирование Spring-based приложенийТестирование Spring-based приложений
Тестирование Spring-based приложений
 
Семантический поиск - что это, как работает и чем отличается от просто поиска
Семантический поиск - что это, как работает и чем отличается от просто поискаСемантический поиск - что это, как работает и чем отличается от просто поиска
Семантический поиск - что это, как работает и чем отличается от просто поиска
 
Локализационное тестирование - это не только перевод
Локализационное тестирование - это не только переводЛокализационное тестирование - это не только перевод
Локализационное тестирование - это не только перевод
 
ISTQB Сертификация тестировщиков: быть или не быть?
ISTQB Сертификация тестировщиков: быть или не быть?ISTQB Сертификация тестировщиков: быть или не быть?
ISTQB Сертификация тестировщиков: быть или не быть?
 
Apollo GraphQL Federation
Apollo GraphQL FederationApollo GraphQL Federation
Apollo GraphQL Federation
 
Who is a functional tester
Who is a functional testerWho is a functional tester
Who is a functional tester
 
Crawling healthy
Crawling healthyCrawling healthy
Crawling healthy
 
Вперед в прошлое
Вперед в прошлоеВперед в прошлое
Вперед в прошлое
 
CloudFormation experience
CloudFormation experienceCloudFormation experience
CloudFormation experience
 
Learning Intelligence: the story of mine
Learning Intelligence: the story of mineLearning Intelligence: the story of mine
Learning Intelligence: the story of mine
 
Как программисты могут спасти мир
Как программисты могут спасти мирКак программисты могут спасти мир
Как программисты могут спасти мир
 
Использование AzureDevOps при разработке микросервисных приложений
Использование AzureDevOps при разработке микросервисных приложенийИспользование AzureDevOps при разработке микросервисных приложений
Использование AzureDevOps при разработке микросервисных приложений
 
Distributed tracing system in action. Instana Tracing.
Distributed tracing system in action. Instana Tracing.Distributed tracing system in action. Instana Tracing.
Distributed tracing system in action. Instana Tracing.
 
Насорил - убери!
Насорил - убери!Насорил - убери!
Насорил - убери!
 
Styled-components. Что? Когда? И зачем?
Styled-components. Что? Когда? И зачем?Styled-components. Что? Когда? И зачем?
Styled-components. Что? Когда? И зачем?
 
Красные флаги и розовые очки
Красные флаги и розовые очкиКрасные флаги и розовые очки
Красные флаги и розовые очки
 
CSS. Практика
CSS. ПрактикаCSS. Практика
CSS. Практика
 

Тестируем тесты с PIT (мутационное тестирование)

  • 2. Кто я? Евгений Барановский Я здесь, потому что люблю Java, качественный код и спокойствие. Связаться со мной меня можно через judzin.baranovsky@gmail.com.
  • 3. План выступления ▷Текущие ограничения тестов ▷Мутационное тестирование ▷Мутационное тестирование с PIT ▷Проблемы мутационного тестирования ▷Будет много кода 
  • 5. public class TimeLine { private int fetchCount; public TimeLine(int fetchCount) { setFetchCount(fetchCount); } public void setFetchCount(int fetchCount) { if (fetchCount <= 0) { throw new IllegalArgumentException("Count must be > 0"); } this.fetchCount = fetchCount; } public int getFetchCount() { return fetchCount; } // Some service logic, omitted for simplicity...... }
  • 6. public class TimeLineTest { private TimeLine timeLine; @BeforeMethod protected void setUp() { timeLine = new TimeLine(10); } @Test public void shouldUpdateFetchCount() { int expected = 5; timeLine.setFetchCount(expected); assertEquals(timeLine.getFetchCount(), expected); } @Test(expectedExceptions = IllegalArgumentException.class) public void shouldNotAllowNegativeFetchCount() { timeLine.setFetchCount(-10); } }
  • 7.
  • 8. Что же не так с традиционным тестированием?
  • 10. ▷Успешно прошедшие тесты не всегда правы. ▷Существует много критериев покрытия кода. ▷И даже эти критерии могут быть неточными. Текущие ограничения
  • 11. Это искусственный баг. Если набор тестов не в состоянии обнаружить мутацию, то он рассматривается как недостаточный. Мутация
  • 12. Мутант – это система с мутациями. Мутант
  • 13. в 1970х Причины низкой популярности: – недостаток технологий и – недостаток вычислительных мощностей. Мутационное тестирование было разработано еще
  • 14. Итак, как работает мутационное тестирование? 1. Написать тест 2. Выбрать мутации 3. Получить мутантов 4. Прогнать тесты на мутантах 5. Пересмотреть тесты 6. Прогнать тесты снова
  • 15. Итак, как работает мутационное тестирование? 2. Выбрать мутации 3. Получить мутантов 4. Прогнать тесты на мутантах 5. Пересмотреть тесты 6. Прогнать тесты снова 1. Написать тест
  • 16. 1. Для знакомого класса ... public class TimeLine { private int fetchCount; public TimeLine(int fetchCount) { setFetchCount(fetchCount); } public void setFetchCount(int fetchCount) { if (fetchCount <= 0) { throw new IllegalArgumentException("Count must be > 0"); } this.fetchCount = fetchCount; } public int getFetchCount() { return fetchCount; } // Some service logic }
  • 17. ... напишем такой тест @BeforeMethod protected void setUp() { timeLine = new TimeLine(10); } @Test public void shouldUpdateFetchCount() { int expected = 5; timeLine.setFetchCount(expected); assertEquals(timeLine.getFetchCount(), expected); } @Test(expectedExceptions = IllegalArgumentException.class) public void shouldNotAllowNegativeFetchCount() { timeLine.setFetchCount(-10); }
  • 18. Итак, как работает мутационное тестирование? 1. Написать тест 3. Получить мутантов 4. Прогнать тесты на мутантах 5. Пересмотреть тесты 6. Прогнать тесты снова 2. Выбрать мутации
  • 19. 2. Выбрать мутации для кода public class TimeLine { private int fetchCount; public TimeLine(int fetchCount) { setFetchCount(fetchCount); } public void setFetchCount(int fetchCount) { if (fetchCount <= 0) { throw new IllegalArgumentException("Count must be > 0"); } this.fetchCount = fetchCount; } public int getFetchCount() { return fetchCount; } // Some service logic } Можно удалить вызов Можно инвертировать условие Можно изменить границу условия
  • 20. Итак, как работает мутационное тестирование? 1. Написать тест 2. Выбрать мутации 4. Прогнать тесты на мутантах 5. Пересмотреть тесты 6. Прогнать тесты снова 3. Получить мутантов
  • 21. 3. Получить мутантов системы public class TimeLine { private int fetchCount; public TimeLine(int fetchCount) { setFetchCount(fetchCount); } public void setFetchCount(int fetchCount) { if (fetchCount <= 0) { throw new IllegalArgumentException("Count must be > 0"); } this.fetchCount = fetchCount; } public int getFetchCount() { return fetchCount; } // Some service logic } public TimeLine(int fetchCount) { }
  • 22. 3. Получить мутантов системы public class TimeLine { private int fetchCount; public TimeLine(int fetchCount) { setFetchCount(fetchCount); } public void setFetchCount(int fetchCount) { if (fetchCount <= 0) { throw new IllegalArgumentException("Count must be > 0"); } this.fetchCount = fetchCount; } public int getFetchCount() { return fetchCount; } // Some service logic } if (fetchCount < 0) { if (fetchCount > 0) {
  • 23. Итак, как работает мутационное тестирование? 1. Написать тест 2. Выбрать мутации 3. Получить мутантов 5. Пересмотреть тесты 6. Прогнать тесты снова 4. Прогнать тесты на мутантах
  • 24. 4. Прогнать тесты на мутантах Не покрыто... Как так-то?
  • 25. Итак, как работает мутационное тестирование? 1. Написать тест 2. Выбрать мутации 3. Получить мутантов 4. Прогнать тесты на мутантах 6. Прогнать тесты снова 5. Пересмотреть тесты
  • 26. 5. Пересмотреть тесты @BeforeMethod protected void setUp() { timeLine = new TimeLine(10); } @Test public void shouldSetTheConstructorFetchValue() { assertEquals(timeLine.getFetchCount(), 10); } @Test public void shouldUpdateFetchCount() { int expected = 5; timeLine.setFetchCount(expected); assertEquals(timeLine.getFetchCount(), expected); } @Test(expectedExceptions = IllegalArgumentException.class) public void shouldNotAllowNegativeFetchCount() { timeLine.setFetchCount(-10); }
  • 27. Итак, как работает мутационное тестирование? 1. Написать тест 2. Выбрать мутации 3. Получить мутантов 4. Прогнать тесты на мутантах 5. Пересмотреть тесты 6. Прогнать тесты снова
  • 29. Мутационное тестирование 1. Написать тест Просто пишем обычные тесты безо всяких предположений о том, что будет дальше. 2. Выбрать мутации Код автоматически анализируется и к нему подбираются мутации. 3. Получить мутантов Звучит зловеще, но это тоже происходит автоматически. 4. Прогнать тесты на мутантах Никаких дополнительных действий от программиста тут не требуется – не зря же мы писали тесты на самом первом шаге. 5. Пересмотреть тесты Если мы получили ошибки, либо имеющиеся тесты, либо настройки мутаций надо пересмотреть. 6. Прогнать тесты снова Запустить мутационное тестирование снова, но уже с исправленными тестами/конфигурацией.
  • 32. БАЙТ-КОД – Работает напрямую с байт-кодом. ДОКУМЕНТАЦИЯ – Хорошая документация + открытый код. – http://www.pitest.org + GitHub ПРОСТОТА – Подсчитывает обычное покрытие строк. – Поддерживает различные оптимизации. PIT
  • 33.
  • 34.
  • 35. PIT – Пример отчета
  • 36. PIT – Пример отчета
  • 37. PIT – Пример отчета
  • 38. PIT – Пример отчета
  • 39. PIT – Пример отчета
  • 40. ▷Стабильные: – простые, – но эффективные. ▷Нестабильные: – мощные, – но чреваты ошибками. PIT – Виды мутаций
  • 41. ▷Изменение граничных условий PIT – Стабильные мутации if (a < b) {// if (a <= b) // do something }
  • 42. ▷Изменение граничных условий ▷Инверсия условий PIT – Стабильные мутации if (a == b) {// if (a != b) // do something }
  • 43. ▷Изменение граничных условий ▷Инверсия условий ▷Инверсия операторов PIT – Стабильные мутации if (a >>> b) {// if (a << b) // do something }
  • 44. ▷Удаление условий PIT – Нестабильные мутации if (a == b) {// if (true) // do something }
  • 45. ▷Удаление условий ▷Удаление вызова конструктора PIT – Нестабильные мутации public int foo() { // Object o = null; Object o = new Object(); return o; }
  • 47. ▷Правильно настраивать плагины сборки. ▷Избегать сгенерированных классов (например, JAXB). ▷Избегать конфликтов со смежными инструментами (например, Clover, Cobertura). С PIT нужно:
  • 48. ▷Может занимать много времени ▷Сложней реализовать ▷Трудно применить к тестам уровнем выше интеграционных Проблемы мутационного тестирования