Kapitel 10b Test-Automatisierung



Ähnliche Dokumente
Kapitel 10b Test-Automatisierung

Automatisierte Modultests mit JUnit

Programmiertechnik II

Programmieren I. Übersicht. Vorlesung 12. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Testen mit JUnit. Motivation

JUnit - Test Driven Development. Bernhard Frey, Thorsten Stratmann, Jackson Takam, Michel Müller 1

Fortgeschrittenes Programmieren mit Java. Test Driven Development

SEP 114. Design by Contract

Unit Tests mit Junit 4. Dario Borchers

Test-Driven Design: Ein einfaches Beispiel

Testen von graphischen Benutzeroberflächen. 24. Juni 2015

Client-Server-Beziehungen

Software-Engineering Software-Management

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

Unit Testing mit JUnit. Dr. Andreas Schroeder

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

JUnit. Software-Tests

Java: Vererbung. Teil 3: super()

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Unit-Test Theorie und Praxis. Stephan Seefeld, INGTES AG

Unit Tests und Fehlersuche

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Nathan Burgener. Design by Contract. Modul SWE

Das Test-Framework JUnit ETIS SS04

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Testphase. Das Testen

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Software Engineering in der Praxis

Einführung in die Programmierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Teil 2: Ablauf der Analyse festlegen

Programmieren in Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Einführung in die Informatik Tools

Praktische Übung 'JUnit-Test'

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

OOSE_02E Testen mit BlueJ/JUnit 4

Übung: Verwendung von Java-Threads

Objektorientierte Programmierung

Unit Testing, SUnit & You

Testplan. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw,

Java Kurs für Anfänger Einheit 5 Methoden

OOSE4 Testen mit BlueJ/JUnit 4

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Installation und Inbetriebnahme von Microsoft Visual C Express

Der frühe Tester fängt den Bug

Programmierkurs Java

Java Einführung Abstrakte Klassen und Interfaces

Javakurs zu Informatik I. Henning Heitkötter

Allgemein: Klassen testbar machen. 5. Mocking. Mocks programmieren. Zusammenspiel von Klassen testen

Einführung in Javadoc

Unit Tests in der Testgetriebenen Entwicklung

5. Tutorium zu Programmieren

Software Engineering Klassendiagramme Assoziationen

Der Cloud Point of Purchase. EuroCloud Conference, 18. Mai 2011 (Christoph Streit, CTO & Co-Founder ScaleUp)"

Delegatesund Ereignisse

Test-driven development JUnit-Test. Lars Varain

Reporting Services und SharePoint 2010 Teil 1

Software-Engineering Grundlagen des Software-Engineering

Integrierte und automatisierte GUI-Tests in Java

Unit Testing mit NUnit

Mediator 9 - Lernprogramm

Große Übung Praktische Informatik 1

Eclipse User Interface Guidelines

Installation von NetBeans inkl. Glassfish Anwendungs-Server

Objektorientierte Programmierung für Anfänger am Beispiel PHP

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

Überblick. Lineares Suchen

Arbeiten mit UMLed und Delphi

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE

Markus Wichmann. Testen von Java Code mit. JUnit

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Framework zur Unterstützung von Unit-Tests

How To: Wie entwickle ich mit SharpDevelop Anwendungen für die PocketPC-Platform

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Installation mit Lizenz-Server verbinden

Testen und Testautomatisierung in agilen Projekten

Testautomatisierung. Lessons Learned. qme Software. Gustav-Meyer-Allee Berlin. Telefon 030/ Telefax 030/

Java Entwicklung für Embedded Devices Best & Worst Practices!

Java Schulung. Objektorientierte Programmierung in Java Teil IV: Testen mit JUnit. Prof. Dr. Nikolaus Wulff

BüroWARE Exchange Synchronisation Grundlagen und Voraussetzungen

WordPress. Dokumentation

Grundbegriffe der Informatik

Objektorientierte Programmierung. Kapitel 12: Interfaces

Tevalo Handbuch v 1.1 vom

Einführung in die Programmierung

Transkript:

Vorlesung Softwaretechnologie Wintersemester 2013/14 R O O T S Kapitel 10b Test-Automatisierung Stand: 22.01.2014 Warum automatisierte Tests? Automatisierte Modultests mit JUnit Test First Development und Continuous Testing Automatisierte Testerstellung mit T2

Test-Arten Modul-Test (Unit Test) vor "check in" geänderter sourcen ins Projekt-Repository testet interne Funktion einer Komponente oft von Entwickler selbst durchgeführt Integrations-Test für jeden "build"! testet Details des Zusammenspiels von Systemkomponenten oft von System-Integratoren selbst durchgeführt System-Test am Ende einer Iteration testet Interaktion zwischen Akteuren und System oft von Testern durchgeführt die wenig / keine Interna kennen Beim Fokus Refactoring im Folgenden: geht es um regressive Modul- Modul-Tests Regressions-Test Wiederholung von Modul- / Integrations- / System-Tests nach Änderungen sicherstellen, daß die "offensichtlich korrekte" Änderung bisheriges Verhalten nicht invalidiert 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-2 R O O T S

Warum schreibt niemand Tests? Tätigkeiten eines Programmierers Verstehen was man tun soll 5% Überlegen wie man s tun kann 10% Implementieren 20% Testen 5% Debugging 60% Fixing a bug is usually pretty quick but finding it is a nightmare. Also warum testen wir nicht mehr, um weniger Debuggen zu müssen? 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-3 R O O T S

Warum schreibt niemand Tests? Tests mit print -Anweisungen im Programm ständige Programmänderungen anderer Test = andere Print-statements Test deaktivieren = print-statements auskommentieren Test reaktivieren = Kommentare um print-statements löschen langwierige Test-Auswertung ellenlange listings lesen überlegen, ob sie das wiederspiegeln, was man wollte Fazit es dauert alles viel zu lange Fehler werden eventuell doch übersehen Lehre Tests müssen modular sein! ausserhalb der zu testenden Klasse Tests müssen sich selbst auswerten!!! Testprogramm vergleicht tatsächliche Ergebnisse mit erwarteten Ergebnissen 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-4 R O O T S

Nutzen automatischer Tests Geringerer Aufwand Tests zu schreiben Tests zu warten Tests zu aktivieren / deaktivieren Tests zu komponieren Tests durchzuführen und auszuwerten!!!!!!!!!!!!!!!!!!!!!!!!!!! Testen in kürzeren Abständen möglich Weniger Fehlerquellen zwischen Tests Erinnerung was man verändert hat ist noch da Weniger Fehler Schnellere Identifikation der Fehlerursache Schnellere Programmentwicklung!!! 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-5 R O O T S

Automatisiertes Testen im Testzyklus Wie testen? Testfälle? Was testen? Fehlerbehebung Testorakel Fehlersuche Testlauf Automatisiertes Testen Testauswertung 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-6 R O O T S

Tests Warum automatisierte Tests Das Junit-Framework Einführung Beispiel Testen von GUIs Empfehlungen 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-7 R O O T S

The JUnit Test Framework Open source Framework in Java, für Java Autoren Kent Beck, Erich Gamma Web-Site www.junit.org/ Allgemeine Grundeinstellung Der Programmierer meint Das Feature funktioniert Es funktioniert. JUnit Grundeinstellung Es gibt keinen automatischen Test für das Feature Es funktioniert nicht. 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-8 R O O T S

Ziele von JUnit Das Framework muss Testerstellungsaufwand auf das absolut Nötige reduzieren leicht zu erlernen / benutzen sein doppelte Arbeit vermeiden Tests müssen wiederholt anwendbar sein separat erstellbar sein getrennt vom zu testenden Code inkrementell erstellbar sein Testsuites frei kombinierbar sein auch von anderen als dem Autor durchführbar sein auch von anderen als dem Autor auswertbar sein Testdaten müssen wiederverwendbar sein (Testdatenerstellung ist meist aufwendiger als der Test selbst) Erleichterung der Test-Erstellung, -Durchführung und Auswertung! 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-9 R O O T S

Der Kern von JUnit 3.x junit.textui junit.framework * Test run(testresult) TestRunner TestSuite TestCase Start eines Testlaufs: java junit.textui.testrunner MyOwnTest MyOwnTest setup() teardown() test...() test...() 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-10 R O O T S

Der Kern von JUnit junit.textui junit.framework * Test run(testresult) TestRunner main(testclass) run(testsuite) TestSuite TestSuite(Class) TestSuite() addtest(testcase) TestCase if (testclass hat suite()-methode) run(testclass.suite()) else run(new TestSuite(testClass)); Erstellt TestSuite mit allen Methoden namens "test..." aus der angegebenen Klasse. MyOwnTest setup() teardown() test...() test...() suite() 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-11 R O O T S

Der Kern von JUnit junit.textui junit.framework * Test run(testresult) TestRunner main(testclass) run(testsuite) TestSuite TestSuite(Class) TestSuite() addtest(testcase) TestCase TestCase(methodName) if (testclass hat suite()-methode) run(testclass.suite()) else run(new TestSuite(testClass)); Erstellt TestSuite mit allen Methoden namens "test..." aus der angegebenen Klasse. MyOwnTest setup() teardown() test...() test...() suite() 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-12 R O O T S

Der Kern von JUnit junit.textui junit.framework * Test run(testresult) Assert assert(boolean) assertequals(...,...) assertsame(...,...) assertnotnull(object) assertnull(object) TestRunner main(testclass) run(testsuite) TestSuite TestSuite(Class) TestSuite() addtest(testcase) TestCase TestCase(methodName) if (testclass hat suite()-methode) run(testclass.suite()) else run(new TestSuite(testClass)); Erstellt TestSuite mit allen Methoden namens "test..." aus der angegebenen Klasse. MyOwnTest setup() teardown() test...() test...() suite() 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-13 R O O T S

Assertions Definition Ausdrücke, die immer wahr sein müssen Wenn nicht, meldet das Framework einen Fehler im aktuellen Test... und macht mit dem nächsten Test der Suite weiter Varianten assert(boolean b) minimalistische Fehlermeldung assertequals(... expected,... actual) Gleichheit der Parameter hinsichtlich "equals()"-methode viele überladene Varianten (double, long, Object, delta, message) assertsame(object expected, Object actual) Identität: Parameter verweisen auf das selbe Objekt assertnull(object arg) arg muss null sein assertnotnull(object arg) arg darf nicht null sein fail() schlägt immer fehl Testen von Exceptions! immer auch Varianten mit "String message" als zusätzlichem ersten Argument 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-14 R O O T S

Struktur des Framework: "Patterns Create Architectures" junit.framework Composite: Component Test run(testresult) Command ftests Collecting Parameter Composite TestSuite Composite: Leaf TestCase TestResult run(testresult) addtest(test) Template Method Pluggable Selector run(testresult) setup() runtest() teardown() fname MyTestCase setup() runtest() teardown() 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-15 R O O T S

Benutzung von JUnit (1) Test erstellen eigene Unterklasse von TestCase (z.b.: MyOwnTest) implementiere Methoden setup() Testdaten erzeugen test...() Test durchführen teardown() Resourcen freigeben Test durchführen Einfachste Variante: java junit.textui.testrunner MyOwnTest 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-16 R O O T S

Benutzung von JUnit (2) Testklasse fasst zusammengehörige Testdaten und Testfälle zusammen Test-Suites automatisch aus Testklasse generiert Testfall eine Methode nutzt Assertions Assertions automatische Überprüfung der Ergebnisse automatische Fehlerprotokollierung Komponierbarkeit Test reihenfolge-unabhängig komponierbar 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-17 R O O T S

TestRunner-UI Komandozeilen-Schnittstelle junit.textui.testrunner... OK! Graphische Schnittstelle junit.textui.testrunner junit.textui.loadingtestrunner lädt geänderte Klassen automatisch nach...f!!! FAILURES!!! Test Results: Run: 18 Failures: 1 Errors 0 There was 1 failure: 1) FileReaderTester.testRead expected: "m" but was "d" 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-18 R O O T S

Tests Refactoring und Tests Das Junit-Framework Einführung Beispiel Testen von GUIs Empfehlungen 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-19 R O O T S

Besipiel: Testen der FileReader-Klasse des JDK Testplanung: Spezifikation der Klasse studieren Testfälle ableiten Testdaten erstellen (Testdatei ) Testklasse schreiben Testen Testklasse erweitern Testen 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-20 R O O T S

Beispiel: Testdaten erstellen Testdaten zum Lesen aus Datei Testdatei mit bekanntem Inhalt 182 Zeichen lang Datei "data.txt" Bradman 99.94 52 80 10 6996 334 29 Pollock 60.97 23 41 4 2256 274 7 Headley 60.83 22 40 4 2256 270* 10 Sutcliffe 60.73 54 84 9 4555 194 16 Einbinden der Testdatei in setup() Schliessen der Testdatei in teardown() 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-21 R O O T S

Besipiel: Testen der FileReader-Klasse class FileReaderTester extends TestCase { public FileReaderTester(String methodname) { super(methodname); private FileReader _input; protected void setup() { try { _input = new FileReader("data.txt"); catch (FileNotFoundException e) { throw new RuntimeException (e.tostring()); protected void teardown() { try { _input.close(); catch (IOException e) { throw new RuntimeException ("error on closing test file"); public void testread() throws IOException { char ch = '&'; vor (int i=0; i<4; i++) ch = (char) _input.read(); assert('d' == ch); Datei "data.txt" Bradman 99.94 52 80 10 6996 334 29 Pollock 60.97 23 41 4 2256 274 7 Headley 60.83 22 40 4 2256 270* 10 Sutcliffe 60.73 54 84 9 4555 194 16

Beispiel: Testfall erweitern Grenzbedingungen testen! erstes Zeichen letztes Zeichen "endoffile" nach "endoffile" Datei "data.txt" Bradman 99.94 52 80 10 6996 334 29 Pollock 60.97 23 41 4 2256 274 7 Headley 60.83 22 40 4 2256 270* 10 Sutcliffe 60.73 54 84 9 4555 194 16 class FileReaderTester extends TestCase { public FileReaderTester(String methodname) { super(methodname);... private final int _filelength = 182; private final int _endoffile = -1; public void testreadboundaries() throws IOException { assertequals("read first char", 'B', _input.read()); int ch; for (int i=1; i<_filelength-1; i++) ch = _input.read(); assertequals("read last char", '6', _input.read()); assertequals("read at end", _endoffile, _input.read()); assertequals("read past end", _endoffile, _input.read());

Beispiel: Testfall erweitern (2) Grenzbedingungen testen! leere Datei // Erweitertes Testdaten-Setup: private File _empty; protected void setup() { try { _input = new FileReader("data.txt"); _empty = newemptyfile(); catch (FileNotFoundException e) { throw new RuntimeException (e.tostring()); // overrides // <-- added private FileReader newemptyfile() throws IOException { File empty = new File ("empty.txt"); FileOutputStream out = new FileOutputStream(empty); out.close(); return newfilereader (empty); // Added Tests: public void testemptyread() throws IOException { assertequals(_endoffile, _empty.read());

Beispiel: Testfall erweitern (3) Fehlerfälle testen! Testen ob beim Lesen aus einer nicht geöffneten Datei die erwartete Exception geworfen wird. // Added Tests: public void testreadafterclose() throws IOException { _input.close(); // provoziere Fehler! try { _input.read(); // Leseversuch fail("no exception for read past end"); // Hierher sollten wir nicht gelangen catch (IOException io) { Prinzip: fail()-assertion markiert die Stelle die nicht erreicht werden dürfte, falls die getestete Methode die erwartete Exception wirft. 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-25 R O O T S

Beispiel: Explizite Auswahl der Testfälle Test-Suite-Erstellung automatisch explizit // Test mit Default-Test-Suite: public static void main (String[] args) { junit.textui.testrunner.run (new TestSuite(FileReaderTester.class)); // Test mit selbst angepasster Test-Suite: public static void main(string[] args) { junit.textui.testrunner.run (suite()); // Explizite Test-Suite-Erstellung: public static Test suite() { TestSuite suite = new TestSuite(); suite.addtest(new FileReaderTester("testRead")); suite.addtest(new FileReaderTester("testReadAtEnd")); suite.addtest(new FileReaderTester("testReadBoundaries")); return suite;

JUnit 4 Gleiche Grundideen aber leichter zu implementieren Testklassen müssen nicht mehr von TestCase abgeleitet werden Markierung von Testklassen und Methoden durch Java- Annotationen Annotationen @Test Testmethode @Before @After @BeforeClass @AfterClass @Test public void addition() { assertequals(12, simplemath.add(7, 5)); @Test public void subtraction() { assertequals(9, simplemath.substract(12, 3)); @Before public void runbeforeeverytest() { simplemath = new SimpleMath(); @After public void runaftereverytest() { simplemath = null; @BeforeClass public static void runbeforeclass() { // run for one time before all test cases @AfterClass public static void runafterclass() { // run for one time after all test cases 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-27 R O O T S

JUnit 4 (Fortsetzung) Exceptions Paremeter expected Angabe der Exception-Klasse @Test(expected = ArithmeticException.class) public void divisionwithexception() { simplemath.divide(1, 0); // divide by zero Timouts Paremeter timout Angabe der Millisekunden @Test(timeout = 1000) public void infinity() { while (true); Deaktivierte Tests Annotation ignore Erläuterung als Parameter @Ignore("Not Ready to Run") @Test public void multiplication() { assertequals(15, simplemath.multiply(3, 5)); 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-28 R O O T S

Kurze Demo von JUnit 3 unjd JUnit 4: Kreditverlaufsberechnung 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-29 R O O T S

Kapitel 9b: Test-Automatisierung Unit Testing Weiteres Empfehlungen Test-Driven Development Continuous Testing Automatisierte Testerzeugung R O O T S

Unit Tests: Empfehlungen Automatisierung Stelle sicher, daß alle Tests automatisiert ablaufen und ihre eigenen Ergebnisse überprüfen. Ausdauer Führe Deine Tests regelmäßig durch. Teste nach jedem Kompilieren - mindestens einmal täglich. Zuerst testen, dann debuggen Erhälst Du einen Fehlerbericht, schreibe erst einen Test, der den Fehler sichtbar macht. Grenzbedingungen testen Konzentriere Deine Tests auf Grenzbedingungen, wo sich Fehler leicht einschleichen können. Fehlerbehandlung testen Vergiß nicht zu testen, ob im Fehlerfall eine Exception ausgelöst wird. Kein Perfektionismus Lieber unvollständige Test benutzen, als vollständige Tests nicht fertig bekommen. 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-32 R O O T S

Unit Tests: Empfehlungen Es gibt nichts Gutes, außer man tut es! (Erich Kästner) Tests können nicht alle Fehler finden. Lassen Sie sich davon nicht abhalten die paar Tests zu schreiben, die bereits die meisten Fehler finden! 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-33 R O O T S

Wann soll man Modul-Tests schreiben? Wenn die Klasse fertig ist? Testen bevor andere damit konfrontiert werden. Parallel zur Implementierung der Klasse Testen um eigene Arbeit zu erleichtern. Vor der Implementierung der Klasse! TDD: Test-Driven Development! Konzentration auf Interface statt Implementierung Durch Nachdenken über Testfälle Design-Fehler finden bevor man sie implementiert! Tests während Implementierung immer verfügbar Laufendes Feedback und Erfolgskontrolle 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-34 R O O T S

Continuous Testing Beobachtung Tests sind um so nützlicher, je kürzer das Intervall zwischen Änderung und Test ist Die Fehlerquelle ist dadurch schneller lokalisierbar Idee: Laufend Testen! Tool lässt Tests ständig im Hintergrund laufen... zeigt direkt den Code an, der von fehlgeschlagenen Tests betroffen ist Programmierer konzentriert sich voll auf seine Entwicklungsaufgaben... muss nur noch auf Testfehlschläge reagieren, nicht mehr selbst testen Continuous Testing Infos und Tools http://groups.csail.mit.edu/pag/continuoustesting/ http://blog.objectmentor.com/articles/2007/09/20/continuous-testingexplained Infinitest -Tool für Java (GPL Lizenz): http://code.google.com/p/infinitest/ 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-35 R O O T S

Automatisierte Testerzeugung Automatisierte Testerzeugung Wie testen? Testfälle? Was testen? Fehlerbehebung Testorakel Fehlersuche Testlauf Automatisiertes Testen Testauswertung 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-36 R O O T S

Automatisierte Testgenerierung mit T2 Idee Schreiben von Spezifikationen statt Testfällen und Orakeln Testfälle und Orakel werden generiert! Vorgehen Spezifikation ist Teil des Codes Klasseninvarianten durch spezielle Methode spezifizieren private boolean classinv() { return s.isempty() s.contains(max) ; Vorbedingungen durch Java Assertions mit postfix : "PRE" spezifizieren assert!s.isempty() : "PRE" ; // Specifying pre-condition Nachbedingung durch normale Java Assertion assert s.isempty() x.compareto(s.getlast()) >= 0 ; // Post-condition Beispiel Klasse SortedList (Code siehe nächste Folie) 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-37 R O O T S

T2-Beispiel: Spezifikation im Code public class SortedList { private LinkedList<Comparable> s ; private Comparable max ; public SortedList() { s = new LinkedList<Comparable>() ; private boolean classinv() { return s.isempty() s.contains(max) ; // Invariant public void insert(comparable x) { int i = 0 ; for (Comparable y : s) { if (y.compareto(x) > 0) break ; i++ ; s.add(i,x) ; if (max==null x.compareto(max) < 0) max = x ; public Comparable get() { assert!s.isempty() : "PRE" ; Comparable x = max ; s.remove(max) ; max = s.getlast() ; assert s.isempty() x.compareto(s.getlast()) >= 0 ; return x ; // Pre-condition // Post-condition 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-38 R O O T S

Testen mit T2 Normalen JUnit-Test schreiben der aber lediglicht2 aufruft import org.junit.test; public class MyTest { @Test public void test1() { // Call T2, pass the full name of the target class to it: Sequenic.T2.Main.Junit(SortedList.class.getName()) ; Autor von T2 Wishnu Prasetya Weitere Informationen http://code.google.com/p/t2framework/wiki/automatedtestingwithjunit 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-39 R O O T S

Kapitel 9b: Test-Automatisierung Testen von GUIs R O O T S

GUI (Graphical User Interface) Hierarchie von Widgets Widget W i = graphisches Objekts mit einer Menge von Eigenschaften ( properties p ij ) mit jeweils eigenem Diskretem Wert (value v ij ) zur Laufzeit GUI Zustand (State) S t = {, (w i, p ij, v ij ), Werte aller EIgenschaften aller Widgets zum Zeitpunkt t GUI Ereignis (Event) E Initiatiiert transition aus Zustand S zu Zustand S. 41 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-41 R O O T S

GUI-based Testing is Harder Non-GUI tests Invoke methods on test objects created by test Provide input arguments or global state Check expectations return values Technology independent Method call GUI-based tests Trigger GUI events (e.g. clicks) on existing GUI components need to identify components! Provide input filling text fields, Check expectations GUI structure / look GUI behaviour Technology-Dependent Java AWT, Eclipse SWT, Web, Android, Win, MacOs, 42 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-42 R O O T S

GUI Testing Challenges Recording Observing GUI states Tracing GUI transitions Automated testing State explosion problem Explosion of event sequences that do the same thing Technology-dependency GUI test automation is hard GUI test maintenance is very hard 43 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-43 R O O T S

Capture and Replay A capture and replay testing tool captures user sessions (user inputs and events) and stores them in scripts (one per session) suitable to be used to replay the user session. An ad-hoc infrastructure is needed to intercept GUI events, GUI states, thus storing user sessions and also to be able to replay them. - they can work at application or VM level 44 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-44 R O O T S

Recorded information Inputs, outputs, and other information needed to replay a user session need to be recorded during the capture process. Examples: General information: date/time of recording, etc. System start-up information Events from test tool to system Point of control, event Events from system to test tool Checkpoints / expected outputs Time stamps 45 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-45 R O O T S

Testen von GUIs: APIs Klasse java.awt.robot (ab JDK 1.3) erzeugt native Events zur Automatisierung von GUI-Aktionen Methoden: Tastatur-Events keypress(int keycode) keyrelease(int keycode) Methoden: Maus-Events mousemove(int x, int y) mousepress(long buttons) mouserelease(long buttons) Methoden: Timing delay(int miliseconds) setautodelay(int miliseconds) Methoden: Warten bis alle Events abgearbeitet waitforidle() setautowaitforidle(boolean ison) 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-46 R O O T S

Testen von GUIs: Freie Tools WindowsTester Von Google gekauftes kommerzielles Werkzeug, das Eclipse geschenkt wurde (nun frei verfügbar ) http://code.google.com/intl/de-de/javadevtools/index.html Jubula Von BREDEX GmbH Eclipse frei zur Verfügung gestellt Basis ihres kommerziellen Werkzeuges GUIDancer http://eclipse.org/jubula/ 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-47 R O O T S

Capture and Replay: Process 1. The tester interacts with the system GUI to run the system, generating sequences of mouse clicks, UI and keyboard events 2. The tool captures and stores the user events and the GUI screenshots a script is produced per each user session 3. The tester can automatically replay the execution by running the script the script can be also changed by the tester the script can be enriched with expected output, checkpoints the script can be replicated to generate many variants (e.g., changing the input values) 4. In case of GUI changes, the script must be updated 48 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-48 R O O T S

Zusammenfassung Automatisiertes Testen Automatisiert Testlauf und Testauswertung Ermöglicht schnelles Regressionstesting bei jeder Änderung JUnit Assertion-Konzept für Spezifikation des Testorakels Vereinfachte Testdefinition mit Annotationen (ab JUnit 4 / Java 5) Test-Driven Development Testfalldefinition bereits vor der Implementierung Verbessertes Design und laufende Erfolgskontrolle Automatisierte Testgenerierung DBC-Spezifikation wird genutzt um Testfälle und Testorakel zu generieren 2000-2014 Dr. G. Kniesel Vorlesung Softwaretechnologie (SWT) Seite 10b-49 R O O T S