44
JUnit 5 Die Plattform Johannes Link

JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

JUnit 5 Die Plattform

Johannes Link

Page 2: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

@johanneslinkjohanneslink.net

Page 3: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Softwaretherapeut"In Deutschland ist die Bezeichnung Therapeut allein

oder ergänzt mit bestimmten Begriffen gesetzlich nicht geschützt und daher kein Hinweis auf ein erfolgreich

abgeschlossenes Studium oder auch nur fachliche Kompetenz." Quelle: Wikipedia

Page 4: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

•JUnit-Anwender seit Stunde 1

•JUnit-5 Initiator - zusammen mit Marc Philipp - und Core-Committer im ersten Jahr

•jqwik: Externe JUnit5-Test-Engine für Property-Based Testing

Page 5: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Warum braucht die Welt ein neues JUnit?

Page 6: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

1997 1.0

2006 4.0 Runner

2009 4.7 Rules

2015 JUnit Lambda Campaign

2017 JUnit 5.0.0

A Brief History of JUnit

Page 7: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

JUnit 4 "Architektur"

Page 8: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

4.11 4.12-beta-1

Wartbarkeit

Page 9: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Erfolg von JUnit 4 als Plattform verhindert

Weiterentwicklung von JUnit 4 als Werkzeug!

Page 10: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

JUnit-5 Design-Ziel•Trennung der Aspekte

JUnit als Testwerkzeug und JUnit als Plattform

•JUnit 4 und 5 nebeneinander, um Adoption und Migration zu erleichtern

•Ergebnis: Leichte IDE- und Tool-Integration für beliebige Test-Frameworks

Page 11: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Schritt 1: Trennung von Framework-Nutzung und Framework-Anbindern

•Nutzung (API): ‣ IDE: Anzeigen, Auswahl und Anstoßen von Tests

‣ Programmierer: Schreiben/Spezifizieren von Tests

•Anbinder (SPI) ‣ Interpretation von Testspezifikationen

durch eine Test-Engine

Page 12: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

LauncherTestPlan discover(discoveryRequest)void execute(TestPlan)

<<interface>>TestEngine

discover()void execute()

JupiterTestEngine<<annotation>>@Test

MyTest@Test test1@Test test1

junit-platform-launcher junit-platform-engine

junit-jupiter

myproject

Page 13: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Trennung von Entdecken und Ausführen

Page 14: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Trennung von Entdecken und Ausführen

Page 15: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Schritt 2: Ständiger Fortschrittsbericht eines Testlaufs

•Events / Nachrichten statt Rückgabe eines Ergebnisses

Page 16: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

TestEngineexecute(request)

ExecutionRequest

<<interface>>EngineExecutionListener

void executionStarted(testDescriptor)void executionFinished(testDescriptor, result)

TestExecutionResult

<<enum>>Status

SuccessfulFailedAborted

Throwable

<<interface>>TestDescriptor

children

root

Page 17: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign
Page 18: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Execution Listener

Page 19: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Schritt 3: Gleichzeitiger Einsatz mehrerer Test-Engines

•Jede Test-Engine hat ihre eigene API zur Testfallspezifikation

•Sevice-Provider-Mechanismus von Java zur Registrierung einer Test-Engine

Page 20: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

LauncherTestPlan discover(discoveryRequest)void execute(TestPlan)

<<interface>>TestEngine

discover()void execute()

JupiterTestEngine<<annotation>>

org.junit.jupiter.api.Test

MyNewTest@Test test1@Test test1

junit-platform-launcher

junit-platform-engine

junit-jupiter-enginejunit-jupiter-api

myproject VintageTestEngine

MyOldTest@Test test1@Test test1 <<annotation>>

org.junit.Test

junit-4.12

junit-vintage-engine

ServiceLoaderTestEngineRegistry

create

Page 21: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

P L AT FORM

JUP I T E RV IN TAGE PAR T YTH I RD

Page 22: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

PLATFO

RM

JU

PIT

ER

VIN

TAG

E

PA

RTY

TH

IRD

Page 23: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Platform UsabilityTest-Engines nutzen und selbst entwickeln

Page 24: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Warum braucht die Welt mehr als eine Test-Engine?

•Andere JVM-Sprache

•Anderes Spezifikationsmodell

•Anderes Ausführungsmodell

•Aber: Für Erweiterungen des Test-Modells genügt häufig eine Jupiter-Extension

Page 25: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Test-Engine benutzen

1. TestCompile-Dependency hinzufügen:org.myorg:my-engine:x.y.z

2. Tests schreiben

Page 26: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Test-Engine Kochrezept

1. Compile-Dependencies hinzufügen

2. TestEngine-Interface implementieren

3. Engine registrieren

4. Tests in IDE starten

Page 27: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

DEMO: Wir bauen unsere eigene Test-Engine

Page 28: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

dependencies { compile("org.junit.platform:junit-platform-engine:1.2.0“) compile("org.junit.platform:junit-platform-commons:1.2.0")

// For writing integration tests testCompile("org.junit.platform:junit-platform-launcher:1.2.0") }

Page 29: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Test-Engine registrieren /META-INF/services/ org.junit.platform.engine.TestEngine

nano.NanoEngine

Page 30: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign
Page 31: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

TestEngine-Interface implementieren

1. Create TestEngine class

2. Implement discover()

3. Implement execute()

Page 32: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Was fehlt zu stärkerer Test-Engine?

•Nano kann von IDE ausgeführt werden, aber ist sehr beschränkt

•Test-Spezifikation durch Klassen und Methoden ‣ Navigation in IDE's Test-Runner

Page 33: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

TinyTest@TinyTest public class A_tiny_test {

final int theAnswer = 42;

public boolean this_should_return_true() { return theAnswer == 42; }

public boolean this_returns_FALSE() { return theAnswer == 43; } }

Page 34: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign
Page 35: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign
Page 36: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Tests in IDE identifizieren•Theoretisch ist jedes zur Laufzeit ermittelbare

Spezifikationsmodell umsetzbar

•Aber: Alles immer zu kompilieren ist für (manche) IDEs nicht möglich

<<annotation>>org.junit.platform.commons.annotation.Testable

<<annotation>>TinyTest

<<annotation>>org.junit.jupiter.api.Test

Meta-Annotation

Page 37: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Was geht noch?

•Ausführen von Dateien, URLs, und anderen Ressourcen

•jqwik.net: Property Testen in Java

•Specsy: Alles mit Lambdas

•Wrapper für Cucumber, Spock, Fitnesse etc

Page 38: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Jupiter Extension API

Page 39: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Jupiter Extensions

Page 40: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Jupiter Callbacks<<interface>>

Extension

<<interface>> BeforeEachCallback

void beforeEach(ExtensionContext)

Page 41: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign
Page 42: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Tool-Support: State of the Union•IntelliJ ‣ Unterstützung seit beinahe 2 Jahren

•Eclipse ‣ Eingebaut seit 4.7.1

•Gradle ‣ Nativ unterstützt seit 4.7

•Maven ‣ Nativ unterstützt seit kurzem

Page 43: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

https://github.com/jlink/junit5-the-platform

http://johanneslink.net/downloads/ junit5-the-platform.pdf

Page 44: JUnit 5 Die Plattform · 1997 1.0 2006 4.0 Runner 2009 4.7 Rules 2015 JUnit Lambda Campaign

Links•Artikel über JUnit-5-Architektur

https://blog.codefx.org/design/architecture/junit-5-architecture/

•Artikel über Jupiter-Extension-Modell https://blog.codefx.org/design/architecture/junit-5-extension-model/

•Framework Design Principles: http://www.davidtanzer.net/node/118

•JUnit 5: http://junit.org/junit5

• Jqwik-Engine: http://jqwik.net