what is mutation testing
Този урок обяснява какво е тестване на мутации, как да се извърши и типове тестване на мутация с примери:
Какво е тестване на мутации?
Мутационното тестване е техника за тестване, базирана на грешки, при която варианти на софтуерна програма се подлагат на тестовия набор от данни. Това се прави, за да се определи ефективността на тестовия набор за изолиране на отклоненията.
Звучи малко сложно, нали?
Какво ще научите:
Мутационно тестване
Мутационното тестване (MT) изминава дълъг път, към 70-те години, когато за първи път е предложено като училищен проект. Той беше отписан, тъй като беше много ресурсно интензивен. Въпреки това, тъй като хората продължават да разработват по-усъвършенствани компютри, той бавно се завръща и сега е една от най-популярните техники за тестване.
Определение за тестване на мутации
MT е известен още като базирано на грешки тестване, програмна мутация, базирано на грешки тестване, или мутационен анализ .
Както подсказва името, тестването на мутации е тип софтуерно тестване, който се основава на промени или мутации. В изходния код се въвеждат малки промени, за да се провери дали дефинираните тестови случаи могат да открият грешки в кода.
Идеалният случай е, че нито един от тестовите случаи не трябва да премине. Ако тестът премине, това означава, че има грешка в кода. Казваме, че мутантът (модифицираната версия на нашия код) е живял. Ако тестът се провали, тогава няма грешка в кода и мутантът е убит. Нашата цел е да убием всички мутанти.
Мутационното тестване също помага да се тества качеството на дефинираните тестови случаи или тестовите комплекти с опит да се напишат по-ефективни тестови случаи. Колкото повече мутанти можем да убием, толкова по-високо е качеството на нашите тестове.
Концепции за тестване на мутации
Преди да обсъдим допълнително тестването на мутациите, нека разгледаме някои концепции, с които ще се сблъскаме.
# 1) Мутанти: Това е просто мутиралата версия на изходния код. Кодът съдържа минутни промени. Когато тестовите данни се изпълняват през мутанта, в идеалния случай те трябва да ни дадат различни резултати от оригиналния изходен код. Мутанти също се наричат мутантни програми .
Има различни видове мутанти. Те са както следва:
- Оцелели мутанти: Както споменахме, това са мутантите, които все още са живи след пускане на тестови данни през оригиналния и мутирали варианти на изходния код. Те трябва да бъдат убити. Те са известни още като живи мутанти.
- Убити мутанти: Това са мутанти, които се убиват след тестване на мутация. Получаваме ги, когато получаваме различни резултати от оригиналните и мутирали версии на изходния код.
- Еквивалентни мутанти: Те са тясно свързани с живи мутанти, тъй като те са „живи“ дори след прокарване на тестови данни през тях. Това, което ги отличава от другите, е, че те имат същото значение като оригиналния изходен код, въпреки че могат да имат различен синтаксис.
# 2) Мутатори / мутационни оператори: Това са нещата, които правят възможни мутациите, те са на „шофьорската седалка“. Те основно определят вида на промяна или промяна, която да се направи в изходния код, за да има мутантна версия. Те могат да бъдат посочени като грешки или правила за мутация .
# 3) Резултат от мутация: Това е резултат, базиран на броя на мутантите.
Изчислява се по формулата по-долу:
Отбележи, че, еквивалентни мутанти не се вземат предвид при изчисляване на мутационния резултат. Резултатът от мутация е известен също като адекватност на мутацията . Нашата цел трябва да бъде да постигнем висок резултат на мутация.
Как да направя тестване на мутация
Етап 1: Нека напишем нашия тест за жасмин.
Тестови апартамент (жасмин)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Стъпка 2: Напишете оригиналния код.
Оригинален код (Javascript)
const user_info = () => { mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age > daughter_age) { alert(`Daughter's age is ${daughter_age}. Mother's age is ${mother_age}. Welcome to the Mother-Daughter program`) } else { alert(`Daughter's age: ${daughter_age}, is more than mother's age: ${mother_age}. Please enter correct ages`) } } user_info();
Стъпка # 3: След това ще стартираме теста през оригиналния код, за да гарантираме, че няма да имаме неуспешни тестове от самото начало. Трябва да имаме някакъв изход, който съобщава, че наистина сме написали тест с нулеви грешки.
Например:
завършен за 0.019s 1 спецификация, 0 неуспехи, рандомизиран със семена 31435
Резултат от оригиналния код:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Стъпка # 4: Представете мутанта. В този случай променяме по-голям от оператор (mother_age> daughter_age) към a по-малко от оператор (mother_age Код на мутант (Javascript) Стъпка # 5: След това провеждаме теста чрез мутантния код. Ето резултатите от теста: завършен за 0.017s 1 спецификация, 0 неуспехи, рандомизиран със семена 89555 Резултат от мутантния код: Стъпка # 6: Сравнете резултатите от оригиналната версия и мутантната версия. В този случай те са различни, дори ако е използван един и същ тестов пакет. Следователно убихме нашия мутант. Следователно нашият тестов пакет е добре да започнете. Има няколко вида мутации. Те са обяснени по-долу. Тук въвеждаме мутация чрез промяна на параметрите и / или константните стойности, обикновено с +/- 1. Пример: Оригинален код (Javascript) Ако горният код имаше за цел да умножи четните числа къде i<4 , тогава мутация на стойност би означавало промяна на инициализацията на нека i = 1 . Пример: Код на мутант (Javascript) Тук изтриваме или дублираме изявление в кодов блок. Можем също да пренаредим изрази в кодов блок. Например в блок if-else бихме могли да изтрием частта else или дори целия блок if-else. Пример: Оригинален код (Javascript) Пример: Код на мутант (Javascript) Целта тук е кодът, който взема решения, например, сравнения на стойности. Можем да се променим > до< както в нашия пример за програмата майка-дъщеря. Други оператори, които можем да превключим, включват следното: Предимствата на мутационното тестване (MT) включват: Недостатъците на мутационното тестване (MT) включват: Инструментите са полезни за ускоряване на процеса на генериране на мутанти. Ето някои инструменти, които можем да използваме в MT: Stryker, Jumble, PIT и Insure ++. Нека се учим от пример: Да кажем, има болничен сайт, който позволява на новите потребители да се регистрират. Той отчита датата на раждане или възрастта на пациента. Ако е по-голямо от 14, назначава общопрактикуващ лекар като техен основен лекар. За целта той извиква функцията „общ лекар“, която намира наличния лекар. Сега може да има друга функционалност. Може би пациентите под 13 години биват назначени на педиатър и т.н. Но ще вземем само случая на възраст над 14 години. Ето как може да изглежда кодът: 1) Прочетете Възраст Моля, обърнете внимание, че горните редове код не са специфични за който и да е език за програмиране и няма да се изпълняват. Просто е хипотетично. Като тестер, ако моят набор от данни е 14, 15, 0, 13 - някои произволни числа. Целта е да се провери дали наборът от данни от 4 стойности (14, 15, 0 и 3) е достатъчен, за да идентифицира всички възможни проблеми с този код. Прочетете също => Съвети за проектиране на тестови данни преди изпълнение на вашите тестови случаи Как мутационното тестване постига това? Първо и най-важно, вие създавате мутанти - варианти на програмата. Мутантът не е нищо друго освен програма, която е написана като отклонение. Той съдържа самозасяваща се грешка. Примери за това са: Тези заместители също се наричат ‘Мутационни оператори.’ Нека ви покажа примери: Мутант # 1: Релационен операторзамяна 1) Прочетете възрастта Мутант # 2: 1) Прочетете възрастта Мутант # 3: 1) Прочетете възрастта Мутант # 4: 1) Прочетете възрастта Мутант # 5: Премахване на изявление 1) Прочетете възрастта Мутант # 6: Абсолютно вмъкване на стойност 1) Прочетете възрастта Мутант # 7: Неправилен синтаксис 1) Прочетете възрастта Мутант # 8: Прави същото като оригиналния тест 1) Прочетете възрастта След като всички мутанти са създадени. Те се подлагат на тестовия набор от данни. Нашият набор е 14, 15, 0 и 13. Кой от тези мутанти ще намери нашият набор от данни? Разберете в таблицата по-долу: (Щракнете върху изображението за увеличен изглед) Както можете да видите, нашата стойност на данни 14 намира неуспехи, когато работи срещу, Мутант 2, 3 и 4. Или 14 убива мутанти 2, 3 и 4. Но е неефективна срещу, 1, 6 и 8. Ако вашият набор от данни убие всички мутанти, той е ефективен. В противен случай включете повече или по-добри данни от теста. Не е необходимо всяка стойност в набора от данни да убива всички мутанти. Но заедно, те трябва да избият всички.Например:14 убива 2, 3 и 4. 15 убива 1, 2 и 4. И така нататък. Какво ще кажете за 5, 7 и 8? Мутант # 5 - е екземпляр на програмата, който ще се провали независимо от стойността на данните, която давате. Това е така, защото няма да прави програмиране както за валидни, така и за невалидни стойности. Мутант # 7 - ще бъде грешка при компилиране. Или в случай на скриптов език грешка, която ще попречи на изпълнението. Мутант # 8 - е същото като основната програма. Както можете да видите, горните мутанти изобщо не са полезни. Следователно мутантите, които трябва да се избягват, са: Мислите ли, ако са необходими толкова много усилия, какво ще се случи, когато трябва да тествам големи проби код? Мутационното тестване разчита на две неща: Така, той се фокусира върху най-малката единица код и вярва в умението на програмиста да мащабира тестването на мутацията към по-големи програми. Този урок обхваща детайлно дефиниция, видове и стъпки за тестване на мутации с примери. Надяваме се, че ви е харесало да четете и да научите за тази интересна техника за тестване - Мутационно тестване. За автора: Тази статия е написана от член на екипа на STH Swati S. Моля, споделете вашите коментари, въпроси и мисли по-долу. const user_info = () =>{ mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age
Daughter's age: 5, is more than mother's age: 20. Please enter correct ages
Видове за мутационно тестване
# 1) Мутация на стойност
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=1; i
# 2) Мутация на изявление
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=0; i
# 3) Мутация на решението
Оригинален оператор Оператор на мутант 1 <= > = две > = == 3 === == 4 и или 5 || &&
Инструменти за тестване на мутации
Повече за тестване на мутации
две) Ако възраст> 14
3) Доктор = Общ лекар ()
4) Край ако
2) Ако възрастта с<’
3) Лекар = Общ лекар ()
4) Край ако
2) Ако възрастта = 14 ‘Промяна на> с =’
3) Лекар = Общ лекар ()
4) Край ако
2) Ако възраст> = 14 ‘Промяна на> с> =’
3) Лекар = Общ лекар ()
4) Край ако
2) Ако възрастта с<=’
3) Лекар = Общ лекар ()
4) Край ако
2) Ако възрастта = 14
3) „премахване на декларацията за назначение на лекар“
4) Край ако
2) Ако възраст> 14
3) Лекар = Mr.X (Абсолютно въвеждане на стойност - да кажем, че X е педиатър)
4) Край ако
2) Ако възраст %% 14 (неправилен синтаксис)
3) Лекар = Общ лекар ()
4) Край ако
2) Ако възраст> 14 и възраст> 14 ‘означава същото нещо като възраст> 14’
3) Лекар = Общ лекар ()
4) Край ако
Точки за отбелязване
как да стана изпитател на продукти
Заключение
Препоръчително четене