This is an automated email from the ASF dual-hosted git repository.

tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new d949049375 IGNITE-18874 Add a JUnit extension for stopping all Ignites 
after test suite finishes (#1709)
d949049375 is described below

commit d94904937535570acf0c789e8fddc511743357e2
Author: Roman Puchkovskiy <[email protected]>
AuthorDate: Fri Mar 3 14:21:20 2023 +0400

    IGNITE-18874 Add a JUnit extension for stopping all Ignites after test 
suite finishes (#1709)
---
 .../java/org/apache/ignite/IgnitionManager.java    |  4 +-
 modules/rest/openapi/openapi.yaml                  |  3 +
 modules/runner/build.gradle                        |  2 +
 ...est.java => ClusterPerTestIntegrationTest.java} | 10 +---
 .../ignite/internal/IgniteIntegrationTest.java     | 31 ++++++++++
 .../ignite/internal/ItNoSyncMetadataTest.java      |  4 +-
 .../component/ItRestAddressReportTest.java         |  3 +-
 .../ignite/internal/compute/ItComputeTest.java     |  4 +-
 .../internal/compute/ItLogicalTopologyTest.java    |  4 +-
 .../internal/deployment/ItDeploymentUnitTest.java  |  4 +-
 .../ignite/internal/index/ItIndexManagerTest.java  |  4 +-
 .../inmemory/ItRaftStorageVolatilityTest.java      |  4 +-
 .../internal/junit/StopAllIgnitesAfterTests.java   | 66 ++++++++++++++++++++++
 .../raftsnapshot/ItTableRaftSnapshotsTest.java     |  7 +--
 .../ignite/internal/rebalance/ItRebalanceTest.java |  7 +--
 .../ignite/internal/rest/AbstractRestTestBase.java |  6 +-
 .../ignite/internal/rest/ItPortRangeTest.java      |  6 +-
 .../ignite/internal/rest/ssl/ItRestSslTest.java    |  6 +-
 .../runner/app/AbstractSchemaChangeTest.java       |  6 +-
 .../internal/runner/app/IgniteRunnerTest.java      |  6 +-
 .../ignite/internal/runner/app/ItIgnitionTest.java |  6 +-
 .../ItRaftCommandLeftInLogUntilRestartTest.java    |  4 +-
 .../runner/app/ItTableApiContractTest.java         |  4 +-
 .../internal/runner/app/ItTableCreationTest.java   |  6 +-
 .../ignite/internal/sql/api/ItCommonApiTest.java   |  4 +-
 .../internal/sql/api/ItSqlAsynchronousApiTest.java |  4 +-
 .../internal/sql/api/ItSqlSynchronousApiTest.java  |  4 +-
 ...st.java => ClusterPerClassIntegrationTest.java} | 11 ++--
 .../internal/sql/engine/ItAggregatesTest.java      |  2 +-
 .../internal/sql/engine/ItCorrelatesTest.java      |  2 +-
 .../internal/sql/engine/ItCreateTableDdlTest.java  |  2 +-
 .../internal/sql/engine/ItDataTypesTest.java       |  2 +-
 .../ignite/internal/sql/engine/ItDmlTest.java      |  2 +-
 .../sql/engine/ItDynamicParameterTest.java         |  2 +-
 .../internal/sql/engine/ItFunctionsTest.java       |  2 +-
 .../sql/engine/ItHashSpoolIntegrationTest.java     |  2 +-
 .../internal/sql/engine/ItHashSpoolTest.java       |  4 +-
 .../internal/sql/engine/ItImplicitCastsTest.java   |  2 +-
 .../internal/sql/engine/ItIndexSpoolTest.java      |  4 +-
 .../ignite/internal/sql/engine/ItIntervalTest.java |  2 +-
 .../ignite/internal/sql/engine/ItJoinTest.java     |  2 +-
 .../internal/sql/engine/ItLimitOffsetTest.java     |  2 +-
 .../ignite/internal/sql/engine/ItMetadataTest.java |  2 +-
 .../internal/sql/engine/ItMixedQueriesTest.java    |  2 +-
 .../internal/sql/engine/ItOrToUnionRuleTest.java   |  2 +-
 .../sql/engine/ItProjectScanMergeRuleTest.java     |  2 +-
 .../internal/sql/engine/ItSecondaryIndexTest.java  |  2 +-
 .../ignite/internal/sql/engine/ItSetOpTest.java    |  2 +-
 .../internal/sql/engine/ItSqlOperatorsTest.java    |  2 +-
 .../ignite/internal/sql/engine/ItUuidTest.java     |  2 +-
 .../ignite/internal/sql/engine/ItZoneDdlTest.java  |  2 +-
 .../internal/sql/internal/InternalSchemaTest.java  |  4 +-
 .../ignite/internal/sqllogic/ItSqlLogicTest.java   |  6 +-
 .../org/apache/ignite/internal/ssl/ItSslTest.java  |  6 +-
 .../apache/ignite/internal/start/ItStartTest.java  |  6 +-
 .../internal/table/ItPublicApiColocationTest.java  |  4 +-
 .../ignite/internal/table/ItTableScanTest.java     |  4 +-
 .../apache/ignite/internal/app/IgnitionImpl.java   | 20 +++++++
 .../internal/component/RestAddressReporter.java    |  6 +-
 .../component/RestAddressReporterTest.java         | 15 ++---
 60 files changed, 219 insertions(+), 132 deletions(-)

diff --git a/modules/api/src/main/java/org/apache/ignite/IgnitionManager.java 
b/modules/api/src/main/java/org/apache/ignite/IgnitionManager.java
index 2705fe53f1..9d69c89a06 100644
--- a/modules/api/src/main/java/org/apache/ignite/IgnitionManager.java
+++ b/modules/api/src/main/java/org/apache/ignite/IgnitionManager.java
@@ -112,9 +112,7 @@ public class IgnitionManager {
      * @param nodeName Node name to stop.
      */
     public static void stop(String nodeName) {
-        Ignition ignition = 
loadIgnitionService(Thread.currentThread().getContextClassLoader());
-
-        ignition.stop(nodeName);
+        stop(nodeName, Thread.currentThread().getContextClassLoader());
     }
 
     /**
diff --git a/modules/rest/openapi/openapi.yaml 
b/modules/rest/openapi/openapi.yaml
index cdc18481e7..3b3a0ec89b 100644
--- a/modules/rest/openapi/openapi.yaml
+++ b/modules/rest/openapi/openapi.yaml
@@ -157,6 +157,7 @@ paths:
       operationId: updateClusterConfiguration
       parameters: []
       requestBody:
+        description: the cluster configuration to update
         content:
           text/plain:
             schema:
@@ -260,6 +261,8 @@ paths:
       operationId: updateNodeConfiguration
       parameters: []
       requestBody:
+        description: the node configuration to update. This is represented as 
a plain
+          text
         content:
           text/plain:
             schema:
diff --git a/modules/runner/build.gradle b/modules/runner/build.gradle
index a1f0650691..bd7ef4ee43 100644
--- a/modules/runner/build.gradle
+++ b/modules/runner/build.gradle
@@ -93,6 +93,7 @@ dependencies {
     testImplementation libs.auto.service.annotations
 
     integrationTestAnnotationProcessor 
project(':ignite-configuration-annotation-processor')
+    integrationTestAnnotationProcessor libs.auto.service
     integrationTestImplementation project(':ignite-affinity')
     integrationTestImplementation project(':ignite-page-memory')
     integrationTestImplementation project(':ignite-raft-api')
@@ -137,6 +138,7 @@ dependencies {
         exclude group: 'org.ow2.asm', module: 'asm'
     }
     integrationTestImplementation libs.typesafe.config
+    integrationTestImplementation libs.auto.service.annotations
 }
 
 tasks.register("runnerPlatformTest", JavaExec) {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/AbstractClusterIntegrationTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ClusterPerTestIntegrationTest.java
similarity index 92%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/AbstractClusterIntegrationTest.java
rename to 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/ClusterPerTestIntegrationTest.java
index 6a891e4f39..4c8121d146 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/AbstractClusterIntegrationTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ClusterPerTestIntegrationTest.java
@@ -27,23 +27,19 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.TestInfo;
 import org.junit.jupiter.api.Timeout;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.platform.commons.support.ReflectionSupport;
 
 /**
- * Abstract integration test that starts and stops a cluster.
+ * Abstract integration test that starts and stops a cluster per test method.
  */
 @SuppressWarnings("ALL")
-@ExtendWith(WorkDirectoryExtension.class)
-public abstract class AbstractClusterIntegrationTest extends 
BaseIgniteAbstractTest {
-    private static final IgniteLogger LOG = 
Loggers.forClass(AbstractClusterIntegrationTest.class);
+public abstract class ClusterPerTestIntegrationTest extends 
IgniteIntegrationTest {
+    private static final IgniteLogger LOG = 
Loggers.forClass(ClusterPerTestIntegrationTest.class);
 
     /** Base port number. */
     private static final int BASE_PORT = 3344;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/IgniteIntegrationTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/IgniteIntegrationTest.java
new file mode 100644
index 0000000000..9fa5710043
--- /dev/null
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/IgniteIntegrationTest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal;
+
+import org.apache.ignite.internal.junit.StopAllIgnitesAfterTests;
+import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+/**
+ * A test that starts some Ignite instances (and cleans them up later if they 
are forgotten).
+ */
+// The order is important here.
+@ExtendWith({WorkDirectoryExtension.class, StopAllIgnitesAfterTests.class})
+public abstract class IgniteIntegrationTest extends BaseIgniteAbstractTest {
+}
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java
index 72fc9b76b4..4f2e374724 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.testframework.WithSystemProperty;
 import org.junit.jupiter.api.Assertions;
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.Test;
  * The test check that the behavior of the cluster whit property 
IGNITE_GET_METADATA_LOCALLY_ONLY is correct.
  */
 @WithSystemProperty(key = "IGNITE_GET_METADATA_LOCALLY_ONLY", value = "true")
-public class ItNoSyncMetadataTest extends AbstractBasicIntegrationTest {
+public class ItNoSyncMetadataTest extends ClusterPerClassIntegrationTest {
 
     /**
      * Creates a table and waits when the metadata synchronizes among nodes of 
the cluster.
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/component/ItRestAddressReportTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/component/ItRestAddressReportTest.java
index 6e31bbe4ec..97a6852ce4 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/component/ItRestAddressReportTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/component/ItRestAddressReportTest.java
@@ -33,6 +33,7 @@ import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.app.IgniteRunner;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.runner.app.IgniteRunnerTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -44,7 +45,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
  * Test that after Ignite is started there is a file with REST server address 
in working directory.
  */
 @ExtendWith(WorkDirectoryExtension.class)
-public class ItRestAddressReportTest {
+public class ItRestAddressReportTest extends IgniteIntegrationTest {
     private static final String NODE_NAME = "node";
 
     @WorkDirectory
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTest.java
index 09b6c53289..dc373893c6 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTest.java
@@ -43,7 +43,7 @@ import java.util.stream.IntStream;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.compute.ComputeJob;
 import org.apache.ignite.compute.JobExecutionContext;
-import org.apache.ignite.internal.AbstractClusterIntegrationTest;
+import org.apache.ignite.internal.ClusterPerTestIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.lang.TableNotFoundException;
 import org.apache.ignite.network.ClusterNode;
@@ -55,7 +55,7 @@ import org.junit.jupiter.api.Test;
  * Integration tests for Compute functionality.
  */
 @SuppressWarnings("resource")
-class ItComputeTest extends AbstractClusterIntegrationTest {
+class ItComputeTest extends ClusterPerTestIntegrationTest {
     @Test
     void executesJobLocally() throws Exception {
         IgniteImpl entryNode = node(0);
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
index 999ab3c488..4936a4df73 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
@@ -32,8 +32,8 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
-import org.apache.ignite.internal.AbstractClusterIntegrationTest;
 import org.apache.ignite.internal.Cluster.NodeKnockout;
+import org.apache.ignite.internal.ClusterPerTestIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import 
org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import 
org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologyEventListener;
@@ -48,7 +48,7 @@ import org.junit.jupiter.api.TestInfo;
  * Integration tests for functionality of logical topology events subscription.
  */
 @SuppressWarnings("resource")
-class ItLogicalTopologyTest extends AbstractClusterIntegrationTest {
+class ItLogicalTopologyTest extends ClusterPerTestIntegrationTest {
     private final BlockingQueue<Event> events = new LinkedBlockingQueue<>();
 
     private final LogicalTopologyEventListener listener = new 
LogicalTopologyEventListener() {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/ItDeploymentUnitTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/ItDeploymentUnitTest.java
index 32659a44dc..492f0b8bc5 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/ItDeploymentUnitTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/ItDeploymentUnitTest.java
@@ -39,7 +39,7 @@ import org.apache.ignite.deployment.DeploymentUnit;
 import org.apache.ignite.deployment.UnitStatus;
 import org.apache.ignite.deployment.UnitStatus.UnitStatusBuilder;
 import org.apache.ignite.deployment.version.Version;
-import org.apache.ignite.internal.AbstractClusterIntegrationTest;
+import org.apache.ignite.internal.ClusterPerTestIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import 
org.apache.ignite.internal.deployunit.configuration.DeploymentConfiguration;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
@@ -49,7 +49,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Integration tests for {@link org.apache.ignite.deployment.IgniteDeployment}.
  */
-public class ItDeploymentUnitTest extends AbstractClusterIntegrationTest {
+public class ItDeploymentUnitTest extends ClusterPerTestIntegrationTest {
     private static final long REPLICA_TIMEOUT = TimeUnit.SECONDS.toMillis(30);
     private static final long SIZE_IN_BYTES = 1024L;
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
index 368de0d152..027fe6b707 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
@@ -30,7 +30,7 @@ import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.index.event.IndexEvent;
 import org.apache.ignite.internal.index.event.IndexEventParameters;
 import org.apache.ignite.internal.schema.configuration.index.HashIndexChange;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.junit.jupiter.api.Test;
@@ -40,7 +40,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
  * Tests to verify integration of {@link IndexManager} with other components.
  */
 @ExtendWith(WorkDirectoryExtension.class)
-public class ItIndexManagerTest extends AbstractBasicIntegrationTest {
+public class ItIndexManagerTest extends ClusterPerClassIntegrationTest {
     /** {@inheritDoc} */
     @Override
     protected int nodes() {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java
index df352db8b6..450d2d3176 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java
@@ -36,7 +36,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Stream;
-import org.apache.ignite.internal.AbstractClusterIntegrationTest;
+import org.apache.ignite.internal.ClusterPerTestIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.raft.configuration.EntryCountBudgetChange;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
@@ -58,7 +58,7 @@ import org.rocksdb.Slice;
  * Tests for making sure that RAFT groups corresponding to partition stores of 
in-memory tables use volatile
  * storages for storing RAFT meta and RAFT log, while they are persistent for 
persistent storages.
  */
-class ItRaftStorageVolatilityTest extends AbstractClusterIntegrationTest {
+class ItRaftStorageVolatilityTest extends ClusterPerTestIntegrationTest {
     private static final String TABLE_NAME = "test";
 
     @Override
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/junit/StopAllIgnitesAfterTests.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/junit/StopAllIgnitesAfterTests.java
new file mode 100644
index 0000000000..f220d26a2d
--- /dev/null
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/junit/StopAllIgnitesAfterTests.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.junit;
+
+import com.google.auto.service.AutoService;
+import java.util.ServiceLoader;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.internal.app.IgnitionImpl;
+import org.apache.ignite.internal.logger.IgniteLogger;
+import org.apache.ignite.internal.logger.Loggers;
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.Extension;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+/**
+ * This extension tries to do its best to stop all Ignite instances that were 
started in this JVM after a test
+ * suite finishes running (after-all).
+ *
+ * <p>This extension is designed to be
+ * <a 
href="https://junit.org/junit5/docs/current/user-guide/#extensions-registration-automatic";>automatically
 registered</a>
+ * via META-INF/services/org.junit.jupiter.api.extension.Extension.
+ * For this to work, system property {@code 
junit.jupiter.extensions.autodetection.enabled} must be set to {@code true}.
+ * If the property is set (currently, this is done via Gradle build scripts), 
it is enough to add this module as a dependency
+ * to make tests automatically register this extension, like this:
+ *
+ * <pre>
+ * integrationTestImplementation(testFixtures(project(':ignite-core')))
+ * </pre>
+ */
+@AutoService(Extension.class)
+public class StopAllIgnitesAfterTests implements AfterAllCallback {
+    private static final IgniteLogger LOG = 
Loggers.forClass(StopAllIgnitesAfterTests.class);
+
+    @Override
+    public void afterAll(ExtensionContext context) {
+        String testInstanceName = 
context.getTestClass().map(Class::getName).orElse("<unknown>");
+
+        LOG.info("Trying to stop all Ignites in {}", testInstanceName);
+
+        IgnitionImpl ignition = loadIgnitionService();
+
+        ignition.stopAll();
+
+        LOG.info("Stopped all Ignites in {}", testInstanceName);
+    }
+
+    private static IgnitionImpl loadIgnitionService() {
+        ServiceLoader<?> ldr = ServiceLoader.load(Ignition.class, 
Thread.currentThread().getContextClassLoader());
+        return (IgnitionImpl) ldr.iterator().next();
+    }
+}
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
index c6789db457..31b005d23a 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
@@ -50,6 +50,7 @@ import java.util.stream.IntStream;
 import org.apache.calcite.sql.validate.SqlValidatorException;
 import org.apache.ignite.internal.Cluster;
 import org.apache.ignite.internal.Cluster.NodeKnockout;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
@@ -61,10 +62,8 @@ import 
org.apache.ignite.internal.storage.pagememory.VolatilePageMemoryStorageEn
 import org.apache.ignite.internal.storage.rocksdb.RocksDbStorageEngine;
 import 
org.apache.ignite.internal.table.distributed.raft.snapshot.message.SnapshotMetaResponse;
 import 
org.apache.ignite.internal.table.distributed.replicator.TablePartitionId;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.testframework.jul.NoOpHandler;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteInternalCheckedException;
@@ -88,7 +87,6 @@ import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
 import org.junit.jupiter.api.Timeout;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 
@@ -96,9 +94,8 @@ import org.junit.jupiter.params.provider.ValueSource;
  * Tests how RAFT snapshots installation works for table partitions.
  */
 @SuppressWarnings("resource")
-@ExtendWith(WorkDirectoryExtension.class)
 @Timeout(90)
-class ItTableRaftSnapshotsTest extends BaseIgniteAbstractTest {
+class ItTableRaftSnapshotsTest extends IgniteIntegrationTest {
     private static final IgniteLogger LOG = 
Loggers.forClass(ItTableRaftSnapshotsTest.class);
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceTest.java
index 665cac7338..722d1616e7 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceTest.java
@@ -35,6 +35,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.function.BooleanSupplier;
 import java.util.stream.Collectors;
 import org.apache.ignite.internal.Cluster;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.affinity.Assignment;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.hlc.HybridClockImpl;
@@ -48,9 +49,7 @@ import 
org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import org.apache.ignite.internal.schema.marshaller.TupleMarshallerImpl;
 import org.apache.ignite.internal.table.TableImpl;
 import 
org.apache.ignite.internal.table.distributed.replicator.TablePartitionId;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.ByteUtils;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.AfterEach;
@@ -58,13 +57,11 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * Test suite for the rebalance.
  */
-@ExtendWith(WorkDirectoryExtension.class)
-public class ItRebalanceTest extends BaseIgniteAbstractTest {
+public class ItRebalanceTest extends IgniteIntegrationTest {
     private static final IgniteLogger LOG = 
Loggers.forClass(ItRebalanceTest.class);
 
     @WorkDirectory
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/AbstractRestTestBase.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/AbstractRestTestBase.java
index 061656278d..688e0c230f 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/AbstractRestTestBase.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/AbstractRestTestBase.java
@@ -36,19 +36,17 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * Base class for integration REST test.
  */
-@ExtendWith(WorkDirectoryExtension.class)
-abstract class AbstractRestTestBase {
+abstract class AbstractRestTestBase extends IgniteIntegrationTest {
     /** Network ports of the test nodes. */
     static final int[] PORTS = {3344, 3345, 3346};
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ItPortRangeTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ItPortRangeTest.java
index ed5e48165f..63456cbaf6 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ItPortRangeTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ItPortRangeTest.java
@@ -40,21 +40,19 @@ import java.util.stream.IntStream;
 import java.util.stream.Stream;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManagerFactory;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.rest.ssl.ItRestSslTest;
 import org.apache.ignite.internal.rest.ssl.RestNode;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 /** Tests for the REST port range configuration. */
-@ExtendWith(WorkDirectoryExtension.class)
-public class ItPortRangeTest {
+public class ItPortRangeTest extends IgniteIntegrationTest {
 
     /** Trust store path. */
     private static final String trustStorePath = "ssl/truststore.jks";
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ssl/ItRestSslTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ssl/ItRestSslTest.java
index 82e213b829..1e1dbfd785 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ssl/ItRestSslTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/rest/ssl/ItRestSslTest.java
@@ -40,17 +40,15 @@ import java.util.stream.Stream;
 import javax.net.ssl.KeyManagerFactory;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManagerFactory;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /** Tests for the REST SSL configuration. */
-@ExtendWith(WorkDirectoryExtension.class)
-public class ItRestSslTest {
+public class ItRestSslTest extends IgniteIntegrationTest {
 
     /** HTTP port of the test node. */
     private static final int httpPort = 10300;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java
index 5385fb2c14..ad71181c34 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java
@@ -33,12 +33,12 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.schema.configuration.ColumnChange;
 import 
org.apache.ignite.internal.schema.configuration.defaultvalue.ConstantValueDefaultChange;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.table.distributed.TableManager;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteNameUtils;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteException;
@@ -47,14 +47,12 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.function.Executable;
 
 /**
  * Ignition interface tests.
  */
-@ExtendWith(WorkDirectoryExtension.class)
-abstract class AbstractSchemaChangeTest {
+abstract class AbstractSchemaChangeTest extends IgniteIntegrationTest {
     /** Table name. */
     public static final String TABLE = "TBL1";
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/IgniteRunnerTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/IgniteRunnerTest.java
index 77c7b901d1..69a99fcdc7 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/IgniteRunnerTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/IgniteRunnerTest.java
@@ -26,17 +26,15 @@ import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.app.IgniteRunner;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * Tests the start ignite nodes.
  */
-@ExtendWith(WorkDirectoryExtension.class)
-public class IgniteRunnerTest {
+public class IgniteRunnerTest extends IgniteIntegrationTest {
     private static final String NODE_NAME = "node";
 
     @WorkDirectory
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgnitionTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgnitionTest.java
index 870ae48072..b910565d5e 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgnitionTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgnitionTest.java
@@ -40,10 +40,10 @@ import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.IgnitionManager;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.app.IgnitionImpl;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteException;
 import org.junit.jupiter.api.AfterEach;
@@ -51,13 +51,11 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * Ignition interface tests.
  */
-@ExtendWith(WorkDirectoryExtension.class)
-class ItIgnitionTest {
+class ItIgnitionTest extends IgniteIntegrationTest {
     /** Network ports of the test nodes. */
     private static final int[] PORTS = {3344, 3345, 3346};
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItRaftCommandLeftInLogUntilRestartTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItRaftCommandLeftInLogUntilRestartTest.java
index f1699b41ab..75688ae3e2 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItRaftCommandLeftInLogUntilRestartTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItRaftCommandLeftInLogUntilRestartTest.java
@@ -37,7 +37,7 @@ import org.apache.ignite.internal.schema.BinaryRow;
 import org.apache.ignite.internal.schema.BinaryRowEx;
 import org.apache.ignite.internal.schema.marshaller.TupleMarshallerImpl;
 import org.apache.ignite.internal.schema.row.Row;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
@@ -59,7 +59,7 @@ import org.junit.jupiter.api.Test;
  */
 @Disabled("IGNITE-18203 The test goes to deadlock in cluster restart, because 
indexes are required to apply RAFT commands on restart , "
         + "but the table have not started yet.")
-public class ItRaftCommandLeftInLogUntilRestartTest extends 
AbstractBasicIntegrationTest {
+public class ItRaftCommandLeftInLogUntilRestartTest extends 
ClusterPerClassIntegrationTest {
 
     private final Object[][] dataSet = {
             {1, "Igor", 10d},
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java
index 7e2248502c..407ef75445 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java
@@ -29,7 +29,7 @@ import java.util.concurrent.ExecutionException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.table.distributed.TableManager;
 import org.apache.ignite.lang.TableAlreadyExistsException;
 import org.apache.ignite.lang.TableNotFoundException;
@@ -50,7 +50,7 @@ import org.junit.jupiter.api.Test;
  * <li>When a table is not existed, tries to alter or drop the table have to 
failed {@link TableNotFoundException}.</li>
  * </ul>
  */
-public class ItTableApiContractTest extends AbstractBasicIntegrationTest {
+public class ItTableApiContractTest extends ClusterPerClassIntegrationTest {
     /** Schema name. */
     public static final String SCHEMA = "PUBLIC";
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableCreationTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableCreationTest.java
index 7e64088331..171d9bfded 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableCreationTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableCreationTest.java
@@ -32,8 +32,8 @@ import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.RecordView;
@@ -45,14 +45,12 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * Ignition interface tests.
  */
 @Disabled("https://issues.apache.org/jira/browse/IGNITE-14578";)
-@ExtendWith(WorkDirectoryExtension.class)
-class ItTableCreationTest {
+class ItTableCreationTest extends IgniteIntegrationTest {
     /** Network ports of the test nodes. */
     private static final int[] PORTS = {3344, 3345, 3346};
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
index 6b46dc5b76..d5ea1dfe52 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
@@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.concurrent.TimeUnit;
 import org.apache.ignite.internal.app.IgniteImpl;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.sql.engine.SqlQueryProcessor;
 import org.apache.ignite.internal.sql.engine.exec.ExecutionCancelledException;
 import org.apache.ignite.sql.IgniteSql;
@@ -35,7 +35,7 @@ import org.apache.ignite.sql.SqlException;
 import org.junit.jupiter.api.Test;
 
 /** Test common SQL API. */
-public class ItCommonApiTest extends AbstractBasicIntegrationTest {
+public class ItCommonApiTest extends ClusterPerClassIntegrationTest {
     protected SqlQueryProcessor queryProcessor() {
         return (SqlQueryProcessor) ((IgniteImpl) 
CLUSTER_NODES.get(0)).queryEngine();
     }
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
index 25eb439770..6e45c4e2e0 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
@@ -46,7 +46,7 @@ import java.util.stream.StreamSupport;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.client.sql.ClientSql;
 import org.apache.ignite.internal.sql.api.ColumnMetadataImpl.ColumnOriginImpl;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.sql.engine.exec.ExecutionCancelledException;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.tx.TxManager;
@@ -87,7 +87,7 @@ import org.junit.jupiter.api.TestInfo;
  * Tests for asynchronous SQL API.
  */
 @SuppressWarnings("ThrowableNotThrown")
-public class ItSqlAsynchronousApiTest extends AbstractBasicIntegrationTest {
+public class ItSqlAsynchronousApiTest extends ClusterPerClassIntegrationTest {
     private static final int ROW_COUNT = 16;
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
index 976bc792a7..a3b492a560 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
@@ -33,7 +33,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.ignite.internal.app.IgniteImpl;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.tx.TxManager;
 import org.apache.ignite.internal.tx.TxState;
@@ -64,7 +64,7 @@ import org.junit.jupiter.api.TestInfo;
  * Tests for synchronous SQL API.
  */
 @SuppressWarnings("ThrowableNotThrown")
-public class ItSqlSynchronousApiTest extends AbstractBasicIntegrationTest {
+public class ItSqlSynchronousApiTest extends ClusterPerClassIntegrationTest {
     private static final int ROW_COUNT = 16;
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ClusterPerClassIntegrationTest.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
rename to 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ClusterPerClassIntegrationTest.java
index 7f7ac3d6c3..83ae7d24ab 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ClusterPerClassIntegrationTest.java
@@ -41,6 +41,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.IntStream;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
@@ -49,9 +50,7 @@ import 
org.apache.ignite.internal.schema.configuration.index.TableIndexConfigura
 import org.apache.ignite.internal.sql.engine.property.PropertiesHolder;
 import org.apache.ignite.internal.sql.engine.session.SessionId;
 import org.apache.ignite.internal.sql.engine.util.QueryChecker;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteStringFormatter;
 import org.apache.ignite.sql.ColumnMetadata;
@@ -67,15 +66,13 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.TestInfo;
 import org.junit.jupiter.api.TestInstance;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
- * Abstract basic integration test.
+ * Abstract basic integration test that starts a cluster once for all the 
tests it runs.
  */
-@ExtendWith(WorkDirectoryExtension.class)
 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
-public class AbstractBasicIntegrationTest extends BaseIgniteAbstractTest {
-    private static final IgniteLogger LOG = 
Loggers.forClass(AbstractBasicIntegrationTest.class);
+public abstract class ClusterPerClassIntegrationTest extends 
IgniteIntegrationTest {
+    private static final IgniteLogger LOG = 
Loggers.forClass(ClusterPerClassIntegrationTest.class);
 
     /** Timeout should be big enough to prevent premature session expiration. 
*/
     private static final long SESSION_IDLE_TIMEOUT = 
TimeUnit.SECONDS.toMillis(60);
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java
index 5facfad006..429f92a7f4 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java
@@ -36,7 +36,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 /**
  * Group of tests to verify aggregation functions.
  */
-public class ItAggregatesTest extends AbstractBasicIntegrationTest {
+public class ItAggregatesTest extends ClusterPerClassIntegrationTest {
     private static String[] disabledRules = 
{"MapReduceHashAggregateConverterRule", "MapReduceSortAggregateConverterRule",
             "ColocatedHashAggregateConverterRule", 
"ColocatedSortAggregateConverterRule"};
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCorrelatesTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCorrelatesTest.java
index e61cdc873e..aabf891d91 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCorrelatesTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCorrelatesTest.java
@@ -24,7 +24,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
 
 /** Tests for correlated queries. */
-public class ItCorrelatesTest extends AbstractBasicIntegrationTest {
+public class ItCorrelatesTest extends ClusterPerClassIntegrationTest {
     private static final String DISABLED_JOIN_RULES = " /*+ 
DISABLE_RULE('MergeJoinConverter', 'NestedLoopJoinConverter') */ ";
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
index 2493344c85..8529b37e01 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.TestInfo;
 /**
  * Integration test for set op (EXCEPT, INTERSECT).
  */
-public class ItCreateTableDdlTest extends AbstractBasicIntegrationTest {
+public class ItCreateTableDdlTest extends ClusterPerClassIntegrationTest {
     /**
      * Clear tables after each test.
      *
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
index 18be6135e8..b9ad11ace9 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
@@ -35,7 +35,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Test SQL data types.
  */
-public class ItDataTypesTest extends AbstractBasicIntegrationTest {
+public class ItDataTypesTest extends ClusterPerClassIntegrationTest {
     /**
      * Drops all created tables.
      */
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
index ca205d8936..53eb5cf1a6 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
@@ -40,7 +40,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
 
 /** Different DML tests. */
-public class ItDmlTest extends AbstractBasicIntegrationTest {
+public class ItDmlTest extends ClusterPerClassIntegrationTest {
 
     @Override
     protected int nodes() {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
index fdc18de602..1cd14647b2 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
@@ -45,7 +45,7 @@ import org.junit.jupiter.params.provider.EnumSource;
 import org.junit.jupiter.params.provider.EnumSource.Mode;
 
 /** Dynamic parameters checks. */
-public class ItDynamicParameterTest extends AbstractBasicIntegrationTest {
+public class ItDynamicParameterTest extends ClusterPerClassIntegrationTest {
     private static final ThreadLocalRandom RND = ThreadLocalRandom.current();
 
     @BeforeEach
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
index 5a84bfdfcc..827158a6d2 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
@@ -36,7 +36,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Test Ignite SQL functions.
  */
-public class ItFunctionsTest extends AbstractBasicIntegrationTest {
+public class ItFunctionsTest extends ClusterPerClassIntegrationTest {
     private static final Object[] NULL_RESULT = new Object[] { null };
 
     @Test
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
index fac3c5c4b4..3101f099f2 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
@@ -22,7 +22,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Hash spool test.
  */
-public class ItHashSpoolIntegrationTest extends AbstractBasicIntegrationTest {
+public class ItHashSpoolIntegrationTest extends ClusterPerClassIntegrationTest 
{
     @Test
     public void testNullsInSearchRow() {
         sql("CREATE TABLE t(pk varchar default gen_random_uuid PRIMARY KEY, i1 
INTEGER, i2 INTEGER)");
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolTest.java
index 4b17c83fed..2f6639587c 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolTest.java
@@ -28,8 +28,8 @@ import org.junit.jupiter.api.Test;
 /**
  * Hash spool test.
  */
-public class ItHashSpoolTest extends AbstractBasicIntegrationTest {
-    private static final IgniteLogger LOG = 
Loggers.forClass(AbstractBasicIntegrationTest.class);
+public class ItHashSpoolTest extends ClusterPerClassIntegrationTest {
+    private static final IgniteLogger LOG = 
Loggers.forClass(ClusterPerClassIntegrationTest.class);
 
     /**
      * After each.
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
index d486270515..3697d841b8 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 /**
  * Implicit casts are added where it is necessary to do so.
  */
-public class ItImplicitCastsTest extends AbstractBasicIntegrationTest {
+public class ItImplicitCastsTest extends ClusterPerClassIntegrationTest {
 
     @AfterEach
     public void dropTables() {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIndexSpoolTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIndexSpoolTest.java
index 92fe9d4708..b24aa43278 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIndexSpoolTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIndexSpoolTest.java
@@ -34,8 +34,8 @@ import org.junit.jupiter.params.provider.MethodSource;
 /**
  * Index spool test.
  */
-public class ItIndexSpoolTest extends AbstractBasicIntegrationTest {
-    private static final IgniteLogger LOG = 
Loggers.forClass(AbstractBasicIntegrationTest.class);
+public class ItIndexSpoolTest extends ClusterPerClassIntegrationTest {
+    private static final IgniteLogger LOG = 
Loggers.forClass(ClusterPerClassIntegrationTest.class);
 
     /**
      * After each.
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
index c86aa302ef..84fdad78ff 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 /** Interval coverage tests. */
-public class ItIntervalTest extends AbstractBasicIntegrationTest {
+public class ItIntervalTest extends ClusterPerClassIntegrationTest {
     @Override
     protected int nodes() {
         return 1;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java
index da79c6f4a3..eb2f787dd0 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 /**
  * Check JOIN on basic cases.
  */
-public class ItJoinTest extends AbstractBasicIntegrationTest {
+public class ItJoinTest extends ClusterPerClassIntegrationTest {
     @BeforeAll
     public static void beforeTestsStarted() throws InterruptedException {
         sql("CREATE TABLE t1 (id INT PRIMARY KEY, c1 INT NOT NULL, c2 INT, c3 
INT)");
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItLimitOffsetTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItLimitOffsetTest.java
index 19a2f7a655..b3a8db805b 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItLimitOffsetTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItLimitOffsetTest.java
@@ -35,7 +35,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Check LIMIT and\or OFFSET commands.
  */
-public class ItLimitOffsetTest extends AbstractBasicIntegrationTest {
+public class ItLimitOffsetTest extends ClusterPerClassIntegrationTest {
     @BeforeEach
     void beforeEach() {
         sql("CREATE TABLE test (pk INT PRIMARY KEY, col0 INT)");
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
index cc14334d22..40f9dff6fa 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Group of tests to verify the query metadata returned alongside the query 
result.
  */
-public class ItMetadataTest extends AbstractBasicIntegrationTest {
+public class ItMetadataTest extends ClusterPerClassIntegrationTest {
     /**
      * Before all.
      */
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java
index c991831b62..fa249c48d7 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Group of tests that still has not been sorted out. It’s better to avoid 
extending this class with new tests.
  */
-public class ItMixedQueriesTest extends AbstractBasicIntegrationTest {
+public class ItMixedQueriesTest extends ClusterPerClassIntegrationTest {
     /**
      * Before all.
      */
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java
index d2a9686f38..7dbe265507 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java
@@ -37,7 +37,7 @@ import org.junit.jupiter.api.Test;
  * <p>SELECT * FROM products WHERE category = 'Photo' UNION ALL SELECT * FROM 
products WHERE subcategory ='Camera Media' AND LNNVL(category,
  * 'Photo');
  */
-public class ItOrToUnionRuleTest extends AbstractBasicIntegrationTest {
+public class ItOrToUnionRuleTest extends ClusterPerClassIntegrationTest {
     public static final String IDX_SUBCAT_ID = "IDX_SUBCAT_ID";
 
     public static final String IDX_SUBCATEGORY = "IDX_SUBCATEGORY";
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java
index 5748ed359d..e017bd04e4 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.Test;
  * with only useful columns and. For example for tables: T1(f12, f12, f13) and 
T2(f21, f22, f23) sql execution: SELECT t1.f11, t2.f21 FROM
  * T1 t1 INNER JOIN T2 t2 on t1.f11 = t2.f22" need to eleminate all unused 
coluns and take into account only: f11, f21 and f22 cols.
  */
-public class ItProjectScanMergeRuleTest extends AbstractBasicIntegrationTest {
+public class ItProjectScanMergeRuleTest extends ClusterPerClassIntegrationTest 
{
     public static final String IDX_CAT_ID = "IDX_CAT_ID";
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
index 63ec7ccd81..6154b74b57 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
@@ -35,7 +35,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Basic index tests.
  */
-public class ItSecondaryIndexTest extends AbstractBasicIntegrationTest {
+public class ItSecondaryIndexTest extends ClusterPerClassIntegrationTest {
     private static final String PK_SORTED_IDX = "PK_SORTED_IDX";
 
     private static final String DEPID_IDX = "DEPID_IDX";
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java
index f7f4b94168..6ab8d39897 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Integration test for set op (EXCEPT, INTERSECT).
  */
-public class ItSetOpTest extends AbstractBasicIntegrationTest {
+public class ItSetOpTest extends ClusterPerClassIntegrationTest {
     /**
      * Before all.
      */
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
index 043961c3d6..8de2b82978 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
@@ -36,7 +36,7 @@ import org.junit.jupiter.api.Test;
  *
  * @see IgniteSqlOperatorTable
  */
-public class ItSqlOperatorsTest extends AbstractBasicIntegrationTest {
+public class ItSqlOperatorsTest extends ClusterPerClassIntegrationTest {
     /** {@inheritDoc} */
     @Override
     protected int nodes() {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItUuidTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItUuidTest.java
index 2630f24fc8..824826eecd 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItUuidTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItUuidTest.java
@@ -37,7 +37,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 /**
  * Tests for {@link org.apache.ignite.internal.sql.engine.type.UuidType} data 
type.
  */
-public class ItUuidTest extends AbstractBasicIntegrationTest {
+public class ItUuidTest extends ClusterPerClassIntegrationTest {
 
     // UUID1 > UUID2
     private static final UUID UUID_1 = 
UUID.fromString("fd10556e-fc27-4a99-b5e4-89b8344cb3ce");
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
index e069408c73..845b9bd0ed 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
@@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Integration tests for DDL statements that affect distribution zones.
  */
-public class ItZoneDdlTest extends AbstractBasicIntegrationTest {
+public class ItZoneDdlTest extends ClusterPerClassIntegrationTest {
 
     @Test
     public void testCreateIfExists() {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/internal/InternalSchemaTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/internal/InternalSchemaTest.java
index aab4b1e9af..755562b335 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/internal/InternalSchemaTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/internal/InternalSchemaTest.java
@@ -26,7 +26,7 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.configuration.ConfigurationManager;
 import org.apache.ignite.internal.schema.configuration.ExtendedTableView;
 import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.sql.IgniteSql;
 import org.apache.ignite.sql.ResultSet;
@@ -34,7 +34,7 @@ import org.apache.ignite.sql.Session;
 import org.junit.jupiter.api.Test;
 
 /** Tests for internal manipulations with schema. */
-public class InternalSchemaTest extends AbstractBasicIntegrationTest {
+public class InternalSchemaTest extends ClusterPerClassIntegrationTest {
     /**
      * Checks that schema version is updated even if column names are 
intersected.
      */
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/ItSqlLogicTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/ItSqlLogicTest.java
index 7ae5e52317..ef7255df7c 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/ItSqlLogicTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/ItSqlLogicTest.java
@@ -40,6 +40,7 @@ import java.util.stream.IntStream;
 import java.util.stream.Stream;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.sqllogic.SqlLogicTestEnvironment.RestartMode;
@@ -47,7 +48,6 @@ import 
org.apache.ignite.internal.sqllogic.SqlScriptRunner.RunnerRuntime;
 import org.apache.ignite.internal.testframework.SystemPropertiesExtension;
 import org.apache.ignite.internal.testframework.WithSystemProperty;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.CollectionUtils;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteStringFormatter;
@@ -137,11 +137,11 @@ import org.junit.jupiter.api.extension.ExtendWith;
  * @see <a 
href="https://www.sqlite.org/sqllogictest/doc/trunk/about.wiki";>Extended format 
documentation.</a>
  */
 @Tag(value = "sqllogic")
-@ExtendWith({WorkDirectoryExtension.class, SystemPropertiesExtension.class})
+@ExtendWith(SystemPropertiesExtension.class)
 @WithSystemProperty(key = "IMPLICIT_PK_ENABLED", value = "true")
 @SqlLogicTestEnvironment(scriptsRoot = "src/integrationTest/sql")
 @Disabled("https://issues.apache.org/jira/browse/IGNITE-18000";)
-public class ItSqlLogicTest {
+public class ItSqlLogicTest extends IgniteIntegrationTest {
     private static final String SQL_LOGIC_TEST_INCLUDE_SLOW = 
"SQL_LOGIC_TEST_INCLUDE_SLOW";
 
     private static final String NODE_NAME_PREFIX = "sqllogic";
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ssl/ItSslTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ssl/ItSslTest.java
index 4d19136f88..4e5a4471fe 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ssl/ItSslTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ssl/ItSslTest.java
@@ -31,8 +31,8 @@ import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.client.IgniteClientConnectionException;
 import org.apache.ignite.client.SslConfiguration;
 import org.apache.ignite.internal.Cluster;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.intellij.lang.annotations.Language;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
@@ -41,11 +41,9 @@ import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 /** SSL support integration test. */
-@ExtendWith(WorkDirectoryExtension.class)
-public class ItSslTest {
+public class ItSslTest extends IgniteIntegrationTest {
 
     private static String password;
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/start/ItStartTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/start/ItStartTest.java
index 8533daabd2..8a9a9935f0 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/start/ItStartTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/start/ItStartTest.java
@@ -33,21 +33,19 @@ import java.util.logging.Handler;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 import org.apache.ignite.internal.Cluster;
+import org.apache.ignite.internal.IgniteIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.index.IndexManager;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.testframework.WorkDirectory;
-import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.testframework.jul.NoOpHandler;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.function.Executable;
 
-@ExtendWith(WorkDirectoryExtension.class)
-class ItStartTest {
+class ItStartTest extends IgniteIntegrationTest {
     private Cluster cluster;
 
     @WorkDirectory
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItPublicApiColocationTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItPublicApiColocationTest.java
index 2b073d7222..1231e76a84 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItPublicApiColocationTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItPublicApiColocationTest.java
@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.ignite.internal.schema.BinaryRow;
 import org.apache.ignite.internal.schema.NativeTypeSpec;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
@@ -57,7 +57,7 @@ import org.junit.jupiter.params.provider.MethodSource;
  * Tests for the data colocation.
  */
 @ExtendWith(WorkDirectoryExtension.class)
-public class ItPublicApiColocationTest extends AbstractBasicIntegrationTest {
+public class ItPublicApiColocationTest extends ClusterPerClassIntegrationTest {
     /** Rows count ot test. */
     private static final int ROWS = 10;
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItTableScanTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItTableScanTest.java
index 1e5aafd41b..42c6c55a4c 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItTableScanTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItTableScanTest.java
@@ -55,7 +55,7 @@ import 
org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import 
org.apache.ignite.internal.schema.configuration.index.TableIndexConfiguration;
 import org.apache.ignite.internal.schema.row.Row;
 import org.apache.ignite.internal.schema.row.RowAssembler;
-import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
+import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import 
org.apache.ignite.internal.table.distributed.replicator.TablePartitionId;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.tx.InternalTransaction;
@@ -75,7 +75,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Tests to check a scan internal command.
  */
-public class ItTableScanTest extends AbstractBasicIntegrationTest {
+public class ItTableScanTest extends ClusterPerClassIntegrationTest {
     /** Table name. */
     private static final String TABLE_NAME = "test";
 
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java 
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
index f1d9cb9130..3dff97b779 100644
--- 
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
+++ 
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -38,6 +39,7 @@ import 
org.apache.ignite.internal.properties.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.NodeStoppingException;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.TestOnly;
 
 /**
  * Implementation of an entry point for handling grid lifecycle.
@@ -138,6 +140,24 @@ public class IgnitionImpl implements Ignition {
         });
     }
 
+    /**
+     * Stops all Ignite instances started in this JVM.
+     */
+    @TestOnly
+    public void stopAll() {
+        List<String> nodeNames = new ArrayList<>(nodes.keySet());
+
+        if (!nodeNames.isEmpty()) {
+            LOG.info("Going to stop Ignite instances: " + nodeNames);
+
+            for (String nodeName : nodeNames) {
+                stop(nodeName);
+            }
+
+            LOG.info("Stopped the following Ignite instances: " + nodeNames);
+        }
+    }
+
     @Override
     public void init(String nodeName, Collection<String> 
metaStorageNodenodeNames, String clusterName) {
         init(nodeName, metaStorageNodenodeNames, List.of(), clusterName);
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/internal/component/RestAddressReporter.java
 
b/modules/runner/src/main/java/org/apache/ignite/internal/component/RestAddressReporter.java
index 51e1b2677c..af5447fecf 100644
--- 
a/modules/runner/src/main/java/org/apache/ignite/internal/component/RestAddressReporter.java
+++ 
b/modules/runner/src/main/java/org/apache/ignite/internal/component/RestAddressReporter.java
@@ -23,6 +23,8 @@ import java.nio.file.Path;
 import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import org.apache.ignite.internal.logger.IgniteLogger;
+import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.lang.ErrorGroups.Common;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.network.NetworkAddress;
@@ -33,6 +35,8 @@ import org.jetbrains.annotations.Nullable;
  */
 public class RestAddressReporter {
 
+    private static final IgniteLogger LOG = 
Loggers.forClass(RestAddressReporter.class);
+
     private static final String REPORT_FILE_NAME = "rest-address";
 
     private final Path workDir;
@@ -73,7 +77,7 @@ public class RestAddressReporter {
             Files.delete(workDir.resolve(REPORT_FILE_NAME));
         } catch (IOException e) {
             String message = "Unexpected error when trying to remove REST 
server network address file";
-            throw new IgniteException(Common.UNEXPECTED_ERR, message, e);
+            LOG.error(message, new IgniteException(Common.UNEXPECTED_ERR, 
message, e));
         }
     }
 }
diff --git 
a/modules/runner/src/test/java/org/apache/ignite/internal/component/RestAddressReporterTest.java
 
b/modules/runner/src/test/java/org/apache/ignite/internal/component/RestAddressReporterTest.java
index 174cd12a16..b69badbbee 100644
--- 
a/modules/runner/src/test/java/org/apache/ignite/internal/component/RestAddressReporterTest.java
+++ 
b/modules/runner/src/test/java/org/apache/ignite/internal/component/RestAddressReporterTest.java
@@ -18,16 +18,13 @@
 package org.apache.ignite.internal.component;
 
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
-import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import org.apache.ignite.lang.ErrorGroups.Common;
-import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.network.NetworkAddress;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -98,18 +95,14 @@ class RestAddressReporterTest {
 
     @Test
     @DisplayName("If there is no report file for some reason then throw an 
exception")
-    void throwsExceptionWhenThereIsNoFile(@TempDir Path tmpDir) {
+    void doesNotThrowExceptionWhenThereIsNoFile(@TempDir Path tmpDir) {
         // Given
         Path path = tmpDir.resolve("nosuchpath");
         RestAddressReporter reporter = new RestAddressReporter(path);
 
         // When try to removeReport
-        IgniteException thrown = assertThrows(IgniteException.class, 
reporter::removeReport);
-
-        // Then exception thrown with proper message
-        assertThat(thrown.getMessage(), containsString("Unexpected error when 
trying to remove REST server network address file"));
-        // And it has COMMON error group
-        assertThat(thrown.groupName(), 
equalTo(Common.COMMON_ERR_GROUP.name()));
+        // Then nothing is thrown
+        assertDoesNotThrow(reporter::removeReport);
     }
 
     @Test

Reply via email to