'Junit5 test cases parallel with some test cases isolated required with class order to be maintained

In my product we have certain test cases that should be run in parallel and also certain test cases that should run in isolation mode I have been using this in junit-platform.properties

junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = same_thread
junit.jupiter.execution.parallel.mode.classes.default = concurrent
junit.jupiter.testclass.order.default = org.junit.jupiter.api.ClassOrderer$OrderAnnotation

Now I have provided order number for test cases class to be executed but what I want is isolated test cases to be executed after all parallel test cases have completed execution as isolated test cases are dependent on test cases that are in running parallel.

As of now when test cases are getting executed what is happening test class order is not maintained any order test cases are running either parallel or isolated,is there anyway how it can be done it will be of great help..

This is how I have defined in test case as follows for isolated(There are multiple classes with different scenarios):

@Order(12)
@ExtendWith(VertxExtension.class)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@EnabledIfSystemProperty(named="system.boot.sequence", matches = "DEFAULT")
@Isolated
class UserModuleTest
{
    private static final long CURRENT_TIME_MILLIS = System.currentTimeMillis();

    private static String refreshToken = null;

    private static String accessToken = null;

    private static final String EXPIRY_DAYS = "password.policy.password.expiry.days";

    private static final JsonObject ids =  new JsonObject();

    @Test
    @Order(1)
    void testGetAllUsers(VertxTestContext testContext)
    {
        APITestUtil.get(USER_API_ENDPOINT, testContext.succeeding(response -> testContext.verify(() ->
        {
            APITestUtil.assertGETAllRequestTestResult(response,UserConfigStore.getStore(), null);

            testContext.completeNow();

        })));
    }
    @Test
    @Order(2)
    void testCreateGroup(VertxTestContext testContext)
    {
        var context = new JsonObject()
                .put(FIELD_GROUP_NAME,"grouptest").put(FIELD_PARENT_GROUP, 0)
                .put(GROUP_CONTEXT, new JsonObject().put(GROUP_AUTO_ASSIGN, NO));

        APITestUtil.post(GROUP_API_ENDPOINT,context ,
                testContext.succeeding(response->
                        testContext.verify(() ->
                        {
                            APITestUtil.assertCreateEntityTestResult(GroupConfigStore.getStore() , context, response.bodyAsJsonObject(), String.format(InfoMessageConstants.ENTITY_CREATED,APIConstants.Entity.GROUP.getName()), null);

                            ids.put("group",response.bodyAsJsonObject().getLong(ID));

                            testContext.completeNow();
                        })));
    }

    @Test
    @Order(3)
    void testCreateChildGroup(VertxTestContext testContext)
    {
        var context = new JsonObject().put(FIELD_GROUP_NAME, "groupChild").put(FIELD_PARENT_GROUP, ids.getLong("group"))
                .put(GROUP_CONTEXT, new JsonObject().put(GROUP_AUTO_ASSIGN, NO));

        APITestUtil.post(GROUP_API_ENDPOINT,context,
                testContext.succeeding(response ->
                        testContext.verify(() ->
                        {
                            APITestUtil.assertCreateEntityTestResult(GroupConfigStore.getStore() , context, response.bodyAsJsonObject(), String.format(InfoMessageConstants.ENTITY_CREATED, Entity.GROUP.getName()), null);

                            ids.put("child.group",response.bodyAsJsonObject().getLong(ID));

                            testContext.completeNow();
                        })));
    }

}

This is how I have defined in test case as follows for non-isolated means which I want to run parallel(There are multiple classes with different scenarios):

@Order(2)
@ExtendWith(VertxExtension.class)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@Timeout(90 * 1000)
@EnabledIfSystemProperty(named="system.boot.sequence", matches = "DEFAULT")
class BDiscoveryTest
{
    private static final Logger logger = new Logger(BDiscoveryTest.class, "discovery-test","Discovery Test");

    private static final JsonObject LINUX_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("linux.discovery.parameters");

    private static final JsonObject LINUX_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testLinuxDiscovery");

    private static final JsonObject WINDOWS_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testWindowsDiscovery");

    private static final JsonObject WINDOWS_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("windows.discovery.parameters");

    private static final JsonObject NETWORK_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testSNMPv1Discovery");

    private static final JsonObject NETWORK_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("snmp.discovery.v1.parameters");

    private static final JsonObject ESXI_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testESXiDiscovery");

    private static final JsonObject ESXI_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("esxi.discovery.parameters");

    private static final JsonObject HYPERV_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testHyperVDiscovery");

    private static final JsonObject HYPERV_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("hyperv.discover.parameters");

    private static final JsonObject HYPERV_CLUSTER_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testHyperVClusterDiscovery");

    private static final JsonObject HYPERV_CLUSTER_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("hyperv.cluster.discover.parameters");

    private static final JsonObject CITRIX_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testCitrixDiscovery");

    private static final JsonObject CITRIX_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("citrix.discovery.parameters");

    private static final JsonObject CITRIX_CLUSTER_CREDENTIAL_CONTEXT = TestConstants.getJsonObject("testCitrixClusterDiscovery");

    private static final JsonObject CITRIX_CLUSTER_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("citrix.cluster.discovery.parameters");

    private static final JsonObject PING_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("testPingServiceCheckDiscoveryWithValidIP");

    private static final JsonObject PORT_DISCOVERY_PARAMETERS = TestConstants.getJsonObject("testPortServiceCheckDiscoveryWithValidIP");

    private static MessageConsumer<JsonObject> messageConsumer;

    private static MessageConsumer<JsonObject> discoveryStatusMessageHandler;

    private static Set<String> targets = new HashSet<>();

    private static ConcurrentMap<String, java.lang.Object> discoveryContext = new ConcurrentHashMap<>();

   
    @BeforeEach
    void unregisterMessageHandler()
    {
        discoveryContext = new ConcurrentHashMap<>();

        targets.clear();
    }

    @AfterAll
    static void cleanUp(VertxTestContext testContext)
    {
        TestUtil.complete(testContext, messageConsumer, false);
    }

    @Test
    @Order(1)
    void testLinuxRangeDiscovery(VertxTestContext testContext)
    {
        var discoveryName = "Linux IPRange";

        var range = TestConstants.getStringValue(TestConstants.LINUX_TARGET_RANGE);

        setIPRangeDiscoveryTargets(testContext,range);

        testDiscovery(testContext, LINUX_CREDENTIAL_CONTEXT.put(CredentialProfile.CREDENTIAL_PROFILE_NAME, "Linux/Unix-Test-"+System.currentTimeMillis()),
                LINUX_DISCOVERY_PARAMETERS.copy().put(DISCOVERY_TYPE,DISCOVERY_TYPE_IP_ADDRESS_RANGE).put(Discovery.DISCOVERY_TARGET,range).put(Discovery.DISCOVERY_NAME, discoveryName),
                discoveryName+": Discovery Job",60*1000);
    }

    @Test
    @Order(2)
    void testLinuxCIDRDiscovery(VertxTestContext testContext)
    {
        var discoveryName = "Linux CIDR";

        var cidr = TestConstants.getStringValue(TestConstants.LINUX_TARGET_CIDR);

        setCIDRDiscoveryTargets(testContext, cidr);

        testDiscovery(testContext, LINUX_CREDENTIAL_CONTEXT.put(CredentialProfile.CREDENTIAL_PROFILE_NAME, "Linux/Unix-Test-"+System.currentTimeMillis()),
                LINUX_DISCOVERY_PARAMETERS.copy().put(DISCOVERY_TYPE,DISCOVERY_TYPE_CIDR).put(Discovery.DISCOVERY_TARGET,cidr).put(Discovery.DISCOVERY_NAME, discoveryName),
                discoveryName+": Discovery Job",60*1000);
    }

    @Test
    @Order(3)
    void testLinuxCSVDiscovery(VertxTestContext testContext)
    {
        var discoveryName = "Linux CSV";

        var csv = TestConstants.getStringValue(TestConstants.LINUX_TARGET_CSV);

        testDiscovery(testContext, LINUX_CREDENTIAL_CONTEXT.put(CredentialProfile.CREDENTIAL_PROFILE_NAME, "Linux/Unix-Test-"+System.currentTimeMillis()),
                LINUX_DISCOVERY_PARAMETERS.copy().put(DISCOVERY_TYPE,DISCOVERY_TYPE_CSV).put(Discovery.DISCOVERY_TARGET,csv).put(Discovery.DISCOVERY_NAME, discoveryName),
                discoveryName+": Discovery Job",60*1000);
    }


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source