Software Testing mit JUnit 5. Architektur und neue Features

Ähnliche Dokumente
Marc Philipp. Senior Software Karlsruhe. JUnit Maintainer seit Web:

Marc Philipp. Senior Software Karlsruhe. JUnit Maintainer seit Web:

Sonderdruck von. Die neue Generation des Unit-Testens! JUnit 5. Tobias Voß. Tobias Voß / JUnit 5

JUnit 5 Design und Architektur eines Frameworks

Bessere Tests mit JUnit 4.x Marc Philipp. 1. Juli 2010

Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn. Testen. Tutorial im Rahmen des Software(technik)praktikums SS 2012

Andreas Mösching Senior IT Architekt Hewlett-Packard (Schweiz) GmbH HP Banking Service Center Bern

OOSE4 Testen mit BlueJ/JUnit 4

II.4.5 Generische Datentypen - 1 -

JUnit 4.11 Die Neuerungen

Struts 2 Das Imperium schlägt zurück?

Fortgeschrittenes Programmieren mit Java. Test Driven Development

JUnit. Software-Tests

Smartphone Entwicklung mit Android und Java

Web-Anwendungen mit Arquillian testen

Auszug aus JAX-WS Folien

Webtests und JMeter. Technologien: Überblick Funktionale Tests: Simplelenium Performance Messungen: JMeter Projekt Setup: Gradle, Jenkins

Handbuch für die Erweiterbarkeit

Java - Programmierung - Objektorientierte Programmierung 1

Property Based Testing

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

Java Reflection. Andreas Lochbihler. 15. Mai Lehrstuhl Programmierparadigmen Universität Karlsruhe

TDD. mit JUnit & Mockito. Tobias Trelle, codecentric

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Wie ich lernte die API zu lieben. 19. März sic[!]sec GmbH Industriestraße Gröbenzell

Deklaration einer Klasse Innere innerhalb Klassen einer in Ja anderen v a Klasse

Spring Dynamic Modules for OSGi Service Platforms

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Modulare Anwendungen und die Lookup API. Geertjan Wielenga NetBeans Team Deutschsprachige Überarbeitung, Aljoscha Rittner NetBeans Dream Team

3. Dokumentieren und Testen Advanced Programming Techniques Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Testen mit JUnit. Motivation

Interface. So werden Interfaces gemacht

Integration von Web Services in J EE Anwendungen mit XFire. 1/26 André Janus - Integration von Web Services in J EE Anwendungen mit XFire

Programmieren in Java

Software-Entwurfsmuster

Übungsstunde 10. Einführung in die Programmierung I

Test-driven development JUnit-Test. Lars Varain

Gebundene Typparameter

Das Test-Framework JUnit ETIS SS04

Java Einführung Abstrakte Klassen und Interfaces

Mock-Objekte. Universität Karlsruhe (TH) Fakultät für Informatik Lehrstuhl für Programmiersysteme. Forschungsuniversität gegründet 1825

II.3.1 Rekursive Algorithmen - 1 -

A very very very very short intro to. Testing

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation

Java 8. basierend auf Folien von Florian Erhard

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

JUnit 4 Tutorial. Wolfgang Stöttinger

Christian Meder inovex. Sauberes Grün QS für Android

Der EMF-generierte Code. 7. November 2012

JUnit. HierarchicalContextRunner. Mehr Struktur. TDD. Clean Code. Verantwortung. Skills. Namics. Stefan Bechtold. Principal Software Engineer.

Programmentwicklung ohne BlueJ

JAX-RS 2.0 REST mit Java EE 7

Programmierprojekt: So0ware Tests. Anne6e Bieniusa Sommersemester 2017

Java für C++ Programmierer

4. Vererbung Die Klasse Object. Die Klasse Object

Projektgruppe. Thomas Kühne. Komponentenbasiertes Software Engineering mit OSGi

Spock und Geb (WebDriver) Wie können freie Werkzeuge zum strukturierten Testen von Web-Applicationen eingesetzt werden?

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

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Einstieg in die Informatik mit Java

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

OOP. Tagesprogramm. Aspektorientierte Programmierung. Annotationen

Spring Dynamic Modules for OSGi Service Platforms

Aspektorientierte Programmierung

Oliver Paulus, 7. Februar Spring Framework Einführung. Oliver Paulus, Was ist Spring?

Spracherweiterungen in Java 5

OCP Java SE 8. Lambda

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Enterprise JavaBeans Überblick

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmieren 2 Java Überblick

Programmieren 2 Java Überblick

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Übungsstunde 10. Einführung in die Programmierung

Systematisches Testen

Groovy und CouchDB. Ein traumhaftes Paar. Thomas Westphal

Einführung in Google Web Toolkit

Programmierung 2 Studiengang MI / WI

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Support für eingebettete und anonyme Klassen in MemoryCounter und warum es nicht funktioniert

Javaaktuell. Java ist vielseitig. ijug. Praxis. Wissen. Networking. Das Magazin für Entwickler Aus der Community für die Community

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

OSGI DECLARATIVE SERVICES

Schritt 4: Hallo Enterprise Bean

Familienpolymorphismus

Ich liebe Java && Ich liebe C# Rolf Borst

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Naviki GPS-Anwendungsentwicklung für Mobiltelefone

1 Abstrakte Klassen, finale Klassen und Interfaces

Testgetriebene Entwicklung mit JUnit4

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Klasse Label. class Label { Code code; List<Integer> fixuplist; // code positions to patch int adr; // address of label in code

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

Generische Datenstrukturen

12) Generische Datenstrukturen

Programmierkurs Java

Schnittstellen, Stack und Queue

Transkript:

Software Testing mit JUnit 5 Architektur und neue Features

Reinhard Prechtl codecentric AG München reinhard.prechtl@codecentric.de @reinhard_codes www.codecentric.de www.reinhard.codes 2

Disclaimer - Ich bin nicht selbst im JUnit Projekt aktiv - JUnit 5 ist Work in Progress - https://github.com/junit-team/junit5/ - Mehr Infos u.a.: http://junit.org/junit5/docs/5.0.0-m2/user-guide/ http://blog.codefx.org/tag/junit-5/ - Videos von Sam Brannen und Nicolai Parlog auf Youtube 3

Warum JUnit 5? 4

JUnit JUnit 4 fast 20 Jahre alt Hervorragende Toolunterstützung aktuell Version 4.12 Keine Unterstützung von modernen Sprachfeatures (Java 8) Erfolg und langsame Entwicklung bedingen sich gegenseitig 5

JUnit JUnit 4 One JAR to rule them all: IDEs, Buildtools, Entwickler, Erweiterungen benutzen das gleiche Artefakt Keine Tool-spezifische API, vieles ist mit Reflection umgesetzt Großer Erfolg von JUnit 4 erschwert Weiterentwicklung 6

JUnit 4 Erweiterungsmöglichkeiten Runners (seit 4.0): Sehr mächtig, sehr schwergewichtig keine Kombination möglich bspw: Parametrized, Categories Rules (seit 4.7): Eigene Objekte in Testablauf injizieren Flexibler als Runner MethodRules/ClassRules Nur before/after bspw: ExpectedException, MockitoRule 7

JUnit 5 8

JUnit 5 - JUnit 5 durch Crowdfunding gestartet - Work in Progress - Besonders im Fokus: - Modularisierung - Erweiterbarkeit - Verwendung neuer Sprachfeatures (JUnit Lambda) - Kompatibilität - Erste Integration in IDEs und Buildtools 9

JUnit 5 - Architektur - Eine API um Tests zu schreiben - Eine API um Tests zu finden und zu starten - Verschiedene Engines um Tests auszuführen ØSeperation of Concerns 10

JUnit 5 - Architektur - JUnit5 Engine: Jupiter package: org.junit.jupiter - JUnit4 Engine: Vintage package: org.junit.vintage -...andere Engines: - Spek (Kotlin) - Specsy (Scala, Groovy, Java) - JUnit5 Tests durch JUnit4 ausführen: @Runner(JUnitPlatform.class) 11

JUnit 5 - Architektur - Modularer Aufbau - Vorwärts- und rückwärtskompatibel - Ermöglicht sanfte Migration - Öffnet die gesamte Plattform 12

JUnit 5 - Erweiterbarkeit 13

JUnit 5 - Erweiterbarkeit - Extension Points statt Features : - BeforeAll Callback - BeforeEach Callback - BeforeTest Execution - AfterTest Execution - AfterEach Callback - AfterAll Callback - Test Execution Condition / Container Execution Condition - TestInstance PostProcessor - Parameter Resolution - Exception Handling 14

JUnit 5 - Erweiterbarkeit - Beispiel Zeitmessung public class BenchmarkExtension implements BeforeTestExecutionCallback, AfterTestExecutionCallback { private long start; @Override public void beforetestexecution(testextensioncontext ctx) { start = currenttimemillis(); @Override public void aftertestexecution(testextensioncontext ctx) { System.out.println( Test + ctx.getdislayname() + took + currenttimemillis() start + ms ); 15

JUnit 5 - Erweiterbarkeit - Beispiel konditionale Testausführung public class DisabledWhenExternalSystemUnavailableExtension implements TestExecutionCondition { @Override public ConditionEvaluationResult evaluate(testextensioncontext ctx) { if (externalsystemavailable()) { return enabled( External system is available ); else { return disabled( External system isn t available! ) //... 16

JUnit 5 - Erweiterbarkeit - Anwendung einer Extension @ExtendWith(BenchmarkExtension.class) public class SomeTests { //... -...oder mit Meta-Annotations @ExtendWith(BenchmarkExtension.class) public @interface Benchmarked { @Benchmarked public class SomeTests { //... 17

JUnit 5 - Erweiterbarkeit Fazit: - sehr flexibel - gut kombinierbar - Anpassbar durch Meta-Annotationen 18

JUnit 5 Neue Features 19

JUnit 5 - Features Assertions Assumptions Nested tests Display names Dynamic tests Conditional tests 20

JUnit 5 - Assertions - Nur Basis Assertions asserttrue(service.isenabled(), Expected to be true ) assertequals(expected, actual, () -> That didn t work! ) assertall( Adresstests, ( ) -> assertequals( Nürnberg, addresse.getort()), ( ) -> assertequals( 90411, addresse.getplz()); ); Exception ex = assertthrows(exception.class, service::invoke); asserttimeout(duration.parse( PT0.500S ), service::invoke); asserttimeoutpreemptivly(duration.parse( PT0.500S ), service::invoke); 21

JUnit 5 - Assumptions - Wer kennt Assumptions? assumetrue(service.isenabled(), Expected to be true ); assumefalse(expected, actual, ( ) -> That didn t work! ); assumingthat(service.isenabled(), ( ) -> { /* Do something */ ; 22

JUnit 5 Nested Tests - Tests können verschachtelt werden @Nested 23

JUnit 5 Display Names - Für Tests können Namen vergeben werden @DisplayName( Eine Adresse sollte ) public class AddressTests { //... @Test @DisplayName( einen gültigen Ort besitzen ) public void shouldhavevalidcity() { assertequals( Ort, addressservice.getaddresse().getort()); 24

JUnit 5 Dynamic Tests - Parametrisierte Tests in JUnit 4 @RunWith(Parameterized.class) public class FibonacciTest { @Parameters public static Collection<Object[]> data() { return Arrays.asList(new Object[][] { {0, 0, { 1, 1, { 2, 1, { 3, 2 ); private int finput; private int fexpected; public FibonacciTest(int input, int expected) { this.input= input; this.expected= expected; @Test public void test() { assertequals(expected, Fibonacci.compute(input)); 25

JUnit 5 Dynamic Tests - Parametrisierte Tests mit JUnit 5 durch Dynamic Tests public class AddressTests { @TestFactory public List<DynamicTest> createsometests() { return Arrays.asList( DynamicTest.dynamicTest( This test is dynamically created, () -> assertequals(1, 1, One should be one )), DynamicTest.dynamicTest( This test is also dynamically created, () -> assertequals(2, 2, One should be one )), 26

JUnit 5 Conditional Tests - Tests können deaktiviert werden public class AddressTests { @Test @Disabled public void shouldhavevalidcity() { assertequals( Ort, addressservice.getaddresse().getort()); - ExecutionConditions können deaktiviert werden! 27

Zum Schluss... Was fehlt noch? Lifecycle-Callbacks für dynamische Tests Statische, parametrisierte Tests Szenario Tests Parallele Testausführung 28

Zum Schluss... Neue Architektur öffnet die Plattform Viele neue Möglichkeiten durch Extensionpoints Tool-Support schon jetzt vorhanden JUnit 5 ist Gesprächsthema und wird sich durchsetzen 29

Vielen Dank @reinhard_codes 30