[[release-notes-5.10.0]]
== 5.10.0

*Date of Release:* July 23, 2023

*Scope:*

* Promotion of various experimental APIs to stable
* New `LauncherInterceptor` SPI
* New `testfeed` details mode for `ConsoleLauncher`
* New `ConsoleLauncher` subcommand for test discovery without execution
* Dry-run mode for test execution
* New `NamespacedHierarchicalStore` for use in third-party test engines
* Stacktrace pruning to hide internal JUnit calls
* New `@SelectMethod` support in test `@Suite` classes.
* New `TempDirFactory` SPI for customizing how temporary directories are created
* Failure threshold for `@RepeatedTest`
* New convenience base classes for implementing `ArgumentsProvider` and `ArgumentConverter`
* Custom class loader support for class/method selectors, `@MethodSource`, `@EnabledIf`,
  and `@DisabledIf`
* Improved configurability of parallel execution
* Numerous bug fixes and minor improvements

For a complete list of all _closed_ issues and pull requests for this release, consult the
link:{junit5-repo}+/milestone/65?closed=1+[5.10.0-M1],
link:{junit5-repo}+/milestone/69?closed=1+[5.10.0-RC1],
link:{junit5-repo}+/milestone/71?closed=1+[5.10.0-RC2], and
link:{junit5-repo}+/milestone/70?closed=1+[5.10.0 GA] milestone pages in the JUnit
repository on GitHub.


[[release-notes-5.10.0-junit-platform]]
=== JUnit Platform

==== Deprecations and Breaking Changes

* Building native images with GraalVM now requires configuring the build arg
  `--initialize-at-build-time=org.junit.platform.launcher.core.LauncherConfig` and
  `--initialize-at-build-time=org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter`.
* The `getMethodParameterTypes()` methods in `MethodSelector` and `NestedMethodSelector`
  have been deprecated and replaced by `getParameterTypeNames()` for greater clarity.

==== New Features and Improvements

* Various "experimental" APIs have been promoted to "stable", including
  `ModuleSelector`, `EngineDiscoveryListener`, `EngineDiscoveryRequestResolver`,
  `LauncherSession`, `LauncherSessionListener`, parallel execution support classes,
  `@Suite` and related annotations, and others.
* All utility methods in `ReflectionSupport` that return a `List` now have counterparts
  which return a `Stream`.
* New `tryToLoadClass(...)` variant in `ReflectionSupport` that accepts an explicit
  `ClassLoader`, allowing classes to be resolved with custom `ClassLoader` arrangements.
* `ReflectionSupport.findMethod(Class<?>, String, String)` now uses the `ClassLoader` of
  the supplied `Class` to load parameter types instead of using the _default_
  `ClassLoader`. This allows parameter types to be resolved with custom `ClassLoader`
  arrangements (such as OSGi). Consequently, `DiscoverySelectors.selectMethod(Class<?>,
  String, String)` also now works properly with custom `ClassLoader` arrangements.

* New `@SelectMethod` selector support in the `@Suite` test engine.
* Classes may now be selected by fully-qualified name via the `names` attribute in
  `@SelectClasses`.
* New overloaded constructors for `ClassSelector`, `NestedClassSelector`,
  `MethodSelector`, and `NestedMethodSelector` that take an explicit `ClassLoader` as a
  parameter, allowing selectors to select classes in custom `ClassLoader` arrangements
  like in OSGi.
* New `selectMethod()` and `selectNestedMethod()` variants in `DiscoverySelectors` that
  accept a `Class<?>...` argument of parameter types as a type-safe alternative to
  providing the names of parameter types as a comma-delimited string.
* For consistency with JUnit Jupiter lifecycle callbacks, listener method pairs for
  started/finished and opened/closed events are now invoked using "wrapping" semantics.
  This means that finished/closed event methods are invoked in reverse order compared to
  the corresponding started/opened event methods when multiple listeners are registered.
  This affects the following listener interfaces:
  `TestExecutionListener`, `EngineExecutionListener`, `LauncherDiscoveryListener`, and
  `LauncherSessionListener`.
* New `LauncherInterceptor` SPI for intercepting the creation of instances of `Launcher`
  and `LauncherSessionlistener` as well as invocations of the `discover` and `execute`
  methods of the former. Please refer to the
  <<../user-guide/index.adoc#launcher-api-launcher-interceptors-custom, User Guide>> for
  details.
* Support for limiting the `max-pool-size-factor` for parallel execution via a
  configuration parameter.
* New `testfeed` details mode for `ConsoleLauncher` that prints test execution events as
  they occur in a concise format.
* The existing functionality of the `ConsoleLauncher` has been split into two subcommands:
  `execute` for executing tests and `engines` for listing registered test engines.
* A new `discover` subcommand has been added to the `ConsoleLauncher` to print the
  discovered tests for the specified details mode without executing them.
* Improved error message for cyclic graphs detected during test discovery to be more
  actionable.
* Extracted `NamespacedHierarchicalStore` from JUnit Jupiter engine for reuse by other
  test engines and their extensions.
* New dry-run mode to simulate test execution without actually running tests. Please refer
  to the <<../user-guide/index.adoc#launcher-api-dry-run-mode, User Guide>> for details.
* Stack traces produced by failing tests are now pruned of calls from the `org.junit`,
  `jdk.internal.reflect`, and `sun.reflect` packages. This feature can be disabled via a
  configuration parameter. Please refer to the
  <<../user-guide/index.adoc#stacktrace-pruning, User Guide>> for details.
* New `getAncestors()` method in `TestDescriptor`.


[[release-notes-5.10.0-junit-jupiter]]
=== JUnit Jupiter

==== Bug Fixes

* The extensions supporting `@MethodSource`, `@EnabledIf`, and `@DisabledIf` now load
  classes by fully-qualified class name using the `ClassLoader` obtained from the test
  class when possible. This allows classes to be resolved with custom `ClassLoader`
  arrangements (such as OSGi).
* When converting an argument for a `@ParameterizedTest` method from a fully-qualified
  class name (`String`) to a `Class`, the `ClassLoader` of the class in which the
  `@ParameterizedTest` method is declared is now used to resolve the `Class` instead of
  the _default_ `ClassLoader`.

==== Deprecations and Breaking Changes

* The `dynamic` parallel execution strategy now allows the thread pool to be saturated by
  default.
* Implicit type conversion of boolean values like in `@CsvSource` is now stricter, only
  allowing values `"true"` or `"false"` (case-insensitive), in order to make accidental
  mistakes apparent and to avoid potential confusion.

==== New Features and Improvements

* Various "experimental" APIs have been promoted to "stable", including
  `MethodOrderer`, `ClassOrderer`, `InvocationInterceptor`,
  `LifecycleMethodExecutionExceptionHandler`, `@TempDir`, parallel execution annotations,
  and others.
* `JAVA_22` has been added to the `JRE` enum for use with JRE-based execution conditions.
* New `reason` attribute in `@Execution` which can be used to document the reason for
  using the selected execution mode.
* New `junit.jupiter.execution.parallel.config.dynamic.max-pool-size-factor` configuration
  parameter to set the maximum pool size factor.
* New `junit.jupiter.execution.parallel.config.dynamic.saturate` configuration
  parameter to disable pool saturation.
* `@RepeatedTest` can now be configured with a failure threshold which signifies the
  number of failures after which remaining repetitions will be automatically skipped. See
  the <<../user-guide/index.adoc#writing-tests-repeated-tests, User Guide>> for details.
* If `@MethodSource` is used with a non-static factory method that should be `static`, the
  exception thrown now provides the user a meaningful explanation of how to address the
  problem.
* `@EmptySource` now supports additional types, including `Collection` and `Map` subtypes
  with a public no-arg constructor.
* New `ArgumentsAccessor.getInvocationIndex()` method that supplies the index of a
  `@ParameterizedTest` invocation.
* New `AnnotationBasedArgumentsProvider` convenience base class which implements both
  `ArgumentsProvider` and `AnnotationConsumer`.
* New `AnnotationBasedArgumentConverter` convenience base class which implements both
  `ArgumentConverter` and `AnnotationConsumer`.
* `@TempDir` can now be used as a meta-annotation in order to create custom _composed
  annotations_. See the `@JimfsTempDir` example in the
  <<../user-guide/index.adoc#writing-tests-built-in-extensions-TempDirectory, User Guide>>
  for details.
* `@TempDir` now successfully cleans up files and directories on Windows that are set to
  read-only.
* New `TempDirFactory` SPI for customizing how the `@TempDir` extension creates temporary
  directories. See the
  <<../user-guide/index.adoc#writing-tests-built-in-extensions-TempDirectory, User Guide>>
  for details.
* The <<../user-guide/index.adoc#extensions-RandomNumberExtension, User Guide>> now
  includes an example implementation of the `RandomNumberExtension` in order to improve
  the documentation for extension registration via `@ExtendWith` on fields.
* The scope of applicability for `TestWatcher` implementations is now more extensively
  documented in the User Guide and Javadoc.
* `DisplayNameGenerator` methods are now allowed to return `null`, in order to signal to
  fall back to the default display name generator.


[[release-notes-5.10.0-junit-vintage]]
=== JUnit Vintage

No changes.
