INTEGRATION TEST HELL ODER WIE INTEGRATIV SOLL ICH TESTEN? David Völkel XPDays Germany 14.11.2013
ÜBER MICH David Völkel IT-Consultant für codecentric Twitter: @davidvoelkel Schwerpunkte: Test-Driven Development Softwaredesign & Clean Code Software Craftsman @softwerkskammer 2
PROBLEM INTEGRATION TEST HELL? Fehler trotz Unit- Tests zu viele integrative Tests Kosten $$$ 3
Integrationsgrad Integrative Tests LÖSUNG: TESTPYRAMIDE UI Service Unit-Tests. & Unit effektive Teststrategie Pyramide nach Martin Fowler 4
so what 5
DOCH KOMPLEXER 6
?? Unit 7
AGENDA - Kosten vs. Nutzen - Isolation vs. Integration - Akzeptanztests - GUI? - Resume
WELCHES QUALITÄTSLEVEL BRAUCHE ICH? $(Tests) = Nutzen - Kosten (A)TDD unterstützt Entwicklung Risikominimierung Risiko = Schaden * Wahrscheinlichkeit unangemessene Testauswahl 20% der Tests 80% Nutzen Menge, Art, Integrationsgrad Tests Risikobewertung unterschiedlich je Domäne Prototyp bis sicherheitkritisch Tests an an Kosten und Nutzen ausrichten!
EIGENSCHAFTEN DER TESTARTEN Isolierende Tests Feedback schnell langsam Fehlerfindung einfach schwer Fragilität gering hoch Kosten Entwicklung & Wartung Aussagekraft für Nutzer Stärken billig gering Breite, Logik, Komplexität Integrierende Tests teuer hoch Tiefe, Datenflüsse, Integration 10
WAS SAGEN DIE EXPERTEN? UI Service Unit Unit "Integrated Tests Are a Scam" J.B. Rainsberger ATDD z.b. GOOS, Continuous Delivery wörtliche Interpretation 11
ATDD Akzeptanztest E2E treibt jedes Feature Systemdesign Auslegungssache Extrem Jez Humble Abschwächung mit Testpyramide Tests ggf. runterdrücken Nat Pryce James Crisp (70%, 20%, 10%) 1 x Akzeptanztest N x Unittests 12
"INTEGRATED TESTS ARE A SCAM" Splitting integrated test Decomposition Fallacy? #Testfälle: n x m => n + m! integrated test n x m collaboration test test double contract test n + m 13
SRP FÜR TESTS? Deduplizierung von Testfalllogik Integrativer Test enthält Teile der Unittests auf dem Weg Fokus: Integration Orthogonalisierung http://commons.wikimedia.org/wiki/file:divide-and-conquer.jpg?uselang=de
ORTHOGONALISIERUNG Beispiel: Email-Validierung Funktionaler Test schmal und tief Service oder UI Fokus: Integration Eingabe ungueltige@email gültige@email.de Ausgabe Mail ungültig Mail OK Unittests breit, jedes Detail testen GUI Test Double Validator
AKZEPTANZTESTS
AKZEPTANZTESTS Fokus Kundennutzen Funktionale- statt Entwicklertests Sprache der Fachlichkeit Orthogonal zum Integrationsgrad
PYRAMIDE FÜR AKZEPTANZTESTS UI Service Unit
PROZESS FÜR AKZEPTANZTESTS Akzeptanztests User Stories Scenarios Implementierung Step Definitions Unittests BDD ATDD Richtige Ebene?
Integrationsgrad INTEGRATIONSGRAD VS. FACHLICHKEIT E2E business readable technical Service 2 Dimensionen ( etwas abhängig ) Unit Inspiriert durch "the testing iceberg von Seb Rose / Matt Wynne
GUI TESTS
Stabilität & Klarheit 3 EBENEN VON GUI-TESTS Rule Workflow Oberen Ebenen eigentlich Akzeptanztests Tests hoch drücken Page Objects wrappen scripting Smell Wiederverwendung? Beispiele Technisches Scripting Gojko Adzics "UI testing without shooting yourself in the foot"
GUI-TESTS Isolation? Subcutanous Testing (z.b. MVP) Kompletter Presentation Layer + Service Doubles Menge wenige Grober Pfad über alle Seiten und Elemente ohne Logik! viele extrahierte User Journeys vollständig alle Stories
FAZIT Fokus auf Wert der Tests Risiken sind extrem kontextabhängig => Spitzheit der Pyramide Test Pyramide Hohe Unittest-Abdeckung Wenige integrative Tests, da teuer Orthogonal zueinander, SRP für Tests Viele Dimensionen Integrationsgrad funktional vs. technisch GUI
QUELLEN Bücher "Continuous Delivery" - Jez Humble, Dave Farley "Growing Object-Oriented Software, Guided by Tests" - Steve Freeman, Nat Pryce "Specification by Example" - Gojko Adzic GOOS Mailingliste https://groups.google.com/forum/#!forum/growing-objectoriented-software "Integrated Tests are a scam" - J.B. Rainsberger http://www.jbrains.ca/permalink/using-integration-testsmindfully-a-case-study http://www.jbrains.ca/permalink/integrated-tests-are-a-scampart-1 "The Testing Iceberg" - Matt Whyne und Seb Rose http://claysnow.co.uk/the-testing-iceberg/
QUELLEN End-to-end Tests? http://www.higherorderlogic.com/2010/01/responding-to-brianmarick http://www.exampler.com/blog/2010/01/08/some-preliminarythoughts-on-end-to-end-testing-in-growing-object-orientedsoftware/ Testing-Pyramide im Kontext Continuous Delivery, James Crisp http://jamescrisp.org/2011/05/30/automated-testing-and-thetest-pyramid/ Wartbare Acceptance Tests, Jez Humble http://de.slideshare.net/jezhumble/creating-maintainableautomated-acceptance-tests http://skillsmatter.com/podcast/agile-testing/the-long-termvalue-of-acceptance-tests
FRAGEN UND DISKUSSION David Völkel Landsberger Str. 302 80687 München Twitter: @davidvoelkel david.voelkel@codecentric.de www.codecentric.de blog.codecentric.de www.meettheexperts.de http://commons.wikimedia.org/wiki/file:orange_question_mark.svg?uselang=de 27
LIZENZ Attribution-ShareAlike 3.0 Germany http://creativecommons.org/licenses/by-sa/3.0/de/ 28
ERGÄNZUNGEN
Ports-and-Adapters Architecture ports = system interfaces adapters = übersetzen zwischen bounded contexts domain dependency inversion => testbare domain System Domain Adapters
Hexagonal Architecture Klassifizierung der Ports input vs output "us vs. them" 3rd Party Systems System User Domain Adapters
UNIT TESTS test doubles zur Isolation ausgehender Adapter Trennung Mapping von Transport möglich? Proprietäres Format? z.b. HTTP vs. JDBC => nur dann isoliert testbar Unit Tests System 3rd Party Systems Domain Adapters Unit Tests
INTEGRATION TESTS Vorsicht: 3 Bedeutungen!!! Komponententest Komponententest Integrationstest zu Drittsystemen allgemein integrativer Test z.b. auch Systemtest Domain Integrationtest Adapters
Systemtest im Backdoor Fall - test als test double - alternativ Simplicator Pattern Systemtest System Domain Adapters
END-TO-END-TESTS Besonders teuer System & Drittsystem unter Test Reicht "Front Door"? Drittsystem Herschafft des Drittsystems? Kopplung? End-to-End-test Domain Adapters End-to-End-test Front Door
ABKOPPLUNG DRITTSYSTEME Integration Contract Test Impersonator Pattern evtl. als Self initializing Fakes Simplicator, falls proprietär Integration Contract Tests End-to-End-test Impersonator Domain Adapters