This document contains the change log for all JUnit 5 releases since 5.8 GA.

Please refer to the User Guide for comprehensive reference documentation for programmers writing tests, extension authors, and engine authors as well as build tool and IDE vendors.

5.9.1

Date of Release:

Scope: Minor bug fixes since 5.9.0

For a complete list of all closed issues and pull requests for this release, consult the 5.9.1 milestone page in the JUnit repository on GitHub.

JUnit Platform

Bug Fixes

  • ReflectionSupport.findMethods(…​) now returns a distinct set of methods.

Deprecations and Breaking Changes

New Features and Improvements

JUnit Jupiter

Bug Fixes

  • A @ParameterizedTest method configured with a @MethodSource annotation that references a factory method inherited from multiple interfaces no longer fails with an exception stating that multiple factory methods with the same name were found.

Deprecations and Breaking Changes

New Features and Improvements

JUnit Vintage

Bug Fixes

Deprecations and Breaking Changes

New Features and Improvements

5.9.0

Date of Release: July 26, 2022

Scope:

  • XML reports in new Open Test Reporting format

  • Configurable cleanup mode for @TempDir

  • Configurable thread mode for @Timeout

  • Conditional execution based on OS architectures

  • New TestInstancePreConstructCallback extension API

  • Reusable parameter resolution for custom extension methods via ExecutableInvoker

  • Parameter injection for @MethodSource methods

  • New IterationSelector

  • Various improvements to ConsoleLauncher

For a complete list of all closed issues and pull requests for this release, consult the 5.9.0 milestone page in the JUnit repository on GitHub.

JUnit Platform

Bug Fixes

  • Fixed handling of global post-discovery filters that apply to @Suite classes.

  • Since the Turkish language has special characters such as 'ı' and 'İ', the uppercase conversion in DefaultParallelExecutionConfigurationStrategy#getStrategy previously caused all tests to finish with exit code -1. This has been fixed by using the root locale instead of the default one.

  • Absolute path entries are now supported in JUnit’s Platform Console Launcher on Windows.

  • Attempts to load a Class for an invalid class name representing an extremely large multidimensional array now fail within a reasonable amount of time.

  • Fix concurrency issue in classpath scanning.

Deprecations and Breaking Changes

  • ConfigurationParameters.size() has been deprecated in favor of the new keySet() method.

New Features and Improvements

  • Support for the Open Test Reporting format which supports all features of the JUnit Platform such as hierarchical test structures, display names, tags, etc. Please refer to the User Guide for instructions on how to enable such reports in your build.

  • ConfigurationParameters has a new keySet() method which allows you to retrieve all configuration parameter keys.

  • New IterationSelector for selecting a subset of a test’s or container’s iterations.

  • ParallelExecutionConfiguration allows configuring the saturate predicate of the ForkJoinPool used for parallel test execution.

  • JUnit OSGi bundles now contain engine and launcher requirements ensuring that at resolution time a fully running set of dependencies is calculated, avoiding the need for these to be manually specified.

  • JUnit Platform Standalone Console JAR now also includes the JUnit Platform Suite Engine.

  • New failIfNoTests attribute added to @Suite. This will fail the suite if no tests are discovered.

  • The output color for the ConsoleLauncher can now be customized. The option --single-color will apply a built-in monochrome style, while --color-palette will accept a properties file. See the User Guide for details.

  • The default theme for the ConsoleLauncher is now determined by the charset reported by the system console on Java 17 and later.

  • New --list-engines option added to the ConsoleLauncher which displays all registered test engine implementations.

  • Configuring included EngineFilters that do not match any registered TestEngine results in an error to avoid misconfiguration – for example, due to typos.

  • New public factory method to instantiate an ExecutionRequest.

  • Documentation for overriding the JUnit version used in Spring Boot applications. See the User Guide for details.

JUnit Jupiter

Bug Fixes

  • When cleaning up a @TempDir, only one retry attempt will be made to delete directories.

  • Since the Turkish language has special characters such as 'ı' and 'İ', the uppercase conversion in DefaultParallelExecutionConfigurationStrategy#getStrategy previously caused all tests to finish with exit code -1. This has been fixed by using the root locale instead of the default one.

Deprecations and Breaking Changes

  • @TempDir fields are no longer allowed to be declared as final.

    • This improves diagnostics for failures resulting from a user-declared static final @TempDir field by throwing an exception with an informative error message.

  • Private lifecycle methods (annotated with @BeforeAll, @AfterAll, @BeforeEach, or @AfterEach) now correctly lead to an exception. Although this is a bug fix, it is technically also a breaking change since there might be existing user code with private lifecycle methods which will now start to fail.

New Features and Improvements

  • @TempDir now includes a cleanup mode attribute for preventing a temporary directory from being deleted after a test. The default cleanup mode can be configured via a configuration parameter.

  • Support for FreeBSD and OpenBSD operating systems in @EnabledOnOs and @DisabledOnOs.

  • New MATCH_NONE mode for @EnumSource that selects only those enum constants whose names match none of the supplied patterns.

  • The @Order annotation is now a STABLE API.

  • New TestInstancePreConstructCallback extension API that is called prior to test instance construction – symmetric to the existing TestInstancePreDestroyCallback extension API.

  • Extensions can now leverage registered ParameterResolver extensions when invoking methods and constructors via the new ExecutableInvoker API available in the ExtensionContext.

  • A subset of the invocations of parameterized or dynamic tests can now be selected via the new IterationSelector discovery selector when launching the JUnit Platform.

  • JAVA_19 and JAVA_20 have been added to the JRE enum for use with JRE-based execution conditions.

  • @MethodSource factory methods can now accept arguments resolved by registered ParameterResolver extensions.

  • AssertionFailureBuilder allows reusing Jupiter’s logic for creating failure messages to assist in writing custom assertion methods.

  • Three new abort methods have been added to the Assumptions class. These are analogous to the fail methods in the Assertions class, but instead of failing they abort the test or container.

  • Support for enabling/disabling tests based on the system’s hardware architecture via new architectures attributes in @EnabledOnOs and @DisabledOnOs.

  • Default @MethodSource factory methods can now accept arguments. A default factory method is a method declared in the test class with the same name as the @ParameterizedTest method that is inferred as the factory method when no explicit factory method is specified in the @MethodSource annotation.

  • Thread mode can be set on @Timeout annotation. It allows to configure whether test code is executed in the thread of the calling code or in a separate thread. The three modes are: INFERRED (default) which resolves the thread mode configured via the property junit.jupiter.execution.timeout.thread.mode.default, SAME_THREAD that executes the test code in the same thread as the calling code, and SEPARATE_THREAD which executes it in a separate thread.

JUnit Vintage

New Features and Improvements

  • More accurate reporting of intermediate start/finish events, e.g. iterations of the Parameterized runner and classes executed indirectly via the Suite runner, when running with JUnit 4.13 or later.

5.8.2

Date of Release: November 28, 2021

Scope:

  • Text blocks in @CsvSource are treated like CSV files

  • CSV headers in display names for @CsvSource and @CsvFileSource

  • Custom quote character support in @CsvSource and @CsvFileSource

For a complete list of all closed issues and pull requests for this release, consult the 5.8.2 milestone page in the JUnit repository on GitHub.

JUnit Platform

No changes.

JUnit Jupiter

New Features and Improvements

  • Text blocks in @CsvSource are now treated like complete CSV files, including support for comments beginning with a # symbol as well as support for new lines within quoted strings. See the User Guide for details and examples.

  • CSV headers can now be used in display names in parameterized tests. See @CsvSource and @CsvFileSource in the User Guide for details and examples.

  • The quote character for quoted strings in @CsvSource and @CsvFileSource is now configurable via a new quoteCharacter attribute in each annotation.

JUnit Vintage

No changes.

5.8.1

Date of Release: September 22, 2021

Scope:

  • Support for text blocks in @CsvSource

  • Java 18 support in the JRE enum

  • Access to the ExecutionMode in the ExtensionContext

  • Minor bug fixes and enhancements since 5.8.0

For a complete list of all closed issues and pull requests for this release, consult the 5.8.1 milestone page in the JUnit repository on GitHub.

JUnit Platform

Deprecations and Breaking Changes

  • @UseTechnicalNames has been deprecated in favor of the new @Suite support which does not require the use of technical names. See the warning in Using JUnit 4 to run the JUnit Platform for details.

New Features and Improvements

  • ReflectionSupport.findNestedClasses(..) is now thread-safe with regard to cycle detection.

JUnit Jupiter

Bug Fixes

  • assertLinesMatch() in Assertions no longer fails with a NoSuchElementException if a limited fast-forward followed by at least one more expected line exceeds the remaining actual lines.

  • assertLinesMatch() in Assertions now handles fast-forwards with leading and trailing spaces correctly and no longer throws an IndexOutOfBoundsException.

New Features and Improvements

  • JAVA_18 has been added to the JRE enum for use with JRE-based execution conditions.

  • CSV content in @CsvSource can now be supplied as a text block instead of an array of strings. See the User Guide for details and an example.

  • The ExecutionMode for the current test or container is now accessible via the ExtensionContext.

JUnit Vintage

Bug Fixes

  • Relaxed version constraint in published Gradle Module Metadata to allow downgrading the junit:junit dependency from 4.13.2.

5.8.0

Date of Release: September 12, 2021

Scope:

  • Declarative test suites via @Suite classes

  • LauncherSession and accompanying listener

  • New UniqueIdTrackingListener

  • More fine-grained Java Flight Recorder events

  • Java Flight Recorder support on Java 8 Update 262 or higher

  • Test class ordering

  • @TempDir can be used to create multiple temporary directories

  • Extension registration via @ExtendWith on fields and parameters

  • Auto-close support for arguments in @ParameterizedTest methods

  • Memory and performance optimizations

  • Numerous bug fixes and minor improvements

For complete details consult the 5.8.0 Release Notes online.