Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JUnit 5: More than just a Testing Framework for Java

Marc Philipp
November 07, 2018

JUnit 5: More than just a Testing Framework for Java

Over the last decade a lot has happened in the world of Java and testing, but JUnit 4 hasn’t kept up. Now JUnit 5 is here to help shape the future of testing on the JVM with a focus on Java 8 language features, extensibility, and a modern programming API for testing in Java. Moreover, JUnit isn’t just a Java testing framework anymore. Third parties are already developing test engines for Scala, Groovy, Kotlin, etc. that run on the new JUnit Platform. In this session, core JUnit 5 committer Marc Philipp will take the audience on an example-driven tour of the new Jupiter programming model and show how to migrate existing JUnit 4 based tests. Then, we will discuss the inspiration for JUnit 5, look more closely at its architecture, and discuss compatibility with JUnit 4. Next, we will explore the Jupiter extension model, learn about the extension points it provides, and see how custom extensions for conditional tests, method parameter resolution, lifecycle callbacks, etc. are authored and registered. To round off the session, we will look at the roadmap of what’s still to come.

Marc Philipp

November 07, 2018
Tweet

More Decks by Marc Philipp

Other Decks in Programming

Transcript

  1. 5
    JUNIT 5
    MORE THAN JUST A
    TESTING FRAMEWORK FOR JAVA

    View full-size slide

  2. 5
    MARC PHILIPP
    So ware Engineer at
    JUnit Maintainer since 2012
    Twi er:
    Web:
    @marcphilipp
    marcphilipp.de

    View full-size slide

  3. 5

    SHOW OF HANDS

    View full-size slide

  4. 5
    JUNIT 5 IS HERE!
    5.0
    September 10, 2017
    5.1
    February 18, 2018
    5.2
    April 29, 2018
    5.3
    September 11, 2018

    View full-size slide

  5. 5
    AGENDA
    1. How to write tests and extensions using JUnit 5?
    2. What is the JUnit Pla orm and why do we need it?
    3. What’s s ll to come and how to get started?

    View full-size slide

  6. 5
    JUNIT JUPITER
    JUNIT JUPITER
    JUNIT JUPITER
    JUNIT JUPITER
    JUNIT JUPITER
    THE NEW TESTING FRAMEWORK FOR JAVA
    THE NEW TESTING FRAMEWORK FOR JAVA
    THE NEW TESTING FRAMEWORK FOR JAVA
    THE NEW TESTING FRAMEWORK FOR JAVA
    THE NEW TESTING FRAMEWORK FOR JAVA
    Image: NASA

    View full-size slide

  7. 5
    JUPITER?
    Nope, it’s just a new name so we can easily dis nguish it
    from the old JUnit and the other parts of JUnit 5.
    … and it’s the fi h planet from the sun.
    Is wri ng tests rocket science now?

    View full-size slide

  8. 5
    BASICS (DEMO)
    h ps:/
    /github.com/marcphilipp/junit5‑
    demo/tree/20181107‑wjax

    View full-size slide

  9. 5
    BASICS (RECAP)
    @Test is s ll a thing, but in org.junit.jupiter.api
    @Disabled instead of @Ignore
    @BeforeAll , @BeforeEach , @AfterEach , @AfterAll
    have new names
    Assertions look similar – a few new ones like
    assertThrows , assertAll
    Custom @DisplayNames to ease camel‑case fa gue
    @TestInstance(PER_METHOD or PER_CLASS)
    @Tag instead of @Category

    View full-size slide

  10. 5
    MORE WAYS TO TEST (DEMO)
    h ps:/
    /github.com/marcphilipp/junit5‑
    demo/tree/20181107‑wjax

    View full-size slide

  11. 5
    MORE WAYS TO TEST (RECAP)
    @ParameterizedTest with different @Source
    annota ons
    @ValueSource , @EnumSource , @CsvSource ,
    @CsvFileSource , @MethodSource ,
    @ArgumentsSource(MyProvider.class) ,
    @YourCustomSource
    @RepeatedTest for flaky tests
    @TestFactory to produce dynamic tests

    View full-size slide

  12. 5
    PARALLEL EXECUTION (DEMO)
    h ps:/
    /github.com/marcphilipp/junit5‑
    demo/tree/20181107‑wjax

    View full-size slide

  13. 5
    PARALLEL EXECUTION (RECAP)
    Tests are run sequen ally by default
    Opt‑in and configure parallel execu on via configura on
    parameters
    @Execution(SAME_THREAD or CONCURRENT)
    Use @ResourceLock as declara ve synchroniza on
    mechanism

    View full-size slide

  14. 5
    EXTENSIONS (DEMO)
    h ps:/
    /github.com/marcphilipp/junit5‑
    demo/tree/20181107‑wjax

    View full-size slide

  15. 5
    EXTENSIONS (RECAP)
    Registra on (as many as you need):
    Declara ve: @ExtendWith on classes or methods
    Programma c: @RegisterExtension on fields
    Global: Via ServiceLoader (see )
    Implementa on:
    Extension marker interface
    one extension – n extension points/interfaces
    User Guide

    View full-size slide

  16. 5
    COMPOSED ANNOTATIONS
    You can use Jupiter annota ons as meta‑annota ons to
    create your own annota ons.
    @Retention(RUNTIME)
    @Target(METHOD)
    @ExtendWith(ConferenceExecutionCondition.class)
    @Tag("example")
    public @interface DisabledOnConference {}

    View full-size slide

  17. 5
    EXTENSION POINTS
    Lifecycle: BeforeAllCallback , BeforeEachCallback ,
    BeforeTestExecutionCallback ,
    TestExecutionExceptionHandler ,
    AfterTestExecutionCallback , AfterEachCallback ,
    AfterAllCallback
    Other: ExecutionCondition , TestInstanceFactory ,
    TestInstancePostProcessor , ParameterResolver ,
    TestTemplateInvocationContextProvider

    View full-size slide

  18. 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

    View full-size slide

  19. 5
    AGENDA
    1. How to write tests and extensions using JUnit 5? ✅
    2. What is the JUnit Pla orm and why do we need it?
    3. What’s s ll to come and how to get started?

    View full-size slide

  20. 5
    JUNIT PLATFORM
    JUNIT PLATFORM
    JUNIT PLATFORM
    JUNIT PLATFORM
    JUNIT PLATFORM
    PLATFORM FOR TESTING ON THE JVM
    PLATFORM FOR TESTING ON THE JVM
    PLATFORM FOR TESTING ON THE JVM
    PLATFORM FOR TESTING ON THE JVM
    PLATFORM FOR TESTING ON THE JVM
    Image: NASA

    View full-size slide

  21. 5
    JUNIT AS A PLATFORM?
    JUnit has always been a pla orm
    for IDEs and build tools
    for other tes ng frameworks
    Closely coupled (internal APIs, reflec on, serializa on)

    View full-size slide

  22. 5
    If JUnit is a pla orm, let’s design for it!

    View full-size slide

  23. 5
    SEPARATION OF CONCERNS
    1. An API to write tests and extensions (Jupiter API)
    2. Extensible mechanisms to discover and execute tests (Test
    Engine SPI)
    3. An API for test execu on by tools (Launcher API)

    View full-size slide

  24. 5
    DESIGN GOALS
    Flexibility: Adding new features should be easy. It should
    be clear whether a change might poten ally break a client.
    Backward Compa bility: Test wri en with JUnit 3 and 4
    should s ll run
    Forward Compa bility: Old IDEs and build tools should be
    able to execute new tests

    View full-size slide

  25. 5
    JUNIT 5
    =
    JUPITER + VINTAGE + PLATFORM

    View full-size slide

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

    View full-size slide

  27. 5
    COMPATIBILITY / MIGRATION
    Vintage Engine to run JUnit 3/4 tests on the Pla orm
    @Category(UI.class) maps to com.acme.UI tag
    Limited support for JUnit 4 Rules to ease migra on
    Migra on support for @Ignore (will be in 5.4)
    IDEs provide tools to convert test classes to Jupiter API
    Community‑provided migra on tool:
    h ps:/
    /github.com/boyarsky/convert‑junit4‑to‑junit5

    View full-size slide

  28. 5
    BUILD TOOL SUPPORT
    Na ve support in Gradle (≥ 4.6), Ant (≥ 1.10.3), and Maven
    Surefire (≥ 2.22.0)
    ConsoleLauncher to run tests from the command line or
    to support other build tools (e.g. Bazel)

    View full-size slide

  29. 5
    IDE SUPPORT
    Excellent support
    IntelliJ IDEA (≥ 2016.2)
    Eclipse (≥ 4.7.1a)
    Visual Studio Code (Java Test Runner ≥ 0.4.0)
    Netbeans (will come with 10.0)
    For other tools, there’s @RunWith(JUnitPlatform)

    View full-size slide

  30. 5
    USING MULTIPLE ENGINES (DEMO)
    h ps:/
    /github.com/marcphilipp/junit5‑pla orm‑demo

    View full-size slide

  31. 5
    USING MULTIPLE ENGINES (RECAP)
    Mul ple test engines can be used in a single test run
    Dis nc on between testImplementation and
    testRuntimeOnly dependencies
    Allows to gradually migrate tests from one test engine to
    another (e.g. from Vintage to Jupiter)

    View full-size slide

  32. 5
    AGENDA
    1. How to write tests and extensions using JUnit 5? ✅
    2. What is the JUnit Pla orm and why do we need it? ✅
    3. What’s s ll to come and how to get started?

    View full-size slide

  33. 5
    ROADMAP AND
    ROADMAP AND
    ROADMAP AND
    ROADMAP AND
    ROADMAP AND
    RESOURCES
    RESOURCES
    RESOURCES
    RESOURCES
    RESOURCES
    Image: NASA

    View full-size slide

  34. 5
    IMPORTANT FUTURE MILESTONES
    Test ordering (e.g. randomiza on) ✅ will be in 5.4
    New repor ng format that supports new features
    Declara ve Test Suites
    Parameterized Test Classes
    Scenario Tests
    Your ideas?

    View full-size slide

  35. 5
    GETTING STARTED
    User Guide:
    Sample projects for Ant, Bazel, Gradle, and 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/

    View full-size slide

  36. 5
    WANTED: FEEDBACK!
    StackOverflow:
    Code & Issues:
    Gi er:
    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

    View full-size slide

  37. 5
    DONATIONS
    Support the JUnit team with dona ons via Steady:
    h ps:/
    /steadyhq.com/en/junit

    View full-size slide

  38. 5
    EXAMPLE CODE
    Jupiter:
    Pla orm:
    h ps:/
    /github.com/marcphilipp/junit5‑
    demo/tree/20181107‑wjax
    h ps:/
    /github.com/marcphilipp/junit5‑pla orm‑demo

    View full-size slide

  39. 5
    QUESTIONS?
    or
    on Twi er
    @marcphilipp @juni eam

    View full-size slide