Pro Yearly is on sale from $80 to $50! »

JUnit 5: More than just a Testing Framework for Java

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.

956c7d246841e8507a1e1b96842994db?s=128

Marc Philipp

November 07, 2018
Tweet

Transcript

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

    JAVA
  2. 5 MARC PHILIPP So ware Engineer at JUnit Maintainer since

    2012 Twi er: Web: @marcphilipp marcphilipp.de
  3. 5 ✋ SHOW OF HANDS

  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
  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?
  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
  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?
  8. 5 BASICS (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20181107‑wjax

  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
  10. 5 MORE WAYS TO TEST (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20181107‑wjax

  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
  12. 5 PARALLEL EXECUTION (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20181107‑wjax

  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
  14. 5 EXTENSIONS (DEMO) h ps:/ /github.com/marcphilipp/junit5‑ demo/tree/20181107‑wjax

  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
  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 {}
  17. 5 EXTENSION POINTS Lifecycle: BeforeAllCallback , BeforeEachCallback , BeforeTestExecutionCallback ,

    TestExecutionExceptionHandler , AfterTestExecutionCallback , AfterEachCallback , AfterAllCallback Other: ExecutionCondition , TestInstanceFactory , TestInstancePostProcessor , ParameterResolver , TestTemplateInvocationContextProvider
  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
  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?
  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
  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)
  22. 5 COUPLING

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

    it!
  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)
  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
  26. 5

  27. 5 JUNIT 5 = JUPITER + VINTAGE + PLATFORM

  28. 5 THIRD‑PARTY ENGINES Specsy, Spek, KotlinTest, Cucumber, Drools, jqwik, Brahms,

    … h ps:/ /github.com/junit‑team/junit5/wiki/Third‑party‑ Extensions
  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
  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)
  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)
  32. 5 USING MULTIPLE ENGINES (DEMO) h ps:/ /github.com/marcphilipp/junit5‑pla orm‑demo

  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)
  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?
  35. 5 ROADMAP AND ROADMAP AND ROADMAP AND ROADMAP AND ROADMAP

    AND RESOURCES RESOURCES RESOURCES RESOURCES RESOURCES Image: NASA
  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?
  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/
  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
  39. 5 DONATIONS Support the JUnit team with dona ons via

    Steady: h ps:/ /steadyhq.com/en/junit
  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
  41. 5 QUESTIONS? or on Twi er @marcphilipp @juni eam

  42. 5 THANKS!