next generation developer testing · 2016-07-27 · 21 testng • beyond junit – ein...
TRANSCRIPT
Next GenerationDeveloper Testing
JUnit 4 und TestNG unter der Lupe
Josef Adersberger @www.QAware.de
1
Ziel dieser Präsentation…
… ist es, dass Sie die Funktionalität derneuen Testframework-Generationeinschätzen und einsetzen können.
2
Agenda• Testing? Developer Testing!?
• This Generation Developer Testing,• der Leidensdruck
• Next Generation Developer Testing,• die Herausforderer• Case Study: Migration auf die neue Generation
• Summa Summarum.
3
QSQS--TeamTeam
DeveloperDeveloper TestingTesting
Meine Ordnung im Testebenen-Zoo
IntegrationsgradVoll-Isolation Voll-Integration
Black-Box
Glass-Box
Implementierungswissen
Integrations-TestIntegrationsIntegrations--TestTest
Unit-TestUnitUnit--TestTest
Komponenten-TestKomponentenKomponenten--TestTest
InterneQualität:
„Those GoodVibrations“
ExterneQualität
AkzeptanztestAkzeptanztestAkzeptanztest
SystemtestSystemtestSystemtest
4
Was sind Developer Tests?= Alle Tests, die ein Entwickler
sinnvollerweise selbst macht.
• Aufgaben der Developer Tests:• Müssen den Entwickler motivieren - the test infection!• Build Verifikation,
Kaffeepausen Validierung (Regression).• Die angenehmen Seiteneffekte:
Verbessert Dokumentation & Design.
5
Anforderungen an Developer Tests
• A-TRIP(aus „Pragmatic Unit Testing“, Hunt/Thomas)
• Automated• Thorough• Repeatable• Independant• Professional
•Flexible•Fast•Designed
… und mein FFD:
6
This Generation Developer Testing &die Scott TERRA NOVA Expedition
7
This Generation Developer Testing
• JUnit (< 4) ist Opfer des eigenen Erfolgs• Konzipiert für Unit-Testing,
missbraucht für alle Testebenen.• Massiver Einsatz von Erweiterungen
(Pimp my JUnit)
• Was wünschen wir uns?• Test-Framework für alle Ebenen des Developer-Testings.• Modernes, einfaches Programmiermodell.• Höhere Test-Produktivität: Kampf den stereotypen
Testaufgaben!
8
Anforderungen an ein modernesDeveloper-Testing Framework
• Organisation• Gruppierung (Testsuiten, Testebenen)• Testszenarien (definierte Testfall-Sequenzen)
• Unterstützung• Zusicherungen
• Vor- und Nachbedingungen, Invarianten, QoS• Komplexere Validierungsmöglichkeiten
• Objektisolation: Mocking
• Produktivität• Test-Generierung, Test-Guessing• Hilfsbibliotheken für spezielle Aufgaben
9
Anforderungen an ein modernesDeveloper-Testing Framework
• Flexibilität• Parametrisierung von Testfällen• Testdaten
• Testdaten-Vorlagen und Testdaten-Generatoren(z.B. DEAddressGenerator)
• Externe Testdaten (Excel, DB, Wiki, … )• Test-Orakel
• Meta-Tests (Code Coverage, … )
• Integration• Entwicklungsumgebung, Buildsystem, Dashboards, XFDs
10
Die Soft-Skills• Open-Source Projekt• Geringe Einarbeitungszeit, Flache Lernkurve• Kompatibilität
• Zu bestehenden Tests (JUnit 3.x)• Java in den Versionen 1.3, 1.4, 5.0
• Einfache Benutzung• Arbeitsfluss (TDD) fördern - auf keinen Fall stören.
11
12
Blitzlicht: JUnit
Aktuelle Version: 4.1Seit: 27. April 2006Version 4.0: 16. Februar 2006NC-LOC: 3057 (ohne Tests)
Vorgängerversion: 3.8.1Seit: 4. September 2002
C1-Testüberdeckung:
13
JUnit 4• JUnit 4 = JUnit 3
+ Zwang mit Java 5.0 zu arbeiten+ Annotationen (@Test et. al)+ Neue Paketstruktur (org.junit)+ Timeout-Tests+ Erwartete Exceptions+ Ignorierbare Testfälle+ Testfall-Parametrisierung+ Klassenweite Isolationsklammern+ assertEquals(Object[] expected, Object[] actual)
- Unterscheidung Failure / Error- AWT/Swing TestRunner
14
Code counts
Großer Vorteil von @Test:Terminologie und OO-Modell sind näher beieinander.JUnit vor Version 4: Klasse, die von TestCase erbt ist eigentliche eineTestsuite, der Testfall ist jede einzelne Methode in der Klasse.
15
Die Isolationsklammern@Before/@After• Verhalten wie bisher• Kein super()-Aufruf mehr!
@BeforeClass/@AfterClass• So wie unerfahrene Entwickler
setUp() und tearDown() bisherinterpretiert haben.J
• Ungewollte Seiteneffekte möglich,da weiterhin static Variablengenutzt werden müssen.
• Nur für aufwändige und/oderinvariante Vorbereitungen(Beispiel: JDBC Connectionaufbauen).
16
Diverses Neues• Tests ignorieren: @Ignore(“Keine Lust“)
• Wird vom Testrunner explizit als ignoriert dargestellt.• Gefährlich! Wir werden besseren Ansatz sehen.
• Time(out)ed Tests: @Test(timeout=500)• Millisekunden bis Timeout erfolgt und Test fehlschlägt.• Einzelne Werte haben oft keine Aussage (Heisenberg lässt
grüßen).• Evtl. sinnvoll zum Schutz der Testlauf-Performance
• Erwartete Ausnahmen:
17
@RunWith@RunWith = Wer identifiziert Testfälle und führt sie aus?
• Standard Extension-Point (endlich) durch diesen TestRunner-Injection Mechanismus aus Klassenebene.
• Beispiel: Testfall-Parametrisierung
Methode liefert Testdaten
Ausführung:Kreuzprodukt zwischenTestdaten-Vektor undTestmethoden-Vektor.
18
Test-Suiten• Ein weiteres @RunWith Beispiel…
• @RunWith(AllTest.class)
• klassisches Verhalten mit static suite() Methode
• @RunWith(Suite.class)@SuiteClasses({TestA.class, TestB.class})
• Klasse bleibt leer; Testsuite wird rein überAnnotationen definiert.
19
20
Blitzlicht: TestNG
NC-LOC (exkl. Tests): 14017
21
TestNG• Beyond JUnit –
Ein Testing-Framework für alle Testebenen.
• TestNG = JUnit 4+ Nebenläufigkeitstests+ Volle JDK 1.4 Unterstützung durch spezielle JavaDoc Tags+ Testkonfiguration durch XML (Parameter, Suiten, … )+ Gruppen (Groups) als zusätzliches Strukturierungselement+ Automatisch generierte Testsuite aller fehlgeschlagenen Tests+ Feingranularere Isolationsklammern+ Unterstützung von Testsequenzen und abhängigen Testfällen+ Factory Mechanismus, der eigene Test-Instanziierung zulässt.+ Erwartete Exceptions (mehrere pro Methode)- Pseudo-Isolation durch mehrfache Instanziierung der Testklasse
22
Das TestNG Testmodell
SuiteSuite
TestTest
ClassClass
MethodMethod
Isolationsklammernauf jeder Ebene + Gruppen
In sich geschlossenesTestszenario(definiert in XML)
Ein Testlauf(definiert in XML)
Sammlung anTestmethoden
Gruppe als orthogonaleStrukturierung vonMethoden und Klassen(definiert als Annotation)G
roupG
roup
23
Der Bruch mit der Isolation!?• Jede Testmethode oder Testklasse in TestNG kann abhängig von einer
anderen Testmethode oder der kompletten Abarbeitung einer Gruppesein.
• Warum abhängige Testmethoden nicht grundsätzlich schlimm sind:• Testmethode != Testfall
Ein Testfall kann weiterhin in sich isoliert sein, aber aus mehrerenMethoden bestehen.
• Vermeidung kaskadierender Fehler
• Beispiele:• Axiomatisches Testen
• Addition testen.• Test der Multiplikation durch Rückführung auf die Addition.
• Ein Test prüft auf eine stabile Laufzeitumgebung. Alle folgenden Testssetzen die Laufzeitumgebung dann als stabil voraus.
24
25
Migrationspfade
TestNGTestNG JUnit 4JUnit 4
JUnitC
onverter
JUnit
Runne
r
Transform
ation
Adapti
on
JUnit 3.xJUnit 3.xJUnit4TestAdapter
Adaption
junit.*
Kompatibilität
26
Case Study• Migration aller Testfälle von
JUnit 3.8.1 auf TestNG 4.7
Steckbrief Beispielanwendung „FKat“•Lightweight J2EE Anwendung auf J2SE 1.4•Gesamt-Umfang: 21 kLOC, 13 NC-kLOC•Tests
•63 Testfälle / 8 Testfälle schlagen fehl•Eine TestAll Testsuite•2 Testfälle nicht in Suite eingebunden•7 Sekunden Testlauf auf Entwicklerrechner•64% C1-Testüberdeckung in der Businesslogik
Steckbrief Beispielanwendung „FKat“•Lightweight J2EE Anwendung auf J2SE 1.4•Gesamt-Umfang: 21 kLOC, 13 NC-kLOC•Tests
•63 Testfälle / 8 Testfälle schlagen fehl•Eine TestAll Testsuite•2 Testfälle nicht in Suite eingebunden•7 Sekunden Testlauf auf Entwicklerrechner•64% C1-Testüberdeckung in der Businesslogik
27
Schritt 1: Transformation der Testfälle
• JUnitConverter auf TestNG für JDK 1.4 (JavaDoc Tags)• Am einfachsten per Batch Datei• JUnit-Testsourcen werden beibehalten (src/test/junit)
• Ergebnis• 63 TestNG Testfälle (src/test/testng) – nicht compilierbar• testng.xml mit Auflistung aller Testklassen
28
Schritt 2: Code compilierbar machen & ausräumen
• JUnit Relikte entfernen.• Bsp. super.setUp(), super.tearDown(),super(s)
• Mit Hilfe von Suchen&Ersetzen oder Refactorings
• Asserts anpassen:• AssertJUnit• Assert von TestNG (Ist-Wert, Soll-Wert, Nachricht)• Java assert Schlüsselwort
• Ergebnis: TestNG Testfälle laufen ab wie JUnit Testfälle• Ab hier nur noch Optimierungen. Zeitaufwand bisher: 30 Minuten.
29
Schritt 3: Features nutzen• Parametrisierung
• 4 Testfälle scheitern, weil Pfad nicht portabel angegeben ist.
testng.xml
30
Schritt 3: Features nutzen• Parallele Tests
In Java 5:@Test(invocationCount=100, threadPoolSize=10)
31
Schritt 4: RestrukturierungGruppen:• not_stable• longrunner
• > 1 Sekunde Testzeit
• component_test• Test gegen Komponenten-
Schnittstelle
32
Schritt 4: Restrukturierung
• Regression Tests• Das gute Gefühl!
tests-regression.xml
33
Schritt 4: Restrukturierung
• Component Teststests-components.xml
Spezielle Gruppe für Methoden(Isolationsklammern, Testfälle),die Ablaufumgebung fürKomponententests einrichten.
34
Schritt 4: Restrukturierung
• Build Tests tests-build.xml
35
36
Vergleich: Popularität
(Treffer am 11.4. und 28.4. 2006)„JUnit“: 7.300.000, 7.660.000 (+4,9%)„JUnit 4“: 40.500, 52.200 (+28,9%)„TestNG + Java“: 189.000, 214.000 (+13,2%)
JUnit: jaJUnit 4: jaTestNG: nein
(Treffer am 11.4. und 28.4. 2006)junit: 1384, 1438 (+3,9%)junit4: 18, 18testng: 114, 120 (+5,3%)
am 28.4. 2006)
37
Der Vergleich
Organisation
• Deklarativer Ansatz und Gruppen-Konzept vonTestNG ist JUnit Testsuiten überlegen.
• TestNG macht viel weniger Vorgaben über dieStrukturierung – diese Freiheit muss man jedochdurch Konventionen einschränken.
TestNG4
10
38
Der VergleichUnterstützung• TestNG bietet Nebenläufigkeitstests.
• Für das Mocking benötigen beide Hilfe von Frameworkswie rMock, EasyMock oder jMock.
Produktivität• Test-Generierung, Test-Guessing: Keine Unterstützung.
• Hilfsbibliotheken: Die JUnit 3 Extension-Juwelen sindentweder direkt weiter mit JUnit 4 und TestNG nutzbaroder müssen mit dem jeweils gleichen Aufwand portiertwerden.
TestNG4
20
20 20
39
Der VergleichFlexibilität• Externe Testfall-Parametrisierung nur in TestNG.• In-Class Testdaten-Mechanismus ist gleichwertig,
wenngleich in TestNG ein wenig eleganter (siehe Anhang).• Richtig professionell wir man erst mit zusätzlichen Tools
wie DDSteps, DBUnit oder auch Fit/FitNesse.
Meta-Tests• Keine Unterstützung beiderseits.• Zusätzliche Tools wie Clover, Cobertura, Jester, NoUnit
nötig.
TestNG4
30
30
40
Der Vergleich
Integration• IDE Plugins: Hier bietet JUnit4 durch die JUnit3
Kompatibilität mehr.• TestNG Plugins noch ein wenig buggy.
• Gleichwertige Maven und Ant Plugins verfügbar.
TestNG4
31
41
Vergleich der Soft-Skills
• Open-Source Projekt
• Geringe Einarbeitungszeit• Bei beiden ist man nach wenigen
Stunden (Minuten?) fit.
• Kompatibilität• JDK 5.0 Fixierung von JUnit 4
kann KO-Kriterium sein.
• Einfache Benutzung• TestNG ist nicht KISS-able
31
TestNG4
31
42
41
Endstand
42
If You Only Remeber One Thing…Developer Testing muss professionalisiert werden.
Die nächste Test-Framework Generationunterstützt Sie dabei, wobei hier TestNG dieNase vorn hat. JUnit 4 ist für das Unit-Testingnoch immer gut geeignet – für höhereTestebenen sieht man dem Konzept aber dasAlter an.
http://del.icio.us/adersberger/junit4
http://del.icio.us/adersberger/testng
LinksIm November:
43
Anhang
44
Professional TDD
Analyse,Spezifikation
Testentwicklung
Programm-entwicklung
Meta-Tests
Prosa,Kontrakte,(math., graph.)Modelle
Testumgebung,Testdaten,Testdrehbuch,Prüfungen,Test-Generatoren
Testüberdeckung,Mutation Testing/ Test durch Sabotage
45
TestNG: Data Provider
46
Ein Blick in die Kristallkugel• JUnit 4++
• Versprochene Testgruppen / Test-Kategorien(in done.txt nicht aber in Code)
• Test von Nebenläufigkeit wird wohl mit dabeisein.
• Nach Kent Beck wird es keine abhängigenMethoden und keine XML-Testkonfigurationgeben – JUnit bleibt Unit-Testing Framework.Auch ist kein JDK 1.4 Support vorgesehen.
47
Ein Blick in die Kristallkugel• TestNG 4.7++ (nach Cedric Beust)
• Intensivere Einbindung von Skriptsprachen (Groovy, Jython)• Stabilere und mächtigere IDE- und Build-Plugins• Integration mit populären Testing-Bibliotheken (HTTPUnit, … )
und Frameworks (Spring, … )
• … und meine Wünsche• Erweitertes DataProvider Konzept (z.B. ExcelProvider).• XML- und Annotations-Syntax sollte man noch (rechtzeitig)
aufpolieren.• Eingebaute Coverage-Analyse, die auf Gruppen basiert und
Grenzwerte angibt.• Testhistorisierung (Erfolgsquote, Coverage, Ausführungszeit)
48
Das Developer Testing Universum
Massereicher Jungstern
4.1
3.8
Weißer Zwerg mitvielen Trabanten
Sternengeburt
49
TestNG Meta-Modelcd TestNG
Group
Suite
Test
ClassMethod