what is mutation testing
W tym samouczku wyjaśniono, czym jest testowanie mutacji, jak je wykonywać oraz typy testów mutacji z przykładami:
Co to jest testowanie mutacji?
Testowanie mutacji jest techniką testowania opartą na błędach, w której odmiany programu są poddawane testowemu zestawowi danych. Ma to na celu określenie skuteczności zestawu testowego w wyodrębnieniu odchyleń.
Brzmi trochę skomplikowanie, prawda?
Czego się nauczysz:
Testowanie mutacji
Testowanie mutacji (MT) sięga daleko wstecz do lat 70., kiedy po raz pierwszy zaproponowano je jako projekt szkolny. Został odpisany, ponieważ wymagał bardzo dużej ilości zasobów. Jednak wraz z rozwojem bardziej zaawansowanych komputerów ludzie powoli powracali i jest obecnie jedną z najpopularniejszych technik testowania.
Definicja testowania mutacji
MT jest również znany jako testowanie oparte na błędach, mutacja programu, testowanie oparte na błędach, lub analiza mutacji .
Jak sama nazwa wskazuje, testowanie mutacji to rodzaj testowania oprogramowania, który opiera się na zmianach lub mutacjach. Drobne zmiany są wprowadzane do kodu źródłowego, aby sprawdzić, czy zdefiniowane przypadki testowe mogą wykryć błędy w kodzie.
Idealnym przypadkiem jest to, że żaden z przypadków testowych nie powinien przejść. Jeśli test zakończy się pomyślnie, oznacza to, że w kodzie jest błąd. Mówimy, że mutant (zmodyfikowana wersja naszego kodu) żył. Jeśli test się nie powiedzie, w kodzie nie ma błędu, a mutant został zabity. Naszym celem jest zabicie wszystkich mutantów.
Testowanie mutacji pomaga również w testowaniu jakości zdefiniowanych przypadków testowych lub zestawów testów w celu napisania bardziej efektywnych przypadków testowych. Im więcej mutantów możemy zabić, tym wyższa jakość naszych testów.
Koncepcje testowania mutacji
Zanim omówimy dalej testowanie mutacji, zbadajmy kilka pojęć, z którymi się spotkamy.
# 1) Mutanty: Jest to po prostu zmutowana wersja kodu źródłowego. To jest kod, który zawiera drobne zmiany. Gdy dane testowe są przepuszczane przez mutanta, najlepiej powinno dać nam inne wyniki niż oryginalny kod źródłowy. Mutanty są również nazywane zmutowane programy .
Istnieją różne typy mutantów. Są to następujące:
- Przeżyli mutanci: Jak wspomnieliśmy, są to mutanty, które wciąż żyją po przeprowadzeniu danych testowych przez oryginalne i zmutowane warianty kodu źródłowego. Te muszą zostać zabite. Są również znane jako żywe mutanty.
- Zabici mutanci: Są to mutanty zabijane po przeprowadzeniu testów mutacyjnych. Otrzymujemy je, gdy otrzymujemy różne wyniki od oryginalnej i zmutowanej wersji kodu źródłowego.
- Równoważne mutanty: Są one blisko spokrewnione z żywymi mutantami, ponieważ są „żywe” nawet po przeprowadzeniu przez nie danych testowych. To, co odróżnia je od innych, to to, że mają to samo znaczenie, co oryginalny kod źródłowy, nawet jeśli mogą mieć inną składnię.
# 2) Mutatory / operatory mutacji: To właśnie umożliwia mutacje, są one na „siedzeniu kierowcy”. Zasadniczo określają rodzaj zmiany lub zmiany, jaką należy wprowadzić w kodzie źródłowym, aby uzyskać zmutowaną wersję. Można je nazywać błędy lub zasady mutacji .
# 3) Wynik mutacji: To jest wynik oparty na liczbie mutantów.
Oblicza się go według poniższego wzoru:
Zauważ, że równoważne mutanty nie są brane pod uwagę przy obliczaniu wyniku mutacji. Wynik mutacji jest również znany jako adekwatność mutacji . Naszym celem powinno być osiągnięcie wysokiego wyniku mutacji.
Jak wykonać testy mutacji
Krok 1: Napiszmy nasz test jednostkowy Jasmine.
Pakiet testowy (Jasmine)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Krok 2: Napisz oryginalny kod.
Oryginalny kod (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();
Krok 3: Następnie przeprowadzimy test za pomocą oryginalnego kodu, aby upewnić się, że testy nie zakończyły się niepowodzeniem od samego początku. Powinniśmy mieć jakieś wyjście, które informuje, że rzeczywiście napisaliśmy test bez błędów.
Na przykład:
ukończono w 0,019 s 1 specyfikacja, 0 niepowodzeń, losowo z ziarnem 31435
Wynik oryginalnego kodu:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Krok 4: Przedstaw mutanta. W takim przypadku zmieniamy Lepszy niż operator (wiek_matki> wiek_córki) do pliku Mniej niż operator (wiek_matki Zmutowany kod (JavaScript) Krok 5: Następnie przeprowadzamy test za pomocą zmutowanego kodu. Oto wyniki testu: ukończono w 0,017 s 1 specyfikacja, 0 niepowodzeń, losowo z ziarnem 89555 Wynik zmutowanego kodu: Krok 6: Porównaj wyniki z wersji oryginalnej i wersji zmutowanej. W tym przypadku są one różne, nawet jeśli był używany ten sam zestaw testów. Dlatego zabiliśmy naszego mutanta. Dlatego nasz zestaw testów jest gotowy. Istnieje kilka rodzajów mutacji. Zostały one wyjaśnione poniżej. Tutaj wprowadzamy mutację, zmieniając parametr i / lub wartości stałe, zwykle o +/- 1. Przykład: oryginalny kod (JavaScript) Jeśli powyższy kod miał pomnożyć liczby parzyste, gdzie ja<4 , wówczas mutacja wartości oznaczałaby zmianę inicjalizacji na niech i = 1 . Przykład: zmutowany kod (JavaScript) Tutaj usuwamy lub powielamy instrukcję w bloku kodu. Moglibyśmy również zmienić kolejność instrukcji w bloku kodu. Na przykład w bloku if-else możemy usunąć część else lub nawet cały blok if-else. Przykład: oryginalny kod (JavaScript) Przykład: zmutowany kod (JavaScript) Celem jest kod, który podejmuje decyzje, na przykład, porównania wartości. Możemy zmienić > do< jak w naszym przykładzie programu Matka-Córka. Inne operatory, które możemy przełączać, obejmują: Zalety testów mutacji (MT) obejmują: Wady testów mutacji (MT) obejmują: Przydają się narzędzia do przyspieszenia procesu generowania mutantów. Oto kilka narzędzi, których możemy użyć w MT: Stryker, Jumble, PIT i Insure ++. Uczmy się na przykładzie: Powiedzmy, że istnieje szpitalna witryna, która umożliwia rejestrację nowym użytkownikom. Zawiera datę urodzenia lub wiek pacjenta. Jeśli jest większe niż 14, jako głównego lekarza wyznacza lekarza pierwszego kontaktu. Aby to zrobić, wywołuje funkcję „lekarza ogólnego”, która wyszukuje dostępnego lekarza. Teraz mogą istnieć inne funkcje. Być może pacjenci poniżej 13 roku życia są przypisywani do pediatry i tak dalej. Ale zajmiemy się tylko przypadkiem powyżej 14 lat. Oto jak może wyglądać kod: 1) Przeczytaj Wiek Należy pamiętać, że powyższe wiersze kodu nie są specyficzne dla żadnego języka programowania i nie będą działać. To tylko hipotetyczne. Jako tester, jeśli mój zestaw danych to 14, 15, 0, 13 - jakieś liczby losowe. Celem jest sprawdzenie, czy zestaw 4 wartości (14, 15, 0 i 3) jest wystarczający do zidentyfikowania wszystkich możliwych problemów z tym kodem. Przeczytaj także => Wskazówki dotyczące projektowania danych testowych przed wykonaniem przypadków testowych W jaki sposób testy mutacji osiągają to? Przede wszystkim tworzysz mutanty - odmiany programu. Mutant to nic innego jak program napisany jako odchylenie. Zawiera błąd samozasiewu. Przykłady: Te zamienniki są również nazywane „Operatory mutacji”. Pokażę przykłady: Mutant nr 1: operator relacyjnyzastąpienie 1) Przeczytaj wiek Mutant # 2: 1) Przeczytaj wiek Mutant # 3: 1) Przeczytaj wiek Mutant # 4: 1) Przeczytaj wiek Mutant # 5: Usunięcie instrukcji 1) Przeczytaj wiek Mutant # 6: Wstawienie wartości bezwzględnej 1) Przeczytaj wiek Mutant # 7: Niepoprawna składnia 1) Przeczytaj wiek Mutant # 8: Robi to samo, co oryginalny test 1) Przeczytaj wiek Raz powstają wszystkie mutanty. Są poddawane testowemu zestawowi danych. Nasz zbiór to 14, 15, 0 i 13. Który z tych mutantów znajdzie nasz zestaw danych? Dowiedz się z poniższej tabeli: (Kliknij na obrazek, aby powiększyć) Jak widać, wartość naszych danych 14 znajduje awarie, gdy działa przeciwko Mutantowi 2, 3 i 4. Lub 14 zabija mutantów 2, 3 i 4. Ale jest nieskuteczny przeciwko mutantom 1, 6 i 8. Jeśli twój zestaw danych zabija wszystkie mutanty, jest skuteczny. W przeciwnym razie uwzględnij więcej lub lepsze dane testowe. Nie jest konieczne, aby każda wartość w zestawie danych zabijała wszystkie mutanty. Ale razem powinni zabić wszystkich.Na przykład:14 zabija 2, 3 i 4. 15 zabija 1, 2 i 4. I tak dalej. A co z 5, 7 i 8? Mutant # 5 - to instancja programu, która zakończy się niepowodzeniem niezależnie od podanych wartości danych. Dzieje się tak, ponieważ nie wykona żadnego programowania zarówno dla prawidłowych, jak i nieprawidłowych wartości. Mutant # 7 - będzie błędem kompilacji. Lub w przypadku języka skryptowego błąd, który uniemożliwi wykonanie. Mutant # 8 - jest tym samym, co program główny. Jak widać, powyższe mutanty nie są w ogóle przydatne. Dlatego mutanty, których należy unikać, to: Zastanawiasz się, jeśli to wymaga tak dużego wysiłku, co się stanie, gdy będę musiał przetestować duże próbki kodu? Testowanie mutacji polega na dwóch rzeczach: Więc, skupia się na najmniejszej jednostce kodu i wierzy w umiejętności programisty do skalowania testów mutacji do większych programów. W tym samouczku szczegółowo omówiono definicje i typy testów mutacyjnych oraz kroki umożliwiające wykonanie tego testu wraz z przykładami. Mamy nadzieję, że czytanie i poznawanie tej interesującej techniki testowania - testowania mutacji - sprawiło Ci przyjemność. O autorze: Ten artykuł został napisany przez członka zespołu STH Swati S. Podziel się swoimi komentarzami, pytaniami i przemyśleniami poniżej. 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
Rodzaje testów mutacyjnych
1) Mutacja wartości
let arr = [2,3,4,5] for(let i=0; i
let arr = [2,3,4,5] for(let i=1; i
# 2) Mutacja instrukcji
let arr = [2,3,4,5] for(let i=0; i
let arr = [2,3,4,5] for(let i=0; i
# 3) Mutacja decyzyjna
Oryginalny operator Operator mutanta 1 <= > = dwa > = == 3 === == 4 i lub 5 || &&
Narzędzia do testowania mutacji
Więcej o testowaniu mutacji
dwa) Jeśli wiek> 14
3) Doctor = Lekarz ogólny ()
4) Zakończ, jeśli
2) Jeśli wiek z<’
3) Doctor = Lekarz ogólny ()
4) Zakończ, jeśli
2) Jeśli wiek = 14 „Zmiana> za pomocą =”
3) Doctor = Lekarz ogólny ()
4) Zakończ, jeśli
2) Jeśli wiek> = 14 „Zmiana> za pomocą> =”
3) Doctor = Lekarz ogólny ()
4) Zakończ, jeśli
2) Jeśli wiek z<=’
3) Doctor = Lekarz ogólny ()
4) Zakończ, jeśli
2) Jeśli wiek = 14 lat
3) „Usuń oświadczenie o przydziale lekarza”
4) Zakończ, jeśli
2) Jeśli wiek> 14 lat
3) Lekarz = Pan X (Wprowadzenie wartości bezwzględnej - powiedzmy, że X jest pediatrą)
4) Zakończ, jeśli
2) Jeśli wiek %% 14 (nieprawidłowa składnia)
3) Doctor = Lekarz ogólny ()
4) Zakończ, jeśli
2) Jeśli wiek> 14 i wiek> 14 „oznacza to samo, co wiek> 14”
3) Doctor = Lekarz ogólny ()
4) Zakończ, jeśli
Punkty, na które należy zwrócić uwagę
programy używające języka C ++
Wniosek
rekomendowane lektury