Slide 1

Slide 1 text

5 NEUES VON JUNIT 5 FROM REVOLUTION TO CONTINUOUS EVOLUTION

Slide 2

Slide 2 text

5 MARC PHILIPP So ware Engineer bei JUnit Commi er seit 2012 Team Lead seit 2016 Twi er: Web: @marcphilipp marcphilipp.de

Slide 3

Slide 3 text

5 ✋ SHOW OF HANDS

Slide 4

Slide 4 text

5 JUNIT 5 RELEASES 5.0 – 10. September 2017 5.1 – 18. Februar 2018 5.2 – 29. April 2018 5.3 – 11. September 2018 5.4 – 7. Februar 2019 5.5 – Juni 2019

Slide 5

Slide 5 text

5 AGENDA 1. Wie schreibt man Tests und Extensions mit JUnit 5? 2. Was ist die JUnit Pla orm und wozu ist sie gut? 3. Was kommt noch und die fängt man mit JUnit 5 an?

Slide 6

Slide 6 text

5 JUNIT JUPITER JUNIT JUPITER JUNIT JUPITER JUNIT JUPITER JUNIT JUPITER DAS NEUE TESTING FRAMEWORK FÜR JAVA DAS NEUE TESTING FRAMEWORK FÜR JAVA DAS NEUE TESTING FRAMEWORK FÜR JAVA DAS NEUE TESTING FRAMEWORK FÜR JAVA DAS NEUE TESTING FRAMEWORK FÜR JAVA Image: NASA

Slide 7

Slide 7 text

5 JUPITER? Nein, “Jupiter” ist einfach ein neuer Name zur besseren Unterscheidung der verschiedenen Teile von JUnit 5. … und es ist der fün e Planet von der Sonne aus gezählt. Is wri ng tests rocket science now?

Slide 8

Slide 8 text

5 BASICS (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20190603‑etka

Slide 9

Slide 9 text

5 BASICS (RECAP) @Test ist jetzt in org.junit.jupiter.api @Disabled ansta @Ignore @BeforeAll , @BeforeEach , @AfterEach , @AfterAll haben neue Namen Assertions sehen ähnlich aus – zusätzlich assertThrows , assertAll Eigene @DisplayNames sta Camel Case @TestInstance(PER_METHOD oder PER_CLASS) @Tag ansta @Category

Slide 10

Slide 10 text

5 DISPLAY NAME GENERATORS 5.4 @DisplayNameGeneration(ReplaceUnderscores.class) class A_year_is_not_supported { @Test void if_it_is_zero() {/*...*/} @ParameterizedTest @ValueSource(ints = { -1, -4 }) void if_it_is_negative(int year) {/*...*/} }

Slide 11

Slide 11 text

5 TEST METHOD ORDERING 5.4 @TestMethodOrder(Random.class) hil sicherzustellen, dass Tests nicht Reihenfolge‑abhängig sind @TestMethodOrder(Alphanumeric.class) und @TestMethodOrder(OrderAnnotation.class) für Integra onstests Erweiterbar: MethodOrderer implemen eren

Slide 12

Slide 12 text

5 KOTLIN SUPPORT 5.1 import org.junit.jupiter.api.* class KotlinAssertionsDemo { @Test fun `expected exception testing`() { val exception = assertThrows { Calculator().divide(1, 0) } assertEquals("/ by zero", exception.message) } @Test fun `grouped assertions`() { assertAll("Person properties", { assertEquals("Jane", person.firstName) }, { assertEquals("Doe", person.lastName) } ) } }

Slide 13

Slide 13 text

5 WEITERE TESTARTEN (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20190603‑etka

Slide 14

Slide 14 text

5 WEITERE TESTARTEN (RECAP) @ParameterizedTest mit versch. @Source ‑Annota onen @ValueSource , @EnumSource , @CsvSource , @CsvFileSource , @MethodSource , @NullSource 5.4 , @EmptySource 5.4 , @ArgumentsSource(MyProvider.class) , @YourCustomSource @RepeatedTest für “flaky” Tests @TestFactory um dynamisch Tests zu produzieren

Slide 15

Slide 15 text

5 PARALLEL EXECUTION 5.3 (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20190603‑etka

Slide 16

Slide 16 text

5 PARALLEL EXECUTION 5.3 (RECAP) Tests laufen standardmäßig sequenziell Parallele Ausführung lässt sich per Configura on Parameter ak vieren @Execution(SAME_THREAD oder CONCURRENT) @ResourceLock zur deklara ven Synchronisa on

Slide 17

Slide 17 text

5 EXTENSIONS (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20190603‑etka

Slide 18

Slide 18 text

5 EXTENSIONS (RECAP) Registrierung (beliebig viele gleichzei g): Deklara v: @ExtendWith an Klassen oder Methoden Programma sch: @RegisterExtension an Feldern 5.1 Global: per ServiceLoader (s. ) Implemen erung: Extension Marker Interface 1 Extension – n Extension Points/Interfaces User Guide

Slide 19

Slide 19 text

5 COMPOSED ANNOTATIONS Jupiter‑Annota on können als Meta‑Annota on verwendet werden, um eigene Annota onen zu definieren. @Retention(RUNTIME) @Target(METHOD) @ExtendWith(DisabledOnWeekdaysExtension.class) @Tag("example") public @interface DisabledOnWeekdays { DayOfWeek[] value(); }

Slide 20

Slide 20 text

5 EXTENSION POINTS Lifecycle: BeforeAllCallback , BeforeEachCallback , BeforeTestExecutionCallback , TestExecutionExceptionHandler , LifecycleMethodExecutionExceptionHandler 5.5 , AfterTestExecutionCallback , AfterEachCallback , AfterAllCallback , InvocationInterceptor 5.5 Andere: ExecutionCondition , ParameterResolver , TestInstanceFactory 5.3 , TestInstancePostProcessor , TestWatcher 5.4 , TestTemplateInvocationContextProvider

Slide 21

Slide 21 text

5 TEMPORÄRE VERZEICHNISSE 5.4 import org.junit.jupiter.api.io.TempDir; @Test void writeAndReadFile(@TempDir Path tempDir) throws Exception { Path testFile = tempDir.resolve("test.txt"); Files.write(testFile, asList("foo", "bar")); List actualLines = Files.readAllLines(testFile); assertIterableEquals(asList("foo", "bar"), actualLines); }

Slide 22

Slide 22 text

5 BEDINGTE AUSFÜHRUNG 5.1 @EnabledOnOs / @DisabledOnOs({LINUX, MAC, …}) @EnabledOnJre / @DisabledOnJre({JAVA_11, …}) @Enabled / DisabledIfSystemProperty(named = "someKey", matches = "someValue") @Enabled / DisabledIfEnvironmentVariable(named = "SOME_KEY", matches = "SOME_VALUE")

Slide 23

Slide 23 text

5 DEKLARATIVE TIMEOUTS 5.5 @BeforeEach @Timeout(10) void setUp() { // schlägt fehl, falls Ausführung länger als 10 Sekunden dauert } @Test @Timeout(value = 500, unit = MILLISECONDS) void someTest() { // schlägt fehl, falls Ausführung länger als 500 Millisekunden dauert }

Slide 24

Slide 24 text

5 THIRD‑PARTY EXTENSIONS JUnit Pioneer, Spring, Mockito, Testcontainers, Docker, Wiremock, JPA, Selenium/WebDriver, DbUnit, Ka a, Jersey, GreenMail, S3Mock, Citrus Framework, XWiki, … h ps:/ /github.com/junit‑team/junit5/wiki/Third‑party‑ Extensions

Slide 25

Slide 25 text

5 AGENDA 1. Wie schreibt man Tests und Extensions mit JUnit 5? ✅ 2. Was ist die JUnit Pla orm und wozu ist sie gut? 3. Was kommt noch und die fängt man mit JUnit 5 an?

Slide 26

Slide 26 text

5 JUNIT PLATFORM JUNIT PLATFORM JUNIT PLATFORM JUNIT PLATFORM JUNIT PLATFORM PLATTFORM ZUM TESTEN AUF DER JVM PLATTFORM ZUM TESTEN AUF DER JVM PLATTFORM ZUM TESTEN AUF DER JVM PLATTFORM ZUM TESTEN AUF DER JVM PLATTFORM ZUM TESTEN AUF DER JVM Image: NASA

Slide 27

Slide 27 text

5 JUNIT ALS PLATTFORM? JUnit war schon immer eine Pla orm für IDEs und Build Tools für andere Tes ng Frameworks Enge Kopplung (interne APIs, Reflec on, Serializa on)

Slide 28

Slide 28 text

5 COUPLING

Slide 29

Slide 29 text

5 Wenn JUnit eine Pla orm ist, dann sollten wir die Architektur darauf auslegen!

Slide 30

Slide 30 text

5 TRENNUNG VON VERANTWORTLICHKEITEN 1. API zum Schreiben von Tests und Extensions (Jupiter API) 2. Erweiterbarer Mechanismus zum Auffinden und Ausführen von Tests (Test Engine SPI) 3. API zur Testausführung durch IDEs und Build Tools (Launcher API)

Slide 31

Slide 31 text

5 DESIGN‑ZIELE Flexibilität: Neue Features hinzuzufügen ist einfach. Es ist klar, ob eine Änderung problema sch ist oder nicht. Rückwärtskompa bilität: JUnit 3/4 Tests laufen immer noch Vorwärtskompa bilität: Alte IDEs und Build Tools können neue Tests ausführen

Slide 32

Slide 32 text

5

Slide 33

Slide 33 text

5 JUNIT 5 = JUPITER + VINTAGE + PLATFORM

Slide 34

Slide 34 text

5 THIRD‑PARTY ENGINES Specsy, Spek, KotlinTest, Cucumber, Drools, jqwik, Brahms, Mainrunner, … h ps:/ /github.com/junit‑team/junit5/wiki/Third‑party‑ Extensions

Slide 35

Slide 35 text

5 MEHRERE TEST ENGINES (DEMO) h ps:/ /github.com/marcphilipp/junit5‑pla orm‑demo

Slide 36

Slide 36 text

5 MEHRERE TEST ENGINES (RECAP) Mehrere Test Engines können in einem Testlauf verwendet werden Unterscheidung zwischen Abhängigkeiten in testImplementation und testRuntimeOnly Erlaubt eine schri weise Migra on von einer Test Engine zur anderen (z.B. von Vintage nach Jupiter)

Slide 37

Slide 37 text

5 KOMPATIBILITÄT / MIGRATION Vintage Engine führt JUnit 3/4 Tests auf der Pla orm aus @Category(UI.class) entspricht com.acme.UI ‑Tag Teilweise Unterstützung von JUnit 4 Rules Unterstützung von @Ignore 5.4 IDEs können Testklassen in die Jupiter API konver eren Migra onswerkzeug aus der Community: h ps:/ /github.com/junit‑pioneer/convert‑junit4‑to‑junit5

Slide 38

Slide 38 text

5 BUILD TOOLS Gradle (≥ 4.6), Ant (≥ 1.10.3) und Maven Surefire (≥ 2.22.0) unterstützen die JUnit Pla orm Mit dem ConsoleLauncher kann man Tests über die Kommandozeile ausführen und in andere Build Tools (z.B. Bazel) integrieren

Slide 39

Slide 39 text

5 IDES Sehr gute Unterstützung IntelliJ IDEA (≥ 2016.2) Eclipse (≥ 4.7.1a) Visual Studio Code (Java Test Runner ≥ 0.4.0) Netbeans (≥ 10.0) Für andere IDEs gibt es @RunWith(JUnitPlatform)

Slide 40

Slide 40 text

5 TAG EXPRESSIONS 5.1 Erlauben präzise anzugeben, welche Tests basierend auf Tags ausgeführt werden sollen: test { useJUnitPlatform { includeTags("(smoke & feature-a) | (!smoke & feature-b)") } }

Slide 41

Slide 41 text

5 UNTERSTÜTZUNG FÜR MODULE 5.1 Alle Tests in einem Modul ausführen: Den Modulpfad scannen: $ java -jar junit-platform-console-standalone-1.4.0.jar \ --select-module com.acme.foo $ java -jar junit-platform-console-standalone-1.4.0.jar \ --scan-modules

Slide 42

Slide 42 text

5 AGENDA 1. Wie schreibt man Tests und Extensions mit JUnit 5? ✅ 2. Was ist die JUnit Pla orm und wozu ist sie gut? ✅ 3. Was kommt noch und die fängt man mit JUnit 5 an?

Slide 43

Slide 43 text

5 ROADMAP UND ROADMAP UND ROADMAP UND ROADMAP UND ROADMAP UND RESSOURCEN RESSOURCEN RESSOURCEN RESSOURCEN RESSOURCEN Image: NASA

Slide 44

Slide 44 text

5 ROADMAP Wiederverwendbare Discovery für Test Engines 5.5 M1 Testausführung in nutzerdefinierten Threads 5.5 RC1 Deklara ve/globale Timeouts 5.5 RC1 Repor ng‑Format, das neue Features unterstützt (z.B. Tags, Display Names, Report Entries) 5.6 M1 Deklara ve Test Suiten Parametrisierte Testklassen Eure Ideen?

Slide 45

Slide 45 text

5 LOSLEGEN? LOSLEGEN! User Guide: Beispielprojekte für Ant, Bazel, Gradle und Maven: Javadoc: h p:/ /junit.org/junit5/docs/current/user‑guide/ h ps:/ /github.com/junit‑team/junit5‑samples h p:/ /junit.org/junit5/docs/current/api/

Slide 46

Slide 46 text

5 GESUCHT: FEEDBACK! StackOverflow: Code & Issues: Chat mit dem Team: Twi er: h p:/ /stackoverflow.com/ques ons/tagged/junit5 h ps:/ /github.com/junit‑team/junit5/ h ps:/ /gi er.im/junit‑team/junit5 h ps:/ /twi er.com/juni eam

Slide 47

Slide 47 text

5 UNTERSTÜTZT DAS JUNIT‑TEAM! h ps:/ /junit.org/sponsoring

Slide 48

Slide 48 text

5 BEISPIEL‑CODE Jupiter: Pla orm: h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20190603‑etka h ps:/ /github.com/marcphilipp/junit5‑pla orm‑demo

Slide 49

Slide 49 text

5 FRAGEN? / auf Twi er @marcphilipp @juni eam

Slide 50

Slide 50 text

5 VIELEN DANK!

Slide 51

Slide 51 text

Bitte geben Sie uns jetzt Ihr Feedback! Neues von JUnit 5.x: From Revolution to Continuous Evolution Marc Philipp Nächste Vorträge in diesem Raum 11:45 Best Practices für moderne Multicore‑Programmierung, Prof. Dr. Jörg Hettel 13:30 GraphQL als Schnittstelle zum Backend, Christian Kumpe, Thorben Hischke 14:30 Integration ist schwer, Integrationstests umso mehr, Benjamin Muskalla 5