Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht...

30
Software Testing mit JUnit 5 Architektur und neue Features

Transcript of Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht...

Page 1: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

Software Testingmit JUnit 5Architektur und neue Features

Page 2: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

Reinhard Prechtlcodecentric AGMünchen

[email protected]@reinhard_codes

www.codecentric.dewww.reinhard.codes

2

Page 3: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

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

Page 4: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

4

Warum JUnit 5?

Page 5: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

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

Page 6: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

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

Page 7: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

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

Page 8: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

8

JUnit 5

Page 9: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 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

Page 10: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Architektur

- Eine API um Tests zu schreiben

- Eine API um Tests zufinden und zu starten

- Verschiedene Engines um Tests auszuführen

ØSeperation of Concerns

10

Page 11: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Architektur

11

- JUnit5 Engine: Jupiterpackage: org.junit.jupiter

- JUnit4 Engine: Vintagepackage: org.junit.vintage

- ...andere Engines:- Spek (Kotlin)- Specsy (Scala, Groovy, Java)

- JUnit5 Tests durch JUnit4 ausführen:@Runner(JUnitPlatform.class)

Page 12: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Architektur

12

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

Page 13: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

13

JUnit 5 - Erweiterbarkeit

Page 14: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Erweiterbarkeit

14

- 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

Page 15: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Erweiterbarkeit

15

- Beispiel Zeitmessungpublic class BenchmarkExtension implements

BeforeTestExecutionCallback, AfterTestExecutionCallback {

private long start;

@Overridepublic void beforeTestExecution(TestExtensionContext ctx) {start = currentTimeMillis();

}@Overridepublic void afterTestExecution(TestExtensionContext ctx) {System.out.println(

“Test “ + ctx.getDislayName() + “ took “ + currentTimeMillis() – start +“ ms“);

}}

Page 16: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Erweiterbarkeit

16

- Beispiel konditionale Testausführung

public class DisabledWhenExternalSystemUnavailableExtensionimplements TestExecutionCondition {

@Overridepublic ConditionEvaluationResult

evaluate(TestExtensionContext ctx) {

if (externalSystemAvailable()) {return enabled(“External system is available“);

} else {return disabled(“External system isn‘t available!“)

}

}// ...}

Page 17: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Erweiterbarkeit

17

- Anwendung einer Extension@ExtendWith(BenchmarkExtension.class)public class SomeTests {

// ...}

- ...oder mit Meta-Annotations@ExtendWith(BenchmarkExtension.class)public @interface Benchmarked {}

@Benchmarkedpublic class SomeTests {

// ...}

Page 18: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Erweiterbarkeit

18

Fazit:

- sehr flexibel- gut kombinierbar- Anpassbar durch Meta-Annotationen

Page 19: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

19

JUnit 5 – Neue Features

Page 20: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Features

20

• Assertions• Assumptions• Nested tests• Display names• Dynamic tests• Conditional tests

Page 21: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Assertions

21

- Nur Basis AssertionsassertTrue(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);

Page 22: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 - Assumptions

22

- Wer kennt Assumptions?

assumeTrue(service.isEnabled(), “Expected to be true“);

assumeFalse(expected, actual, ( ) -> “That didn‘t work!“);

assumingThat(service.isEnabled(), ( ) -> { /* Do something */ };

Page 23: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 – Nested Tests

23

- Tests können verschachtelt werden

@Nested

Page 24: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 – Display Names

24

- 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());

}

}

Page 25: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 – Dynamic Tests

25

- Parametrisierte Tests in JUnit 4

@RunWith(Parameterized.class)public class FibonacciTest {

@Parameterspublic 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;

}

@Testpublic void test() {

assertEquals(expected, Fibonacci.compute(input)); }

}

Page 26: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 – Dynamic Tests

26

- Parametrisierte Tests mit JUnit 5 durch „Dynamic Tests“

public class AddressTests {

@TestFactorypublic 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“)),

}

}

Page 27: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

JUnit 5 – Conditional Tests

27

- Tests können deaktiviert werden

public class AddressTests {

@Test@Disabledpublic void shouldHaveValidCity() {assertEquals(“Ort“, addressService.getAddresse().getOrt());

}

}

- ExecutionConditions können deaktiviert werden!

Page 28: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

Zum Schluss...

28

• Was fehlt noch?

• Lifecycle-Callbacks für dynamische Tests• Statische, parametrisierte Tests• Szenario Tests• Parallele Testausführung

Page 29: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

Zum Schluss...

29

• 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

Page 30: Software Testing mit JUnit 5 - reinhard.codes · Software Testing mit JUnit 5 ... -Ich bin nicht selbst im JUnit Projekt aktiv-JUnit 5 ist Work in Progress-https: ... (Java 8 ) •

30

Vielen Dank

@reinhard_codes