Systematisches Testen der Funktionalität von Softwaresystemen 17. Juni 2015
Überblick Semantische Qualität von Software Teststrategien und prinzipien Testgetriebene Softwareentwicklung Welche Arten von Tests sind möglich? Wann haben wir genug getestet? Codeüberdeckung Datenüberdeckung Was tun, wenn die Daten fehlen? Mock-Objekte benutzen Taentzer Softwarequalität 2015 182
Semantische Qualität Die semantische Qualität von Software bezieht sich auf die Erfüllung der Anforderungsspezifikation: Erfüllung der funktionalen Anforderungen: Funktionalität: Korrektheit, Vollständigkeit, Sicherheit, Fehlertoleranz Erfüllung der folgenden nichtfunktionalen Anforderungen: Effizienz: Wirtschaftlichkeit, Zeitverhalten, Verbrauchsverhalten Taentzer Softwarequalität 2015 183
Nachweismöglichkeiten für semantische Qualität Testen: exemplarische Programmausführungen, um Fehler (Defekte) zu finden Zusicherungen: Konsistenzeigenschaften, die während der Programmausführung überprüft werden Verifikation: Nachweis, dass alle Programmausführungen bestimmte Eigenschaften erfüllen Welche Vor- und Nachteile haben diese verschiedenen Nachweismöglichkeiten? Taentzer Softwarequalität 2015 184
Repräsentative Tests Wir können im Allgemeinen nicht alle möglichen Eingaben austesten. (Warum?) Deshalb wählen wir eine möglichst aussagekräftige Menge von Testfällen aus. Ein Testfall ist repräsentativ, wenn er eine neue Kombination von Eingabedatenkategorien prüft (in Blackbox- und Whitebox-Tests) oder einen neuen Pfad im Programm durchläuft (nur in Whitebox-Tests). Testziel: Alle möglichen Kombinationen von Eingabedatenkategorien und alle Pfade des Programms sind getestet. Taentzer Softwarequalität 2015 185
Identifikation von repräsentativen Testfällen (datengetrieben) Zum datengetriebenen Testen einer funktionalen Einheit (z.b. Methode) hat sich das folgende Verfahren aus [OB88] bewährt: 1. Erstelle ein Modell der Eingabedatenstrukturen: Welche Datenkategorien gibt es für die Parameter? Welche Objekte der Umgebung müssen berücksichtigt werden? 2. Zerlege den Datenraum jeder Kategorie in Wahlmöglichkeiten 3. Wie viele Kombinationen von Wahlmöglichkeiten gibt es? 4. Welche Kombinationen sind möglich? Welche Abhängigkeiten gibt es zwischen den identifizierten Wahlmöglichkeiten? 5. Für jede mögliche Kombination von Wahlmöglichkeiten werden passende Werte gewählt und ein Testfall geschrieben. Dieser enthält auch den Erwartungswert. Taentzer Softwarequalität 2015 186
Beispiel für datengetriebene Tests Taentzer Softwarequalität 2015 187 [OB88]
Beispiel für datengetriebene Tests Mögliche Testläufe: [OB88] Taentzer Softwarequalität 2015 188
Beispiel für datengetriebene Tests Kategorien und Wahlmöglichkeiten: Taentzer Softwarequalität 2015 189 [OB88]
Beispiel für datengetriebene Tests Eine Kombination von Wahlmöglichkeiten: Ist diese Kombination möglich? [OB88] Taentzer Softwarequalität 2015 190
Beispiel für datengetriebene Tests Wahlmöglichkeiten mit Abhängigkeiten: [OB88] Taentzer Softwarequalität 2015 191
Beispiel für datengetriebene Tests Wahlmöglichkeiten mit Abhängigkeiten: Taentzer Softwarequalität 2015 192 [OB88]
Beispiel für datengetriebene Tests Auszeichnung von Wahlmöglichkeiten, die Fehler produzieren: [OB88] Taentzer Softwarequalität 2015 193
Beispiel für datengetriebene Tests Auszeichnung von Wahlmöglichkeiten, die Fehler produzieren: Diese werden nicht in Kombination mit anderen geprüft. [single] identifiziert Testfälle, die auch nicht in Kombination geprüft werden müssen. Taentzer Softwarequalität 2015 194 [OB88]
Beispiel für datengetriebene Tests Ein konkreter Testfall für die angegebene Kombination: Ein Testfall pro zu prüfender Kombination Skaliert diese Testmethode? [OB88] Taentzer Softwarequalität 2015 195
Einsatz in der testgetriebenen Entwicklung Vorgehensweise: beschreibe wesentliche Testfälle schon mit den Anforderungen folge dem vorgestellten Verfahren zur Identifikation von repräsentativen Testfällen programmiere alle repräsentativen Testfälle führe die Testfälle aus: Fehler, da die Funktionalität noch fehlt implementiere die Funktionalität führe die Testfälle aus: Code solange ändern, bis alle Tests durchlaufen führe Refactorings durch Taentzer Softwarequalität 2015 196
Mock-Objekte Was tun, wenn bestimmte Ressourcen (Komponenten) noch nicht zum Testen zur Verfügung stehen? Beispiele: Datenbanken, Dateien, Server, Softwarekomponenten Was tun, wenn eine Methode schwer testbar ist, weil Eingabeparameter nur sehr umständlich, eingeschränkt oder gar nicht erstellbar sind? Beispiele: Uhrzeit, GUI, Netzwerkfehler Mock-Objekte: Attrappen, die echte Objekte simulieren Sie implementieren dieselben Schnittstellen wie die echten Objekte. Sie unterstützen den Komponententest. (Warum?) weitere Informationen: www.mockobjects.com Taentzer Softwarequalität 2015 197
Beispiel: Mock-Objekte (manuell) VerzeichnisTest Vorlesungsverzeichnis <<interface>> Course getnextparticipant() MockCourse getnextparticipant() public Person getnextparticipant() { //... Person p1 = new Person( Meier ); //... return p1; } Lecture getnextparticipant() public Person getnextparticipant() { return getmanagement(). getnextparticipant();} Taentzer Softwarequalität 2015 198
Beispiel: Mock-Objekte mit Mockito import static org.mockito.mockito.*; // @Test public void firstcoursetest(){ //arrange Course c=mock(mockcourse.class); when(c.getnextparticipant()).thenreturn( new Person( Maier )); //act String result=c.getnextparticipant(); //assert assertequals( Meier", result.tostring()); } Taentzer Softwarequalität 2015 199
Werkzeuge für das Testen mit Mock-Objekten Wie wird getestet? Unit-Testing mit Mock-Objekten Mock-Objekt erzeugen Das erwartete Verhalten aufnehmen Mock-Objekt auf Abspielen des Verhaltens schalten Was kann getestet werden? Aufruf von Methoden (auch die Anzahl und Reihenfolge) Rückgabewerte Werfen von Exceptions Verhalten zwischen mehreren Mock-Objekten Werkzeuge für Java: EasyMock: http://www.easymock.org Mockito: http://code.google.com/p/mockito Taentzer Softwarequalität 2015 200
Zusammenfassung Semantische Qualitätsprüfungen: Testen, Zusicherungen, Verifikation Testen ist eine analytische Qualitätssicherungsmaßnahme. Testen hilft, Fehler zu finden. Es kann nicht die Abwesenheit von Fehlern zeigen. Zentrale Frage: Wann haben wir genug getestet? Repräsentative Testfälle decken die möglichen Eingabewerte optimal ab und testen alle möglichen Programmabläufe (in Whitebox-Tests). Mock-Objekte: falls die echten Daten für das Testen noch fehlen Taentzer Softwarequalität 2015 201
Literatur [Mye95] Glenford J. Myers: Methodisches Testen von Programmen, Oldenbourg Verlag, 1995 [Lin05] Johannes Link u. a.: Softwaretests mit JUnit. Techniken der testgetriebenen Entwicklung. 2. Auflage. dpunkt, 2005 [OB88] T. Ostrand, M. Balcer: The category-partition method for specifying and generating functional tests, Communication of the ACM, 1988 www.cc.gatech.edu/~harrold/6340/cs6340_fall2009/readings/ostrandcate gorypartition88.pdf Taentzer Softwarequalität 2015 202