Hi all,

First of all, sorry for the lengthy post. I decided to add some context to
explain things a bit, but it resulted in quite a long e-mail. For the past
few weeks I've been trying to come up with a solution for the issue I
filled under SUREFIRE-1935, but I'm getting stuck and starting to feel like
the issue cannot be solved with the current JUnit Platform API. To give
some perspective into why this issue is important for us, I first have to
explain a bit about our setup.

We write our tests in the Spock framework and use Arquillian to run the
tests in the application container. Some of our tests, especially the
Selenium based tests, require quite some setup and tear down. Prior to
starting the test, Arquillian cube builds and starts several docker
containers and the tests are run against these containers. We currently use
the JUnit 4 based Spock 1.3 with Groovy 2.5, but we like to upgrade to
Spock 2 and Groovy 3, which runs on top of the JUnit Platform. For this,
I've already started working on a Spock extension that integrates Spock 2
in the Arquillian test life cycle [1]. This extension is inspired by the
(currently Alpha) JUnit5 module for Arquillian [2]. Both use a global
registration to keep track of the state managed by Arquilllian. This will
end up somewhere at the root of the TestPlan (for example see [3]).

Because our tests are quite extensive, with a total run time of 6 hours, we
run them with a forkCount of 8, greatly reducing the total duration.
However, this is where SUREFIRE-1935 comes into play. With a forkCount > 1,
the entire test life cycle is started over and over again for every test
class. This happens in JUnitPlatformProvider at line 197 [4]. This results
in the entire Arquillian suite being torn down and setup for every class,
in our case adding several minutes to the execution of every test class
because the docker setup is done over and over again.

To overcome this issue, the state from one test class execution has to be
carried to the next. It seems the LauncherSession (introduced in JUnit 5.8)
is meant to close this gap. However, this would mean my extension would
also need to implement a LauncherSessionListener, and I'm not sure if
extensions are supposed to integrate with the launcher as well. Also, for
this surefire would need to start a session prior to the tests, and close
it when done. I think this is a good idea anyway when running on platform
1.8 or higher.

Another solution could be a (sort of) dynamic test that produces the tests
to be run one by one. However, here my knowledge of JUnit really falls
short. I've got no idea of this is even possible.

I hope someone can help me out on this one and point me in the right
direction, as we like to upgrade our test frameworks and this is blocking
us at the moment.

Best regards,
Emond Papegaaij

[1] Arquillian extension for Spock Framework 2:
https://github.com/topicusonderwijs/arquillian-testrunner-spock/tree/spock-2.0-junit5
[2] Arquillian module for JUnit 5:
https://github.com/arquillian/arquillian-core/tree/master/junit5
[3] Registration in root store:
https://github.com/arquillian/arquillian-core/blob/master/junit5/core/src/main/java/org/jboss/arquillian/junit5/JUnitJupiterTestClassLifecycleManager.java#L20
[4] JUnitPlatformProvider launching the tests:
https://github.com/apache/maven-surefire/blob/master/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java#L197

Reply via email to