Das Test-Framework JUnit ETIS SS05
Gliederung Motivation Extreme Programming Test-First Das Framework Grundlagen Assert TestCase TestSuite Zusammenfassung JUnit ETIS SS05 - Nadine Fröhlich
Motivation(I) JUnit: Open source Test-Framework Autoren: Schreiben und Ausführen automatischer Unit Tests unter Java Aktuell: Version 3.8.1 (http://www.junit.org/) In jeder gängigen Java-IDE verwendbar Autoren: Kent Beck (Extreme Programming) Erich Gamma (Mitglied Gang of Four - Design Pattern) Entsprechende Frameworks für gängige Programmier-sprachen erhältlich (PhpUnit, CppUnit,…) JUnit ETIS SS05 - Nadine Fröhlich
Extreme Programming (XP) Unit-Tests vor XP wenig in Praxis angewandt - in XP: zentrale Tätigkeit XP: agiler Softwareentwicklungsprozess Schlüsselaktivität: Programmieren für kleine bis mittelgroße Teams außergewöhnlich stark durch den Kunden gesteuert während Entwicklung Reaktion auf vage und rasch ändernde Anforderungen möglich ermöglicht Erstellung langlebiger Software JUnit ETIS SS05 - Nadine Fröhlich
Extreme Programming (XP) - Prinzipen Pair Programming + Gemeinsame Verantwortlichkeit Programmierstandards festlegen und einhalten möglichst einfaches Design + häufiges Refactoring Ständige isolierte, automatisierte Unit-Tests Unit-Test müssen zu 100% laufen i.d.R. verbunden mit Test-First-Ansatz Kunde gehört zum Team Ständige Integrationstests Kurze Iterationszyklen JUnit ETIS SS05 - Nadine Fröhlich
TestFirst-Ansatz (I) Ziel: Vorgehen: Qualitätssicherung: Testbarkeit, Einfachheit Vorgehen: Vor eigentlicher Codierung Test schreiben Erst wenn Test fehlerfrei, dann ist Code fertig Nur soviel Produktionscode wie Test verlangt Kleine Schritte (abwechselnd Test- und Produktionscode) Vor Integration in Gesamtsystem muss Unit Test erfolgreich sein JUnit ETIS SS05 - Nadine Fröhlich
TestFirst-Ansatz (II) Vorteile: gesamter Code ist getestet (Zerstörung funktionierenden Codes sofort entdeckt) Tests dokumentieren Code Schnelles Feedback durch kurze Wechsel Erzeugung von Test- und Produktionscode Einfaches Design, da durch Test bestimmtes Design Vorsicht: Wenn nur triviale Testfälle betrachtet, nutzen Tests wenig... JUnit ETIS SS05 - Nadine Fröhlich
Screenshoot – JUnit in eclipse ETIS SS05 - Nadine Fröhlich
Grundlagen (I) Name der Testklasse: Zielklassenname + Endung Test, z.B. EuroTest Einbinden von Testklassen in JUnit durch Ableiten von Framework-Basisklasse junit.framework.TestCase JUnit erkennt Methode als Testfall, wenn sie Konvention public void test…() folgt assert-Methoden, z.B. assertTrue(...) zum Test von Bedingungen bei Fehlerfall bricht JUnit den laufenden Testfall mit AssertionFailedError ab JUnit ETIS SS05 - Nadine Fröhlich
Grundlagen (II) Assert JUnit-Framework assertTrue() assertEquals() assertNull() ... TestCase setUp() tearDown() EigenerTest testMethode() JUnit ETIS SS05 - Nadine Fröhlich
Die Framework-Klasse Assert definiert Tests von Werten und Bedingungen, die erfüllt sein müssen Testklassen erben die Testmethoden über TestCase, Beispiele: Test, ob Bedingung wahr assertTrue(boolean condition) assertTrue(Fritz.isRadioStation()) Test, ob zwei Objekte gleich (über equals - Methode) assertEquals(Object expected, Object actual) assertEquals(“JUnit“, “J“ + “Unit“) JUnit ETIS SS05 - Nadine Fröhlich
Test – Fixture Testbasis, für Testfälle Bestandteile: fester Satz zu testender Objekte alle Testfälle einer Testklasse sollen gemeinsame Fixture nutzen Test - Fixture vor jedem Testfall neu initialisieren, um Beeinflussungen der Testfälle untereinander zu vermeiden JUnit ETIS SS05 - Nadine Fröhlich
Die Framework-Klasse TestCase (I) TestCase vererbt setUp() und tearDown() an Testklassen setUp() vor Ausführung eines Testfalls aufgerufen zu überschreiben, um Instanzvariablen zu initialisieren, d.h., enthält Code für Aufbau der Test-Fixture tearDown() nach Ausführung eines Testfalls aufgerufen zu überschreiben, um Ressouren (DB-Verbindung u.ä.) freizugeben JUnit ETIS SS05 - Nadine Fröhlich
Die Framework-Klasse TestCase (II) public class EuroTest extends TestCase{ private Euro two; public EuroTest(String name){ super (name); } protected void setUp(){ two = new Euro(2.00); protected void tearDown(){} JUnit ETIS SS05 - Nadine Fröhlich
TestSuite (I) dient dem Zusammenfassen von Tests TestSuite: Objekt, dem beliebig viele Tests und Testsuiten hinzugefügt werden können statische suite - Methode definiert, welche Tests zusammen auszuführen sind public static Test suite() { TestSuite suite = new TestSuite(); suite.addTestSuite(CustomerTest.class); suite.addTestSuite(MovieTest.class); return suite; } JUnit ETIS SS05 - Nadine Fröhlich
TestSuite(II) – Komposite Pattern <<interface>> Test 1..n tests TestCase TestSuite JUnit ETIS SS05 - Nadine Fröhlich
Lebenszyklus TestCase Testframework sucht in Testklassen nach öffentlichen Methoden, ohne Parameter und Rückgabewert, die mit „test“ beginnen (Reflection) Sammeln der Methoden in Testsuite + unabhängige Ausführung Für jeden Testfall neue Instanz der Testklasse und damit Test-Fixture erzeugen, um Seiteneffekte zu vermeiden Vor Ausführung Testfall setUp() aufgerufen (falls neu definiert) test-Methoden ausgeführt Nach Test tearDown (falls neu definiert) Schritte ab 3 wiederholen, bis alle Testfälle einmal ausgeführt JUnit ETIS SS05 - Nadine Fröhlich
Zusammenfassung JUnit: Framework für Test von Java - Programmen Komponententest erleichtert es, dem Testcode gleiche Aufmerksamkeit wie Programmcode widmen Investition in die Zukunft Entsprechende Frameworks für gängige Programmier-sprachen erhältlich (PhpUnit, CppUnit,…) JUnit ETIS SS05 - Nadine Fröhlich
Literatur http://www.frankwestphal.de/UnitTestingmitJUnit.html Johannes Link, Unit Tests mit Java, dpunkt.Verlag, 2002 Johannes Link et al., Softwaretests mit JUnit, dpunkt.Verlag, 2005 Barbara Beenen, Einführung in JUnit - Rot - grünes Wechselspiel, javamagazin, 05/04 Martin Backschat, Stefan Edlich, J2EE - Entwicklung mit Open - Source - Tools, Spektrum Akademischer Verlag, München, 2004 Kent Beck, Extreme Programming. Das Manifest. Addison-Wesley, München, 2000 JUnit ETIS SS05 - Nadine Fröhlich