Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
МУТАНТИ
АТАКУЮТЬ!
ЧИ ЗМОЖУТЬ ВАШІ ТЕСТИ ВСТОЯТИ?
ХТО Я?
Ярослав Пернеровський
GlobalLogic
QA Factory
Skype: y.pernerovskyy
Mail: yaroslavp@qafactory.ua
МУТАЦІЙНЕ ТЕСТУВАННЯ
(МУТАЦІЙНИЙ АНАЛІЗ)
ЯКІСТЬ ТЕСТІВ ЯК ОСНОВА
ЯКОСТІ КОДУ
Яким же чином я можу оцінити якість тестів?
ЯК?
Ніяк! Просто використовуй TDD, цього достатньо!
Потрібно проводити регулярні рев’ю коду тестів
Постійно вимірювати і з...
public class Item
{
private int quantity;
public int getStrangeQuantity()
{
return (quantity <= 0) ? 0 : 10;
}
public void...
public class ItemTest
{
Item item = new Item();
@Test
public void testLessThenZerro()
{
item.addItem(-10);
assertEquals(0,...
public class Item
{
private int quantity;
public int getStrangeQuantity()
{
return (quantity <= 0) ? 0 : 10;
}
public void...
public class Item
{
private int quantity;
public int getStrangeQuantity()
{
return (quantity < 0) ? 0 : 10;
}
public void ...
public class ItemTest
{
Item item = new Item();
@Test
public void testLessThenZero()
{
item.addItem(-10);
assertEquals(0, ...
public class ItemTest
{
Item item = new Item();
@Test
public void testLessThenZero()
{
item.addItem(-10);
assertEquals(0, ...
public class ItemTest
{
Item item = new Item();
@Test
public void testAddItems()
{
item.addItem(-5);
item.addItem(5);
item...
НАВІТЬ 100% ПОКРИТТЯ
НІЧОГО НЕ ГАРАНТУЄ
ІДЕЯ
Richard J. Lipton
Професор кафедри Комп'ютерних
Технологій в Комп’ютерному Коледжі
Технологічного Інституту Джорджії
ІДЕЯ
Навмисно змінити існуючий код
(створити мутанта)
Запустити тест
Тест впав  мутанта знищено
Тест пройшов  мутант виж...
МОЖЛИВІ МУТАЦІЇ
(МУТАЦІЙНІ ОПЕРАТОРИ)
==  !=
<=  <
>  <
!=  ==
foo.bar();  //foo.bar();
foo.bar();  foo.anotherBar()...
ПРОБЛЕМА ВІЧНО ЖИВИХ
МУТАНТІВ
public void makeSomething(int value){
if (value <= 10){
throw new IllegalArgumentexception()...
ПРОБЛЕМА ВІЧНО ЖИВИХ
МУТАНТІВ
public int makeSomething(){
int value;
value=0;
....
....
return value++;
}
public int makeS...
ЕКВІВАЛЕНТНІ МУТАЦІЇ
Безглуздий або мертвий код
Впливають тільки на швидкодію
Не можуть бути викликані згідно існуючої
лог...
ЯК ЦЕ ПРАЦЮЄ
Вибрати
мутацію
Створити
мутанта
Компіля
ція
Тест
Аналіз
Згенерувати
список
мутацій
ВІД ІДЕЇ ДО РЕАЛІЗАЦІЇ
1971 - перші теоретичні дослідження
1980 - перший робочий прототип
2003 - перша комерційна реалізац...
ПРОБЛЕМИ ІНСТРУМЕНТІВ
МУТАЦІЙНОГО ТЕСТУВАННЯ?
Загальна швидкодія
Складність розпізнавання
еквівалентних мутацій
Проблеми з...
АБСОЛЮТНО НЕПРИЙНЯТНІ
ВИТРАТИ ЧАСУ
joda.time
68k - рядків коду
70k – рядків тестового коду
5 секунд компіляція
9 секунд на...
АБСОЛЮТНО НЕПРИЙНЯТНІ
ВИТРАТИ ЧАСУ
Використаємо 10 типів мутаційних операторів
Нехай буде згенеровано 10000 мутантів
Припу...
ЩО РОБИТИ?
Не мутувати код напряму щоб уникнути перекомпіляції
Генерувати мутантів прямо в байт коді (ASM, BCEL)
Підключит...
СУЧАСНІ СИСТЕМИ
Генерація мутантів – код, BCEL, ASM
Вибір мутантів – вручну, все підряд, за певними умовами,
враховуючи по...
Генерація Вибір Детекція Звіт СФ Тест Мок Білд
Jester код все всі код ні Junit ні ні
Simple Jester код все всі код ні Juni...
PIT
ЧОМУ PIT?
Швидкодія
Інтеграція
Модернізація
Конфігурація
Підтримка
ШВИДКОДІЯ
joda.time
10303 – мутанти
9 хвилин 45 секунд!
ІНТЕГРАЦІЯ
Maven
Ant
Gradle
Sonar
Eclipse
Intellij
КОНФІГУРАЦІЯ
16 типів мутаційних операторів
Паралельний аналіз
Інкрементальний аналіз
МОДЕРНІЗАЦІЯ
Open Source
API для плагінів
ПІДТРИМКА
Henry Coles
Поточна версія
1.1.7 - Вересень 2015
http://pitest.org/about/
ДЯКУЮ ЗА УВАГУ
ВАШІ ЗАПИТАННЯ?
QA Fest 2015. Ярослав Пернеровский. Мутанты наступают - смогут ли ваши тесты выстоять?
QA Fest 2015. Ярослав Пернеровский. Мутанты наступают - смогут ли ваши тесты выстоять?
Upcoming SlideShare
Loading in …5
×

QA Fest 2015. Ярослав Пернеровский. Мутанты наступают - смогут ли ваши тесты выстоять?

617 views

Published on

Мутационное тестирование - это еще одна интересная методика тестирования, призванная выявить недостатки ваших тестов.

Published in: Education
  • Be the first to comment

  • Be the first to like this

QA Fest 2015. Ярослав Пернеровский. Мутанты наступают - смогут ли ваши тесты выстоять?

  1. 1. МУТАНТИ АТАКУЮТЬ! ЧИ ЗМОЖУТЬ ВАШІ ТЕСТИ ВСТОЯТИ?
  2. 2. ХТО Я? Ярослав Пернеровський GlobalLogic QA Factory Skype: y.pernerovskyy Mail: yaroslavp@qafactory.ua
  3. 3. МУТАЦІЙНЕ ТЕСТУВАННЯ (МУТАЦІЙНИЙ АНАЛІЗ)
  4. 4. ЯКІСТЬ ТЕСТІВ ЯК ОСНОВА ЯКОСТІ КОДУ Яким же чином я можу оцінити якість тестів?
  5. 5. ЯК? Ніяк! Просто використовуй TDD, цього достатньо! Потрібно проводити регулярні рев’ю коду тестів Постійно вимірювати і збільшувати тестове покриття Точно, чим більше покриття, тим кращі наші тести • line coverage • statement coverage • branch coverage • ….
  6. 6. public class Item { private int quantity; public int getStrangeQuantity() { return (quantity <= 0) ? 0 : 10; } public void addItem(int value) { quantity = value; } public void resetItem() { quantity = 0; } } public void addItem(int value) { quantity = value; } public void resetItem() { quantity = 0; } public int getStrangeQuantity() { return (quantity <= 0) ? 0 : 10; }
  7. 7. public class ItemTest { Item item = new Item(); @Test public void testLessThenZerro() { item.addItem(-10); assertEquals(0, item.getStrangeQuantity()); } @Test public void testMoreThanZerro() { item.addItem(5); assertEquals(10, item.getStrangeQuantity()); } } @Test public void testLessThenZero() { item.addItem(-10); assertEquals(0, item.getStrangeQuantity()); } @Test public void testMoreThanZero() { item.addItem(5); assertEquals(10, item.getStrangeQuantity()); }
  8. 8. public class Item { private int quantity; public int getStrangeQuantity() { return (quantity <= 0) ? 0 : 10; } public void addItem(int value) { quantity = value; } public void resetItem() { quantity = 0; } }
  9. 9. public class Item { private int quantity; public int getStrangeQuantity() { return (quantity < 0) ? 0 : 10; } public void addItem(int value) { quantity = value; } public void resetItem() { quantity = 0; } } // change < to <=
  10. 10. public class ItemTest { Item item = new Item(); @Test public void testLessThenZero() { item.addItem(-10); assertEquals(0, item.getStrangeQuantity()); } @Test public void testMoreThanZero() { item.addItem(5); assertEquals(10, item.getStrangeQuantity()); } }
  11. 11. public class ItemTest { Item item = new Item(); @Test public void testLessThenZero() { item.addItem(-10); assertEquals(0, item.getStrangeQuantity()); } @Test public void testMoreThanZero() { item.addItem(5); assertEquals(10, item.getStrangeQuantity()); } @Test public void testEqualZero() { item.addItem(0); assertEquals(0, item.getStrangeQuantity()); } } <-----
  12. 12. public class ItemTest { Item item = new Item(); @Test public void testAddItems() { item.addItem(-5); item.addItem(5); item.addItem(0); } @Test public void testResetItem() { item.resetItem(); assertEquals(0, item.getStrangeQuantity()); } } Покриття 100% !!!
  13. 13. НАВІТЬ 100% ПОКРИТТЯ НІЧОГО НЕ ГАРАНТУЄ
  14. 14. ІДЕЯ Richard J. Lipton Професор кафедри Комп'ютерних Технологій в Комп’ютерному Коледжі Технологічного Інституту Джорджії
  15. 15. ІДЕЯ Навмисно змінити існуючий код (створити мутанта) Запустити тест Тест впав  мутанта знищено Тест пройшов  мутант вижив
  16. 16. МОЖЛИВІ МУТАЦІЇ (МУТАЦІЙНІ ОПЕРАТОРИ) ==  != <=  < >  < !=  == foo.bar();  //foo.bar(); foo.bar();  foo.anotherBar(); 0  1 true  false return something;  return null; ...
  17. 17. ПРОБЛЕМА ВІЧНО ЖИВИХ МУТАНТІВ public void makeSomething(int value){ if (value <= 10){ throw new IllegalArgumentexception(); } if (value >= 10){ executeSomeLogic(); } } public void makeSomething(int value){ if (value <= 10){ throw new IllegalArgumentexception(); } if (value > 10){ executeSomeLogic(); } } public void makeSomething(int value){ if (value <= 10){ throw new IllegalArgumentexception(); } executeSomeLogic(); }
  18. 18. ПРОБЛЕМА ВІЧНО ЖИВИХ МУТАНТІВ public int makeSomething(){ int value; value=0; .... .... return value++; } public int makeSomething(){ int value; value=0; .... .... return value++; }
  19. 19. ЕКВІВАЛЕНТНІ МУТАЦІЇ Безглуздий або мертвий код Впливають тільки на швидкодію Не можуть бути викликані згідно існуючої логіки виконання Змінюють тільки внутрішній стан класу
  20. 20. ЯК ЦЕ ПРАЦЮЄ Вибрати мутацію Створити мутанта Компіля ція Тест Аналіз Згенерувати список мутацій
  21. 21. ВІД ІДЕЇ ДО РЕАЛІЗАЦІЇ 1971 - перші теоретичні дослідження 1980 - перший робочий прототип 2003 - перша комерційна реалізація
  22. 22. ПРОБЛЕМИ ІНСТРУМЕНТІВ МУТАЦІЙНОГО ТЕСТУВАННЯ? Загальна швидкодія Складність розпізнавання еквівалентних мутацій Проблеми з системами неперервної інтеграції Абсолютно неприйнятні витрати часу!
  23. 23. АБСОЛЮТНО НЕПРИЙНЯТНІ ВИТРАТИ ЧАСУ joda.time 68k - рядків коду 70k – рядків тестового коду 5 секунд компіляція 9 секунд на тести
  24. 24. АБСОЛЮТНО НЕПРИЙНЯТНІ ВИТРАТИ ЧАСУ Використаємо 10 типів мутаційних операторів Нехай буде згенеровано 10000 мутантів Припустимо, що мутант компілюється за 1 секунду 2.5 години тільки на генерацію мутантів Запустимо тести 10000 разів 25 годин 25 ГОДИН!
  25. 25. ЩО РОБИТИ? Не мутувати код напряму щоб уникнути перекомпіляції Генерувати мутантів прямо в байт коді (ASM, BCEL) Підключити здоровий глузд Не мутувати той код, який не покритий тестами Не запускати ті тести, які не тестуют мутований код Використовувати паралелізм Використовувати інкрементальний аналіз
  26. 26. СУЧАСНІ СИСТЕМИ Генерація мутантів – код, BCEL, ASM Вибір мутантів – вручну, все підряд, за певними умовами, враховуючи покриття Дететкція мутантів – прогон всіх тестів, селекція і ранній вихід Предствлення результів – звичайний текст, форматований текст, підсвітка коду Структурований формат – так, ні Підтримка тестових фреймворків – TestNG, Junit Підтримка мок фреймворків – Mickito, Powermock, EasyMock, Jmock і т.п. Підтримка білд систем – Ant, Maven
  27. 27. Генерація Вибір Детекція Звіт СФ Тест Мок Білд Jester код все всі код ні Junit ні ні Simple Jester код все всі код ні Junit ні ні Jumble BCEL умови РВ текст ні Junit так ant PIT ASM покриття РВ код так так так так µ Java код вручну ні код ні ні ні ні javaLanche ASM покриття РВ ф.текст так Junit ні ні СУЧАСНІ СИСТЕМИ http://pitest.org/java_mutation_testing_systems/
  28. 28. PIT
  29. 29. ЧОМУ PIT? Швидкодія Інтеграція Модернізація Конфігурація Підтримка
  30. 30. ШВИДКОДІЯ joda.time 10303 – мутанти 9 хвилин 45 секунд!
  31. 31. ІНТЕГРАЦІЯ Maven Ant Gradle Sonar Eclipse Intellij
  32. 32. КОНФІГУРАЦІЯ 16 типів мутаційних операторів Паралельний аналіз Інкрементальний аналіз
  33. 33. МОДЕРНІЗАЦІЯ Open Source API для плагінів
  34. 34. ПІДТРИМКА Henry Coles Поточна версія 1.1.7 - Вересень 2015 http://pitest.org/about/
  35. 35. ДЯКУЮ ЗА УВАГУ ВАШІ ЗАПИТАННЯ?

×