Software Testing
Testing
Testing
-
- 1 / 56
-
Lernkarten
Was ist Softwaretesting?
Qualität einer Software messen oder sichtbar machen
Welche Vorteile hat Softwaretesting?
Durch testing verringern sich die Risiken beim Einsatz der Software, da mögliche Fehler während des Testens aufgedeckt werden.
Ziele des Testens
Fehlerwirkungen nachweisen
Qualität der Software bestimmen
Vertrauen in die Software zu erhöhen
Durch Analyse, Fehlerwirkungen vorbeugen
Qualitätsmerkmale nach ISO9126 IEC25000?
- Funktionalität
- Zuverlässigkeit
- Benutzbarkeit
- Effizienz
- Änderbarkeit
- Übertragbarkeit
Was sind Funktionale Qualitätsmerkmale?
Funktionalität
Was sind Nicht-Funktionale Qualitätsmerkmale?
- Zuverlässigkeit
- Benutzbarkeit
- Effizienz
- Änderbarkeit
- Übertragbarkeit
Teile der Ursachenkette für Fehler?
- Eine Fehlhandlung (error) ist eine menschliche Handlung (etwa ein Schreibfehler eines Entwicklers), die zu einem falschen Ergebnis führt.
- Ein Fehlerzustand (defect) – auch Defekt – ist ein inkorrekter Teil eines Programmes oder Dokumentes, z.B. eine inkorrekte Anweisung oder Datendefinition, das die geforderte Funktion des Produkts beeinträchtigen kann.
- Eine Fehlerwirkung (failure) ist die Wirkung eines Fehlerzustandes, die bei der Ausführung des Testobjekts nach «aussen» in Erscheinung tritt, d.h. die Abweichung einer Komponente oder eines Systems von der erwarteten Lieferung, Leistung oder dem Ergebnis.
- Fehlermaskierung: Ein vorhandener Fehlerzustand wird durch einen oder mehrere andere Fehlerzustände in anderen Teilen des Testobjekts kompensiert, so dass dieser Fehlerzustand keine Fehlerwirkung hervorruft.
Was ist eine Unit of Work?
Eine Unit of Work ist die Summe aller
Aktionen, die zwischen dem Aufruf einer
öffentlichen Methode innerhalb eines Systems
und einem erkennbaren Endresultat beim Test
dieses Systems stattfinden
Definition – SUT/CUT
SUT steht für «System Under Test», manche
verwenden auch den Begriff CUT («Class Under
Test» oder «Code Under Test»). Wenn Sie etwas
testen, bezeichnen Sie das, was Sie testen, als
das SUT.
Eigenschaften eines «guten» Unit Tests
• Er sollte automatisiert und wiederholbar sein.
• Er sollte einfach zu implementieren sein.
• Einmal geschrieben, sollte er auch morgen noch relevant sein.
• Jeder sollte in der Lage sein, den Test auf einen Knopfdruck hin laufen zu lassen.
• Er sollte schnell ablaufen.
• Die Resultate sollten konsistent sein (die Tests geben immer den gleichen Wertzurück, wenn zwischen den Testläufen nichts geändert wird).
• Er sollte die volle Kontrolle über die getestete Unit haben.
• Er sollte komplett isoliert sein (er läuft völlig unabhängig von anderen Tests).
• Wenn er fehlschlägt, sollte es einfach zu erkennen sein, was erwartet wurde und wie das Problem lokalisiert werden kann.
Eigenschaften Integrationstests
Sind nicht schnell
Sind nicht konsistent
Beinhalten eine oder mehrere Abhängigkeiten der zu testenden Unit.
Integrationstests erhöhen das Risiko für ein anderes
Problem: das Testen zu vieler Dinge auf einmal.
Was muss nicht getestet werden?
Properties sind gute Beispiele für Code, der
gewöhnlich keine Logik enthält und somit nicht
eigens von den Tests adressiert werden muss. Es
handelt sich um Code, der wahrscheinlich von einer
Unit of Work, die Sie testen, verwendet wird. Es
besteht daher keine Notwendigkeit, ihn direkt zu
testen. Aber seien Sie auf der Hut: Sobald Sie
irgendeine Überprüfung in eine Property einbauen,
sollten Sie sicherstellen, dass die Logik getestet
wird.
Was ist ein Testorakel?
Eine Informationsquelle, ob die Ausgabe eines Programms(oder einer Funktion/Methode) korrekt ist oder nicht
Was kann ein Testorakel sein?
- ein Programm
- eine Dokumentation
- ein dokumentierter Algorithmus
- ein menschlicher Domänenexperte
- eine Art zu sagen, dass die Ausgabe korrekt ist
Was versteht man unter Debugging?
- lokalisieren und beheben eines Defektes
- Fehlerbereinigung/Fehlerkorrektur
- Defekte bzw. Fehlerzustände lokalisieren
Nach was wird eine Testmethode benannt? (Roy Osherove)
UnitOfWork_Szenario_ExpectedResult
Was ist ein Unit Test?
Das testen, der funktionalen Einzelteile von Programmen auf ihre korrekte Funktionalität
Nenne einige Eigenschaften eines Unit Tests
- wird fast immer mithilfe eines UT Frameworks erstellt
- einfach zu schreiben und schnell in der Ausführung
- vertrauenswürdig, lesbar und wartbar
- konsistente Ergebnisse, solange Produktionscode nicht geändert wird
Wie sieht die Prioritätenverteilung eines Integrationtests aus?
1. Zuverlässigkeit
2. Effizienz
3. Änderbarkeit
Welche Teile umfasst der Fundamentale Testprozess?
- Planung und Steuerung
- Analyse und Design
- Realisierung und Durchführung
- Auswertung und Bericht
- Abschluss
Nenne 3 Methoden für übersichtiliche Tests
- Given-When-Then(GWT) gut für Behavior Driven Development
- Setup-Exercise-Verify-Teardown gut für UT und IT
- AAA-Pattern gut für UT
Nenne und beschreibe die einzelnen Schritte des AAA-Pattern
- Arrange(anordnen)
alles nötige Bereitstellen inkl. dem SUT
- Act(Tat)
aktion ausführen und das Resultat in eine Variable speichern
- Assert(behaupte)
das müsste passieren
Was ist ein Komponententest?
- prüft, ob jeder einzelne Softwarebaustein für sich die Vorgaben seiner Spezifikation erfüllt (UnitTest)
Was ist ein Integrationtest?
- prüft, ob Gruppen von Komponenten, wie im technischen Systementwurf vorgesehen, zusammenspielen
Was ist ein Systemtest?
- prüft, ob das System als Ganzes die spezifizierten Anforderungen erfüllt
Was ist ein Abnahmetest?
- prüft, ob das System aus Kundensicht die vertraglich vereinbarten Leistungsmerkmale aufweist
Welche Test Attribute kennen wir in Bezug auf den Aufbau und Abbau?
- [OneTimeSetUp]
Methode wird einmal vor dem Testen der Klasse ausgeführt
- [OneTimeTearDown]
Methode wird einmal nach dem Testen der Klasse ausgeführt
- [SetUp]
Methode wird vor jedem Test ausgeführt
- [TearDown]
Methode wird nach jedem Test ausgeführt
Was sollte in einem Unit Test nicht überprüft werden?
Logik von externen Abhängigkeiten
Wie können Klassen mit externen Abhängigkeiten überprüft werden?
Mit Integrationtests
Was ist eine externe Abhängigkeit?
- Objekt im System, mit dem der zu testende Code interagiert und über das wir keine Kontrolle haben
- z.B. Dateisystem, Threads, Hauptspeicher, Zeit, usw.
Wie lassen sich Abhängigkeiten auflösen?
Durch das hinzufügen einer Indirektionssschicht
Mit welchem Pattern löst man Abhängigkeiten auf?
Dependency Injection
Was ist ein Fake?
- Überbegriff, um ein Stub oder Mock Objekt zu bezeichnen
- ob Mock oder Stub hängt davon ab, wie der Fake im aktuellen test verwendet wird
Was kann alles gefakted werden?
- Interfaces
- Klassen, welche:
nicht sealed sind
nicht statisch sind
keinen privaten Konstruktor aufweisen
- Delegates
Welche Methoden können bei einem Stub überschrieben werden?
- Virtual
- Abstract
- Interface Methode
Wie verhält sich ein Fake?
- überschreibbare Methoden werden so überschrieben, dass sie einen leeren Methodenrumpf aufweisen
- Methoden, welche etwas zurückgeben müssen, geben den Wert von default(T) zurück, sofern nichts anderes definiert wurde
- Strict Fakes werden auch unterstützt
Was ist ein Stub?
- kontrollierbarer Ersatz für eine vorhandene Abhängigkeit im System
- Code kann getestet werden, ohne die Abhängigkeit direkt handhaben zu müssen
Was ist ein Mock?
- nachgeahmtes Objekt im System, das entscheidet, ob ein Unit Test funktioniert hat oder nicht
- verifiziert, ob das zu testende Objekt das Fake-Objekt wie erwartet aufgerufen hat
- Gewöhnlich gibt es nicht mehr als einen Mock pro Test
Was ist ein Seam?
- Stelle im Code, in die man eine andere Funktionalität einfügen kann
- z.B. Stub Klasse, Konstruktor Parameter, Methode mit öffentlichem set, Delegate
Was gibt es für Möglichkeiten, um Abhängigkeiten aufzulösen beim Einbau?
- Injektion eines Fakes auf Konstruktor Ebene
- Injektion eines Fakes per Getter/Setter
- Injektion eines Fakes unmittelbar vor einem Methodenaufruf