what is mutation testing
In diesem Tutorial wird anhand von Beispielen erläutert, was Mutationstests sind, wie sie durchgeführt werden und welche Mutationstests durchgeführt werden:
Was ist Mutationstest?
Mutationstests sind fehlerbasierte Testtechniken, bei denen Variationen eines Softwareprogramms dem Testdatensatz unterzogen werden. Dies wird durchgeführt, um die Wirksamkeit des Testsatzes bei der Isolierung der Abweichungen zu bestimmen.
Es klingt ein bisschen kompliziert, oder?
Was du lernen wirst:
Mutationstests
Mutation Testing (MT) reicht weit zurück bis in die 70er Jahre, als es erstmals als Schulprojekt vorgeschlagen wurde. Es wurde abgeschrieben, da es sehr ressourcenintensiv war. Als die Menschen jedoch fortschrittlichere Computer weiterentwickelten, erlebte sie langsam ein Comeback und ist heute eine der beliebtesten Testtechniken.
Definition von Mutationstests
MT ist auch bekannt als Fehlerbasiertes Testen, Programmmutation, Fehlerbasiertes Testen, oder Mutationsanalyse .
Wie der Name schon sagt, handelt es sich beim Mutationstest um einen Softwaretesttyp, der auf Änderungen oder Mutationen basiert. Im Quellcode werden winzige Änderungen vorgenommen, um zu überprüfen, ob die definierten Testfälle Fehler im Code erkennen können.
Der Idealfall ist, dass keiner der Testfälle bestanden werden sollte. Wenn der Test erfolgreich ist, liegt ein Fehler im Code vor. Wir sagen, dass die Mutante (die modifizierte Version unseres Codes) gelebt hat. Wenn der Test fehlschlägt, liegt kein Fehler im Code vor und die Mutante wurde getötet. Unser Ziel ist es, alle Mutanten abzutöten.
Mutationstests helfen auch dabei, die Qualität der definierten Testfälle oder der Testsuiten zu testen, um effektivere Testfälle zu schreiben. Je mehr Mutanten wir töten können, desto höher ist die Qualität unserer Tests.
Mutationstestkonzepte
Bevor wir uns weiter mit Mutationstests befassen, wollen wir einige Konzepte untersuchen, auf die wir stoßen werden.
# 1) Mutanten: Es ist einfach die mutierte Version des Quellcodes. Es ist der Code, der winzige Änderungen enthält. Wenn die Testdaten durch die Mutante laufen, sollten sie idealerweise andere Ergebnisse als der ursprüngliche Quellcode liefern. Mutanten werden auch genannt mutierte Programme .
Es gibt verschiedene Arten von Mutanten. Diese sind wie folgt:
- Überlebte Mutanten: Wie bereits erwähnt, sind dies die Mutanten, die nach dem Ausführen von Testdaten durch die ursprünglichen und mutierten Varianten des Quellcodes noch am Leben sind. Diese müssen getötet werden. Sie sind auch als lebende Mutanten bekannt.
- Getötete Mutanten: Dies sind Mutanten, die nach Mutationstests abgetötet werden. Wir erhalten diese, wenn wir unterschiedliche Ergebnisse aus der ursprünglichen und der mutierten Version des Quellcodes erhalten.
- Äquivalente Mutanten: Diese sind eng mit lebenden Mutanten verwandt, da sie auch nach dem Durchlaufen von Testdaten 'lebendig' sind. Was sie von anderen unterscheidet, ist, dass sie dieselbe Bedeutung wie der ursprüngliche Quellcode haben, obwohl sie möglicherweise eine andere Syntax haben.
# 2) Mutatoren / Mutationsoperatoren: Dies macht Mutationen möglich, sie befinden sich auf dem „Fahrersitz“. Sie definieren im Grunde die Art der Änderung oder Änderung, die am Quellcode vorgenommen werden muss, um eine mutierte Version zu erhalten. Sie können als bezeichnet werden Fehler oder Mutationsregeln .
# 3) Mutations-Score: Dies ist eine Bewertung basierend auf der Anzahl der Mutanten.
Sie wird nach folgender Formel berechnet:
Beachten Sie, dass, äquivalente Mutanten werden bei der Berechnung des Mutationsscores nicht berücksichtigt. Mutations-Score ist auch bekannt als Angemessenheit der Mutation . Unser Ziel sollte es sein, einen hohen Mutationswert zu erreichen.
So führen Sie Mutationstests durch
Schritt 1: Schreiben wir unseren Jasmine-Unit-Test.
Testsuite (Jasmin)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Schritt 2: Schreiben Sie den Originalcode.
Originalcode (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();
Schritt 3: Anschließend führen wir den Test mit dem Originalcode durch, um sicherzustellen, dass die Tests von Anfang an nicht fehlgeschlagen sind. Wir sollten eine Ausgabe haben, die mitteilt, dass wir tatsächlich einen Test ohne Fehler geschrieben haben.
Zum Beispiel:
beendet in 0,019s 1 Spezifikation, 0 Fehler, randomisiert mit Samen 31435
Ergebnis des Originalcodes:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Schritt 4: Stellen Sie die Mutante vor. In diesem Fall ändern wir die größer als Operator (Mutteralter> Tochteralter) zu a weniger als Operator (Mother_age Mutantencode (Javascript) Schritt 5: Wir führen den Test dann durch den Mutantencode. Hier sind die Testergebnisse: beendet in 0,017s 1 Spezifikation, 0 Fehler, randomisiert mit Samen 89555 Ergebnis des Mutantencodes: Schritt 6: Vergleichen Sie die Ergebnisse der Originalversion und der Mutantenversion. In diesem Fall sind sie unterschiedlich, auch wenn dieselbe Testsuite verwendet wurde. Wir haben deshalb unseren Mutanten getötet. Unsere Testsuite ist daher einsatzbereit. Es gibt verschiedene Arten von Mutationen. Diese werden unten erklärt. Hier führen wir eine Mutation ein, indem wir die Parameter- und / oder Konstantenwerte ändern, normalerweise um +/- 1. Beispiel: Originalcode (Javascript) Wenn der obige Code die geraden Zahlen multiplizieren sollte, wo ich<4 Dann würde eine Wertmutation bedeuten, dass die Initialisierung auf geändert wird sei i = 1 . Beispiel: Mutantencode (Javascript) Hier löschen oder duplizieren wir eine Anweisung in einem Codeblock. Wir könnten auch Anweisungen in einem Codeblock neu anordnen. In einem if-else-Block könnten wir beispielsweise den else-Teil oder sogar den gesamten if-else-Block löschen. Beispiel: Originalcode (Javascript) Beispiel: Mutantencode (Javascript) Das Ziel hier ist der Code, der Entscheidungen trifft, beispielsweise, Wertvergleiche. Wir können es ändern > bis< wie in unserem Mutter-Tochter-Programmbeispiel. Andere Operatoren, die wir wechseln können, sind die folgenden: Zu den Vorteilen von Mutationstests (MT) gehören: Zu den Nachteilen von Mutationstests (MT) gehören: Tools sind praktisch, um den Prozess der Mutantengenerierung zu beschleunigen. Hier sind einige Tools, die wir in MT verwenden können: Stryker, Jumble, PIT und Insure ++. Lernen wir aus einem Beispiel:: Angenommen, es gibt eine Krankenhausseite, auf der sich neue Benutzer registrieren können. Es liest das Geburtsdatum oder das Alter des Patienten. Wenn es größer als 14 ist, wird ein Allgemeinarzt als Hauptarzt zugewiesen. Zu diesem Zweck wird die Funktion 'Allgemeinarzt' aufgerufen, mit der der verfügbare Arzt gefunden wird. Jetzt gibt es möglicherweise andere Funktionen. Möglicherweise werden Patienten unter 13 Jahren einem Kinderarzt zugewiesen und so weiter. Wir werden jedoch nur den Fall über 14 Jahre behandeln. So könnte der Code aussehen: 1) Alter lesen Bitte beachten Sie, dass die obigen Codezeilen für keine Programmiersprache spezifisch sind und nicht ausgeführt werden. Es ist nur hypothetisch. Als Tester, wenn mein Datensatz 14, 15, 0, 13 ist - einige Zufallszahlen. Ziel ist es zu überprüfen, ob der Datensatz der 4 Werte (14, 15, 0 und 3) ausreicht, um alle möglichen Probleme mit diesem Code zu identifizieren. Lesen Sie auch => Tipps zum Entwerfen von Testdaten vor dem Ausführen Ihrer Testfälle Wie erreichen Mutationstests dies? In erster Linie erstellen Sie Mutanten - Variationen des Programms. Eine Mutante ist nichts anderes als ein Programm, das als Abweichung geschrieben wird. Es enthält einen selbst gesäten Fehler. Beispiele sind: Diese Ersetzungen werden auch genannt 'Mutationsoperatoren'. Lassen Sie mich Ihnen Beispiele zeigen: Mutante Nr. 1: VergleichsoperatorErsatz 1) Alter lesen Mutante Nr. 2: 1) Alter lesen Mutante Nr. 3: 1) Alter lesen Mutante Nr. 4: 1) Alter lesen Mutant Nr. 5: Entfernen der Anweisung 1) Alter lesen Mutante Nr. 6: Absolutwert-Insertion 1) Alter lesen Mutante Nr. 7: Falsche Syntax 1) Alter lesen Mutant Nr. 8: Macht das Gleiche wie der ursprüngliche Test 1) Alter lesen Einmal werden alle Mutanten erstellt. Sie werden dem Testdatensatz unterzogen. Unser Satz ist 14, 15, 0 und 13. Welche dieser Mutanten wird unser Datensatz finden? Finden Sie es in der folgenden Tabelle heraus: (Klicken Sie auf das Bild für eine vergrößerte Ansicht) Wie Sie sehen können, findet unser Datenwert 14 Fehler, wenn er gegen Mutante 2, 3 und 4 ausgeführt wird. Oder 14 tötet Mutanten 2, 3 und 4. Aber er ist gegen 1, 6 und 8 unwirksam. Wenn Ihr Datensatz alle Mutanten tötet, ist er effektiv. Andernfalls geben Sie mehr oder bessere Testdaten an. Es ist nicht erforderlich, dass jeder Wert im Datensatz alle Mutanten abtötet. Aber zusammen sollten sie alle töten.Zum Beispiel:14 tötet 2, 3 und 4. 15 tötet 1, 2 und 4. Und so weiter. Was ist mit 5, 7 und 8? Mutante # 5 - ist die Programminstanz, die unabhängig von einem von Ihnen angegebenen Datenwert fehlschlägt. Dies liegt daran, dass keine Programmierung sowohl für gültige als auch für ungültige Werte durchgeführt wird. Mutante # 7 - - wird ein Kompilierungsfehler sein. Oder im Fall einer Skriptsprache ein Fehler, der die Ausführung verhindert. Mutante # 8 - - ist das gleiche wie das Hauptprogramm. Wie Sie sehen können, sind die obigen Mutanten überhaupt nicht nützlich. Zu vermeidende Mutanten sind daher: Denken Sie, wenn es so viel Mühe kostet, was passiert, wenn ich große Codebeispiele testen muss? Mutationstests beruhen auf zwei Dingen: So, Es konzentriert sich auf die kleinste Codeeinheit und vertraut auf die Fähigkeit des Programmierers, Mutationstests auf größere Programme zu skalieren. In diesem Lernprogramm wurden Definition, Typen und Schritte von Mutationstests zur ausführlichen Durchführung dieser Tests anhand von Beispielen behandelt. Wir wünschen Ihnen viel Spaß beim Lesen und Lernen dieser interessanten Testtechnik - Mutationstests. Über den Autor: Dieser Artikel wurde vom STH-Teammitglied Swati S. verfasst. Bitte teilen Sie Ihre Kommentare, Fragen und Gedanken unten. 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
Mutationstests
# 1) Wertmutation
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=1; i
# 2) Statement Mutation
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=0; i
# 3) Entscheidungsmutation
Ursprünglicher Betreiber Mutantenoperator 1 <= > = zwei > = == 3 === == 4 und oder 5 || &&
Tools zum Testen von Mutationen
Mehr zu Mutationstests
zwei) Wenn Alter> 14
3) Arzt = Allgemeinarzt ()
4) Ende wenn
2) Wenn Alter mit<’
3) Arzt = Allgemeinarzt ()
4) Beenden Sie wenn
2) Wenn Alter = 14 ‘Ändern des> mit =’
3) Arzt = Allgemeinarzt ()
4) Beenden Sie wenn
2) Wenn Alter> = 14 ‘Ändern des> mit> =’
3) Arzt = Allgemeinarzt ()
4) Beenden Sie wenn
2) Wenn Alter mit<=’
3) Arzt = Allgemeinarzt ()
4) Beenden Sie wenn
2) Wenn Alter = 14
3) „Entfernen Sie die ärztliche Zuordnungserklärung
4) Beenden Sie wenn
2) Wenn Alter> 14
3) Doktor = Mr.X (Absolutwerteinfügung - sagen wir, X ist ein Kinderarzt)
4) Beenden Sie wenn
2) Wenn Alter %% 14 (falsche Syntax)
3) Arzt = Allgemeinarzt ()
4) Beenden Sie wenn
2) Wenn Alter> 14 & Alter> 14 'bedeutet dasselbe wie Alter> 14'
3) Arzt = Allgemeinarzt ()
4) Beenden Sie wenn
Zu beachtende Punkte
Fragen und Antworten zum Interview mit Netzwerktechnikern in Cisco
Fazit
Literatur-Empfehlungen