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 Slide

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

    View Slide

  3. 5

    SHOW OF HANDS

    View 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 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 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 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 Slide

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

    View 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 Slide

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

    View 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 Slide

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

    View 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 Slide

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

    View 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 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 Slide

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

    View 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 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 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 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 Slide

  22. 5
    COUPLING

    View Slide

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

    View Slide

  24. 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 Slide

  25. 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 Slide

  26. 5

    View Slide

  27. 5
    JUNIT 5
    =
    JUPITER + VINTAGE + PLATFORM

    View Slide

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

    View Slide

  29. 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 Slide

  30. 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 Slide

  31. 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 Slide

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

    View Slide

  33. 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 Slide

  34. 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 Slide

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

    View Slide

  36. 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 Slide

  37. 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 Slide

  38. 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 Slide

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

    View Slide

  40. 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 Slide

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

    View Slide

  42. 5
    THANKS!

    View Slide