You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by GitBox <gi...@apache.org> on 2021/03/28 13:59:35 UTC

[GitHub] [shardingsphere] dmsolr opened a new pull request #9857: Refactor: IT framework

dmsolr opened a new pull request #9857:
URL: https://github.com/apache/shardingsphere/pull/9857


   Fixes #9828 .
   
   Changes proposed in this pull request:
   - Use more JUnit components/features instead of customization.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [shardingsphere] terrymanu merged pull request #9857: Refactor: IT framework

Posted by GitBox <gi...@apache.org>.
terrymanu merged pull request #9857:
URL: https://github.com/apache/shardingsphere/pull/9857


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [shardingsphere] codecov-io commented on pull request #9857: Refactor: IT framework

Posted by GitBox <gi...@apache.org>.
codecov-io commented on pull request #9857:
URL: https://github.com/apache/shardingsphere/pull/9857#issuecomment-809053177


   # [Codecov](https://codecov.io/gh/apache/shardingsphere/pull/9857?src=pr&el=h1) Report
   > Merging [#9857](https://codecov.io/gh/apache/shardingsphere/pull/9857?src=pr&el=desc) (0584149) into [master](https://codecov.io/gh/apache/shardingsphere/commit/9c43c4d7ba6ec117d46d7127ca06a8ade41839cf?el=desc) (9c43c4d) will **not change** coverage.
   > The diff coverage is `n/a`.
   
   [![Impacted file tree graph](https://codecov.io/gh/apache/shardingsphere/pull/9857/graphs/tree.svg?width=650&height=150&src=pr&token=ZvlXpWa7so)](https://codecov.io/gh/apache/shardingsphere/pull/9857?src=pr&el=tree)
   
   ```diff
   @@            Coverage Diff            @@
   ##             master    #9857   +/-   ##
   =========================================
     Coverage     67.83%   67.83%           
     Complexity      678      678           
   =========================================
     Files          1672     1672           
     Lines         28092    28092           
     Branches       4981     4981           
   =========================================
     Hits          19057    19057           
     Misses         7620     7620           
     Partials       1415     1415           
   ```
   
   
   
   ------
   
   [Continue to review full report at Codecov](https://codecov.io/gh/apache/shardingsphere/pull/9857?src=pr&el=continue).
   > **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
   > `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
   > Powered by [Codecov](https://codecov.io/gh/apache/shardingsphere/pull/9857?src=pr&el=footer). Last update [9c43c4d...0584149](https://codecov.io/gh/apache/shardingsphere/pull/9857?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [shardingsphere] terrymanu commented on a change in pull request #9857: Refactor: IT framework

Posted by GitBox <gi...@apache.org>.
terrymanu commented on a change in pull request #9857:
URL: https://github.com/apache/shardingsphere/pull/9857#discussion_r603001715



##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ComposeManagement.java
##########
@@ -0,0 +1,80 @@
+/*
+ * 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.shardingsphere.test.integration.junit.compose;
+
+import com.google.common.collect.Maps;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.test.integration.env.EnvironmentType;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
+import org.junit.rules.ExternalResource;
+
+import java.util.Map;
+
+@RequiredArgsConstructor
+public class ComposeManagement extends ExternalResource {

Review comment:
       It is better to make the class as final if it is not design for extend

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/env/IntegrationTestEnvironment.java
##########
@@ -77,11 +77,11 @@ private IntegrationTestEnvironment() {
             createEmbeddedDatabases(embeddedDatabaseProps);
         }
         proxyEnvironments = createProxyEnvironments(databaseProps);
-        if (EnvironmentType.DOCKER == envType) {
-            for (String each : scenarios) {
-                waitForEnvironmentReady(each);
-            }
-        }
+//        if (EnvironmentType.DOCKER == envType) {
+//            for (String each : scenarios) {
+//                waitForEnvironmentReady(each);
+//            }
+//        }

Review comment:
       It is better to remove temp commented codes

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ComposeManagement.java
##########
@@ -0,0 +1,80 @@
+/*
+ * 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.shardingsphere.test.integration.junit.compose;
+
+import com.google.common.collect.Maps;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.test.integration.env.EnvironmentType;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
+import org.junit.rules.ExternalResource;
+
+import java.util.Map;
+
+@RequiredArgsConstructor
+public class ComposeManagement extends ExternalResource {
+    
+    private final Map<String, ContainerCompose> composeMap = Maps.newHashMap();

Review comment:
       It is unnecessary to use Guava to create new HashMap, please use raw java API

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ComposeManagement.java
##########
@@ -0,0 +1,80 @@
+/*
+ * 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.shardingsphere.test.integration.junit.compose;
+
+import com.google.common.collect.Maps;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.test.integration.env.EnvironmentType;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
+import org.junit.rules.ExternalResource;
+
+import java.util.Map;
+
+@RequiredArgsConstructor
+public class ComposeManagement extends ExternalResource {
+    
+    private final Map<String, ContainerCompose> composeMap = Maps.newHashMap();
+    
+    private final String suiteName;
+    
+    /**
+     * Create or get container compose.
+     *
+     * @param parameterizedArray parameterized array
+     * @return container compose
+     */
+    public ContainerCompose getOrCreateCompose(final ParameterizedArray parameterizedArray) {
+        String key = generateKey(parameterizedArray);
+        if (composeMap.containsKey(key)) {
+            return composeMap.get(key);
+        }
+        ContainerCompose compose = new ContainerCompose(suiteName, parameterizedArray);
+        composeMap.put(key, compose);
+        return compose;
+    }
+    
+    private String generateKey(final ParameterizedArray parameter) {
+        return new StringBuffer(suiteName)
+                .append('-')
+                .append(parameter.getScenario())
+                .append('-')
+                .append(parameter.getAdapter())
+                .append('-')
+                .append(parameter.getDatabaseType().getName())
+                .toString();

Review comment:
       How about using `String.join()` here?

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ContainerCompose.java
##########
@@ -17,185 +17,105 @@
 
 package org.apache.shardingsphere.test.integration.junit.compose;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import com.google.common.collect.Lists;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.test.integration.junit.annotation.ContainerInitializer;
-import org.apache.shardingsphere.test.integration.junit.annotation.OnContainer;
-import org.apache.shardingsphere.test.integration.junit.annotation.ShardingSphereITInject;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
-import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
+import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
+import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereJDBCContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereProxyContainer;
 import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
 import org.apache.shardingsphere.test.integration.junit.logging.ContainerLogs;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
+import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.lifecycle.Startable;
 
 import java.io.Closeable;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 /**
  * Container compose.
  */
-@RequiredArgsConstructor
 @Slf4j
-public final class ContainerCompose implements Closeable {
+public final class ContainerCompose extends ExternalResource implements Closeable {
     
     private final Network network = Network.newNetwork();
     
     private final String clusterName;
     
-    private final TestClass testClass;
-    
-    private final TestCaseDescription description;
-    
-    private final TestCaseBeanContext beanContext;
-    
-    private ImmutableList<ShardingSphereContainer> containers;
+    private final ParameterizedArray parameterizedArray;
     
-    @Setter
-    private Object instance;
-    
-    /**
-     * Create container and then autowired to test-case.
-     */
-    public void createContainers() {
-        ImmutableList.Builder<ShardingSphereContainer> builder = new ImmutableList.Builder<>();
-        testClass.getAnnotatedFields(OnContainer.class).stream()
-                .map(this::createContainer)
-                .filter(Objects::nonNull)
-                .peek(this::inject)
-                .forEach(builder::add);
-        containers = builder.build();
-    }
-    
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final FrameworkField field) {
-        OnContainer metadata = field.getAnnotation(OnContainer.class);
-        try {
-            ShardingSphereContainer result = createContainer(metadata);
-            if (Objects.isNull(result)) {
-                log.warn("container {} is not activated.", metadata.name());
-                return null;
-            }
-            result.setDockerName(metadata.name());
-            String hostName = metadata.hostName();
-            if (Strings.isNullOrEmpty(hostName)) {
-                hostName = metadata.name();
-            }
-            result.withNetworkAliases(hostName);
-            result.setNetwork(network);
-            result.withLogConsumer(ContainerLogs.newConsumer(clusterName + "_" + metadata.name()));
-            field.getField().setAccessible(true);
-            field.getField().set(instance, result);
-            beanContext.registerBeanByName(metadata.name(), result);
-            log.info("container {} is activated.", metadata.name());
-            return result;
-            // CHECKSTYLE:OFF
-        } catch (final Exception ex) {
-            // CHECKSTYLE:ON
-            log.error("Failed to instantiate container {}.", metadata.name(), ex);
-        }
-        return null;
-    }
+    private final ImmutableList<ShardingSphereContainer> containers;
     
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final OnContainer metadata) {
-        switch (metadata.type()) {
-            case ADAPTER:
-                return createAdapterContainer();
-            case STORAGE:
-                return createStorageContainer();
-            case COORDINATOR:
-                throw new UnsupportedOperationException("");
-            default:
-                return null;
-        }
-    }
+    @Getter
+    private final ShardingSphereStorageContainer storageContainer;
     
-    private ShardingSphereAdapterContainer createAdapterContainer() {
-        switch (description.getAdapter()) {
-            case "proxy":
-                return new ShardingSphereProxyContainer();
-            case "jdbc":
-                return new ShardingSphereJDBCContainer();
-            default:
-                throw new RuntimeException("Adapter[" + description.getAdapter() + "] is unknown.");
-        }
-    }
+    @Getter
+    private final ShardingSphereAdapterContainer adapterContainer;
     
-    private ShardingSphereStorageContainer createStorageContainer() {
-        switch (description.getStorageType()) {
-            case MySQL:
-                return new MySQLContainer();
-            case H2:
-                return new H2Container();
-            default:
-                throw new RuntimeException("Unknown storage type " + description.getStorageType());
-        }
-    }
+    private volatile boolean started;
     
-    private void inject(final ShardingSphereContainer container) {
-        Collection<Field> fields = new LinkedList<>();
-        for (Class<?> klass = container.getClass(); Objects.nonNull(klass); klass = klass.getSuperclass()) {
-            fields.addAll(Arrays.asList(klass.getDeclaredFields()));
-        }
-        fields.stream().filter(each -> each.isAnnotationPresent(ShardingSphereITInject.class)).forEach(each -> setFieldValue(each, container));
+    public ContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
+        this.clusterName = clusterName;
+        this.parameterizedArray = parameterizedArray;
+        TestCaseDescription description = TestCaseDescription.builder()
+                .adapter(parameterizedArray.getAdapter())
+                .scenario(parameterizedArray.getScenario())
+                .database(parameterizedArray.getDatabaseType().getName())
+                .executionMode(ExecutionMode.SINGLE)
+                .sqlCommandType(SQLCommandType.DAL)
+                .build();
+        this.storageContainer = createStorageContainer(description);
+        this.adapterContainer = createAdapterContainer(description);
+        adapterContainer.dependsOn(storageContainer);
+        this.containers = ImmutableList.of(storageContainer, adapterContainer);
     }
     
-    private void setFieldValue(final Field field, final ShardingSphereContainer container) {
-        Class<?> type = field.getType();
-        field.setAccessible(true);
-        try {
-            if (type.isPrimitive() || String.class == type) {
-                field.set(container, beanContext.getBeanByName(field.getName()));
-            } else {
-                field.set(container, beanContext.getBean(type));
+    private ShardingSphereAdapterContainer createAdapterContainer(final TestCaseDescription description) {
+        Supplier<ShardingSphereAdapterContainer> supplier = () -> {
+            switch (parameterizedArray.getAdapter()) {
+                case "proxy":
+                    return new ShardingSphereProxyContainer();
+                case "jdbc":
+                    return new ShardingSphereJDBCContainer();
+                default:
+                    throw new RuntimeException("Adapter[" + parameterizedArray.getAdapter() + "] is unknown.");
+                
             }
-        } catch (final IllegalAccessException ex) {
-            log.error("Failed to auto inject {}.{}.", container.getContainerName(), field.getName());
-        }
-    }
-    
-    /**
-     * Create the initializer and execute.
-     */
-    @SneakyThrows
-    public void createInitializerAndExecute() {
-        testClass.getAnnotatedMethods(ContainerInitializer.class).forEach(this::invokeExplosively);
+        };
+        ShardingSphereAdapterContainer adapterContainer = supplier.get();
+        adapterContainer.setDescription(description);
+        adapterContainer.setNetwork(network);
+        adapterContainer.withLogConsumer(ContainerLogs.newConsumer(this.clusterName + "-adapter"));
+        return adapterContainer;
     }
     
-    private void invokeExplosively(final FrameworkMethod frameworkMethod) {
-        try {
-            if (frameworkMethod.isStatic()) {
-                frameworkMethod.getMethod().setAccessible(true);
-                frameworkMethod.invokeExplosively(null);
-            } else {
-                frameworkMethod.getMethod().setAccessible(true);
-                frameworkMethod.invokeExplosively(instance);
+    private ShardingSphereStorageContainer createStorageContainer(final TestCaseDescription description) {
+        Supplier<ShardingSphereStorageContainer> supplier = () -> {
+            switch (parameterizedArray.getDatabaseType().getName()) {
+                case "MySQL":
+                    return new MySQLContainer();
+                case "H2":
+                    return new H2Container();
+                default:
+                    throw new RuntimeException("Unknown storage type " + parameterizedArray.getDatabaseType());
             }
-            // CHECKSTYLE:OFF
-        } catch (final Throwable ex) {
-            // CHECKSTYLE:ON
-            throw new RuntimeException(ex);
-        }
+        };
+        ShardingSphereStorageContainer storageContainer = supplier.get();
+        storageContainer.setNetwork(network);
+        storageContainer.setDescription(description);
+        storageContainer.withLogConsumer(ContainerLogs.newConsumer(this.clusterName + "-storage"));
+        storageContainer.setNetworkAliases(Lists.newArrayList("mysql.db.host"));
+        return storageContainer;

Review comment:
       The result variable should name as `result`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ContainerCompose.java
##########
@@ -227,9 +147,22 @@ public void waitUntilReady() {
                         }
                     }
                 });
+        started = true;
         log.info("Any container is startup.");

Review comment:
       It is better to remove unnecessary log, `No news is good news`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/param/model/AssertionParameterizedArray.java
##########
@@ -46,6 +48,9 @@
     
     private final SQLCommandType sqlCommandType;
     
+    @Setter

Review comment:
       Can we consider use constructor to instead of setter to initialize field?

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchITCase.java
##########
@@ -58,30 +57,33 @@
 @Getter(AccessLevel.PROTECTED)
 public abstract class BatchITCase extends BaseITCase {
    
-    @Getter
-    @ShardingSphereITInject
-    private IntegrationTestCase testCase;
+    private final Collection<DataSet> dataSets = new LinkedList<>();
     
-    private Collection<DataSet> dataSets;
+    private final Collection<DataSet> dataSet = Lists.newArrayList();

Review comment:
       Please use raw JAVA API

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/param/model/CaseParameterizedArray.java
##########
@@ -40,6 +42,9 @@
     
     private final SQLCommandType sqlCommandType;
     
+    @Setter

Review comment:
       Can we consider use constructor to instead of setter to initialize field?

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ComposeManagement.java
##########
@@ -0,0 +1,80 @@
+/*
+ * 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.shardingsphere.test.integration.junit.compose;
+
+import com.google.common.collect.Maps;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.test.integration.env.EnvironmentType;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
+import org.junit.rules.ExternalResource;
+
+import java.util.Map;
+
+@RequiredArgsConstructor
+public class ComposeManagement extends ExternalResource {

Review comment:
       Class name should be Noun
   `ComposeManagement` is not a good name enough. Maybe `ComposeManager` is better

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/AdditionalDMLIT.java
##########
@@ -19,29 +19,53 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
-import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertFalse;
 
-@TestCaseSpec(sqlCommandType = SQLCommandType.DML, executionMode = ExecutionMode.ADDITIONAL)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class AdditionalDMLIT extends BaseDMLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("AdditionalDMLIT");
+    
+    public AdditionalDMLIT(final AssertionParameterizedArray parameterizedArray) {
+        super(parameterizedArray);
+    }
+    
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<AssertionParameterizedArray> getParameters() {
+        if (IntegrationTestEnvironment.getInstance().isRunAdditionalTestCases()) {
+            return ParameterizedArrayFactory.getAssertionParameterized(SQLCommandType.DML)
+                    .stream()
+                    .peek(e -> e.setCompose(mgr.getOrCreateCompose(e)))

Review comment:
       Please rename `e` and `mgr`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/AdditionalDMLIT.java
##########
@@ -19,29 +19,53 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
-import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertFalse;
 
-@TestCaseSpec(sqlCommandType = SQLCommandType.DML, executionMode = ExecutionMode.ADDITIONAL)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class AdditionalDMLIT extends BaseDMLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("AdditionalDMLIT");

Review comment:
       Please rename `mgr`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/GeneralDMLIT.java
##########
@@ -20,26 +20,45 @@
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertFalse;
 
-@TestCaseSpec(name = "General DML", sqlCommandType = SQLCommandType.DML)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class GeneralDMLIT extends BaseDMLIT {
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDMLIT");

Review comment:
       Please rename `mgr`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/AdditionalDQLIT.java
##########
@@ -19,26 +19,50 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
-import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertTrue;
 
-@TestCaseSpec(name = "Additional DQL", sqlCommandType = SQLCommandType.DQL, executionMode = ExecutionMode.ADDITIONAL)
 @ParallelRuntimeStrategy(ParallelLevel.CASE)
 public final class AdditionalDQLIT extends BaseDQLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("AdditionalDQLIT");

Review comment:
       Please rename `mgr`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ContainerCompose.java
##########
@@ -17,185 +17,105 @@
 
 package org.apache.shardingsphere.test.integration.junit.compose;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import com.google.common.collect.Lists;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.test.integration.junit.annotation.ContainerInitializer;
-import org.apache.shardingsphere.test.integration.junit.annotation.OnContainer;
-import org.apache.shardingsphere.test.integration.junit.annotation.ShardingSphereITInject;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
-import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
+import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
+import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereJDBCContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereProxyContainer;
 import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
 import org.apache.shardingsphere.test.integration.junit.logging.ContainerLogs;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
+import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.lifecycle.Startable;
 
 import java.io.Closeable;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 /**
  * Container compose.
  */
-@RequiredArgsConstructor
 @Slf4j
-public final class ContainerCompose implements Closeable {
+public final class ContainerCompose extends ExternalResource implements Closeable {
     
     private final Network network = Network.newNetwork();
     
     private final String clusterName;
     
-    private final TestClass testClass;
-    
-    private final TestCaseDescription description;
-    
-    private final TestCaseBeanContext beanContext;
-    
-    private ImmutableList<ShardingSphereContainer> containers;
+    private final ParameterizedArray parameterizedArray;
     
-    @Setter
-    private Object instance;
-    
-    /**
-     * Create container and then autowired to test-case.
-     */
-    public void createContainers() {
-        ImmutableList.Builder<ShardingSphereContainer> builder = new ImmutableList.Builder<>();
-        testClass.getAnnotatedFields(OnContainer.class).stream()
-                .map(this::createContainer)
-                .filter(Objects::nonNull)
-                .peek(this::inject)
-                .forEach(builder::add);
-        containers = builder.build();
-    }
-    
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final FrameworkField field) {
-        OnContainer metadata = field.getAnnotation(OnContainer.class);
-        try {
-            ShardingSphereContainer result = createContainer(metadata);
-            if (Objects.isNull(result)) {
-                log.warn("container {} is not activated.", metadata.name());
-                return null;
-            }
-            result.setDockerName(metadata.name());
-            String hostName = metadata.hostName();
-            if (Strings.isNullOrEmpty(hostName)) {
-                hostName = metadata.name();
-            }
-            result.withNetworkAliases(hostName);
-            result.setNetwork(network);
-            result.withLogConsumer(ContainerLogs.newConsumer(clusterName + "_" + metadata.name()));
-            field.getField().setAccessible(true);
-            field.getField().set(instance, result);
-            beanContext.registerBeanByName(metadata.name(), result);
-            log.info("container {} is activated.", metadata.name());
-            return result;
-            // CHECKSTYLE:OFF
-        } catch (final Exception ex) {
-            // CHECKSTYLE:ON
-            log.error("Failed to instantiate container {}.", metadata.name(), ex);
-        }
-        return null;
-    }
+    private final ImmutableList<ShardingSphereContainer> containers;
     
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final OnContainer metadata) {
-        switch (metadata.type()) {
-            case ADAPTER:
-                return createAdapterContainer();
-            case STORAGE:
-                return createStorageContainer();
-            case COORDINATOR:
-                throw new UnsupportedOperationException("");
-            default:
-                return null;
-        }
-    }
+    @Getter
+    private final ShardingSphereStorageContainer storageContainer;
     
-    private ShardingSphereAdapterContainer createAdapterContainer() {
-        switch (description.getAdapter()) {
-            case "proxy":
-                return new ShardingSphereProxyContainer();
-            case "jdbc":
-                return new ShardingSphereJDBCContainer();
-            default:
-                throw new RuntimeException("Adapter[" + description.getAdapter() + "] is unknown.");
-        }
-    }
+    @Getter
+    private final ShardingSphereAdapterContainer adapterContainer;
     
-    private ShardingSphereStorageContainer createStorageContainer() {
-        switch (description.getStorageType()) {
-            case MySQL:
-                return new MySQLContainer();
-            case H2:
-                return new H2Container();
-            default:
-                throw new RuntimeException("Unknown storage type " + description.getStorageType());
-        }
-    }
+    private volatile boolean started;
     
-    private void inject(final ShardingSphereContainer container) {
-        Collection<Field> fields = new LinkedList<>();
-        for (Class<?> klass = container.getClass(); Objects.nonNull(klass); klass = klass.getSuperclass()) {
-            fields.addAll(Arrays.asList(klass.getDeclaredFields()));
-        }
-        fields.stream().filter(each -> each.isAnnotationPresent(ShardingSphereITInject.class)).forEach(each -> setFieldValue(each, container));
+    public ContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
+        this.clusterName = clusterName;
+        this.parameterizedArray = parameterizedArray;
+        TestCaseDescription description = TestCaseDescription.builder()
+                .adapter(parameterizedArray.getAdapter())
+                .scenario(parameterizedArray.getScenario())
+                .database(parameterizedArray.getDatabaseType().getName())
+                .executionMode(ExecutionMode.SINGLE)
+                .sqlCommandType(SQLCommandType.DAL)
+                .build();
+        this.storageContainer = createStorageContainer(description);
+        this.adapterContainer = createAdapterContainer(description);
+        adapterContainer.dependsOn(storageContainer);
+        this.containers = ImmutableList.of(storageContainer, adapterContainer);
     }
     
-    private void setFieldValue(final Field field, final ShardingSphereContainer container) {
-        Class<?> type = field.getType();
-        field.setAccessible(true);
-        try {
-            if (type.isPrimitive() || String.class == type) {
-                field.set(container, beanContext.getBeanByName(field.getName()));
-            } else {
-                field.set(container, beanContext.getBean(type));
+    private ShardingSphereAdapterContainer createAdapterContainer(final TestCaseDescription description) {
+        Supplier<ShardingSphereAdapterContainer> supplier = () -> {
+            switch (parameterizedArray.getAdapter()) {
+                case "proxy":
+                    return new ShardingSphereProxyContainer();
+                case "jdbc":
+                    return new ShardingSphereJDBCContainer();
+                default:
+                    throw new RuntimeException("Adapter[" + parameterizedArray.getAdapter() + "] is unknown.");

Review comment:
       Please use String.format to instead of String concat.

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/annotation/OnContainer.java
##########
@@ -46,4 +46,5 @@
      * @return container type.
      */
     ContainerType type() default ContainerType.ADAPTER;
+    

Review comment:
       Please do not change original code if unnecessary 

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ComposeManagement.java
##########
@@ -0,0 +1,80 @@
+/*
+ * 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.shardingsphere.test.integration.junit.compose;
+
+import com.google.common.collect.Maps;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.test.integration.env.EnvironmentType;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
+import org.junit.rules.ExternalResource;
+
+import java.util.Map;
+
+@RequiredArgsConstructor
+public class ComposeManagement extends ExternalResource {
+    
+    private final Map<String, ContainerCompose> composeMap = Maps.newHashMap();
+    
+    private final String suiteName;
+    
+    /**
+     * Create or get container compose.
+     *
+     * @param parameterizedArray parameterized array
+     * @return container compose
+     */
+    public ContainerCompose getOrCreateCompose(final ParameterizedArray parameterizedArray) {
+        String key = generateKey(parameterizedArray);
+        if (composeMap.containsKey(key)) {
+            return composeMap.get(key);
+        }
+        ContainerCompose compose = new ContainerCompose(suiteName, parameterizedArray);
+        composeMap.put(key, compose);
+        return compose;
+    }
+    
+    private String generateKey(final ParameterizedArray parameter) {
+        return new StringBuffer(suiteName)
+                .append('-')
+                .append(parameter.getScenario())
+                .append('-')
+                .append(parameter.getAdapter())
+                .append('-')
+                .append(parameter.getDatabaseType().getName())
+                .toString();
+    }
+    
+    @Override
+    protected void before() throws Throwable {
+        if (EnvironmentType.DOCKER != IntegrationTestEnvironment.getInstance().getEnvType()) {
+            DatabaseEnvironmentManager.executeInitSQLs();
+        } else {
+            composeMap.values().forEach(e -> {

Review comment:
       `e` should rename to `each`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ContainerCompose.java
##########
@@ -17,185 +17,105 @@
 
 package org.apache.shardingsphere.test.integration.junit.compose;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import com.google.common.collect.Lists;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.test.integration.junit.annotation.ContainerInitializer;
-import org.apache.shardingsphere.test.integration.junit.annotation.OnContainer;
-import org.apache.shardingsphere.test.integration.junit.annotation.ShardingSphereITInject;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
-import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
+import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
+import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereJDBCContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereProxyContainer;
 import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
 import org.apache.shardingsphere.test.integration.junit.logging.ContainerLogs;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
+import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.lifecycle.Startable;
 
 import java.io.Closeable;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 /**
  * Container compose.
  */
-@RequiredArgsConstructor
 @Slf4j
-public final class ContainerCompose implements Closeable {
+public final class ContainerCompose extends ExternalResource implements Closeable {
     
     private final Network network = Network.newNetwork();
     
     private final String clusterName;
     
-    private final TestClass testClass;
-    
-    private final TestCaseDescription description;
-    
-    private final TestCaseBeanContext beanContext;
-    
-    private ImmutableList<ShardingSphereContainer> containers;
+    private final ParameterizedArray parameterizedArray;
     
-    @Setter
-    private Object instance;
-    
-    /**
-     * Create container and then autowired to test-case.
-     */
-    public void createContainers() {
-        ImmutableList.Builder<ShardingSphereContainer> builder = new ImmutableList.Builder<>();
-        testClass.getAnnotatedFields(OnContainer.class).stream()
-                .map(this::createContainer)
-                .filter(Objects::nonNull)
-                .peek(this::inject)
-                .forEach(builder::add);
-        containers = builder.build();
-    }
-    
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final FrameworkField field) {
-        OnContainer metadata = field.getAnnotation(OnContainer.class);
-        try {
-            ShardingSphereContainer result = createContainer(metadata);
-            if (Objects.isNull(result)) {
-                log.warn("container {} is not activated.", metadata.name());
-                return null;
-            }
-            result.setDockerName(metadata.name());
-            String hostName = metadata.hostName();
-            if (Strings.isNullOrEmpty(hostName)) {
-                hostName = metadata.name();
-            }
-            result.withNetworkAliases(hostName);
-            result.setNetwork(network);
-            result.withLogConsumer(ContainerLogs.newConsumer(clusterName + "_" + metadata.name()));
-            field.getField().setAccessible(true);
-            field.getField().set(instance, result);
-            beanContext.registerBeanByName(metadata.name(), result);
-            log.info("container {} is activated.", metadata.name());
-            return result;
-            // CHECKSTYLE:OFF
-        } catch (final Exception ex) {
-            // CHECKSTYLE:ON
-            log.error("Failed to instantiate container {}.", metadata.name(), ex);
-        }
-        return null;
-    }
+    private final ImmutableList<ShardingSphereContainer> containers;
     
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final OnContainer metadata) {
-        switch (metadata.type()) {
-            case ADAPTER:
-                return createAdapterContainer();
-            case STORAGE:
-                return createStorageContainer();
-            case COORDINATOR:
-                throw new UnsupportedOperationException("");
-            default:
-                return null;
-        }
-    }
+    @Getter
+    private final ShardingSphereStorageContainer storageContainer;
     
-    private ShardingSphereAdapterContainer createAdapterContainer() {
-        switch (description.getAdapter()) {
-            case "proxy":
-                return new ShardingSphereProxyContainer();
-            case "jdbc":
-                return new ShardingSphereJDBCContainer();
-            default:
-                throw new RuntimeException("Adapter[" + description.getAdapter() + "] is unknown.");
-        }
-    }
+    @Getter
+    private final ShardingSphereAdapterContainer adapterContainer;
     
-    private ShardingSphereStorageContainer createStorageContainer() {
-        switch (description.getStorageType()) {
-            case MySQL:
-                return new MySQLContainer();
-            case H2:
-                return new H2Container();
-            default:
-                throw new RuntimeException("Unknown storage type " + description.getStorageType());
-        }
-    }
+    private volatile boolean started;
     
-    private void inject(final ShardingSphereContainer container) {
-        Collection<Field> fields = new LinkedList<>();
-        for (Class<?> klass = container.getClass(); Objects.nonNull(klass); klass = klass.getSuperclass()) {
-            fields.addAll(Arrays.asList(klass.getDeclaredFields()));
-        }
-        fields.stream().filter(each -> each.isAnnotationPresent(ShardingSphereITInject.class)).forEach(each -> setFieldValue(each, container));
+    public ContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
+        this.clusterName = clusterName;
+        this.parameterizedArray = parameterizedArray;
+        TestCaseDescription description = TestCaseDescription.builder()
+                .adapter(parameterizedArray.getAdapter())
+                .scenario(parameterizedArray.getScenario())
+                .database(parameterizedArray.getDatabaseType().getName())
+                .executionMode(ExecutionMode.SINGLE)
+                .sqlCommandType(SQLCommandType.DAL)
+                .build();
+        this.storageContainer = createStorageContainer(description);
+        this.adapterContainer = createAdapterContainer(description);
+        adapterContainer.dependsOn(storageContainer);
+        this.containers = ImmutableList.of(storageContainer, adapterContainer);

Review comment:
       Is it necessary to use ImmutableList here?
   How about use raw JAVA with Arrays.asList?

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ComposeManagement.java
##########
@@ -0,0 +1,80 @@
+/*
+ * 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.shardingsphere.test.integration.junit.compose;
+
+import com.google.common.collect.Maps;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.test.integration.env.EnvironmentType;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
+import org.junit.rules.ExternalResource;
+
+import java.util.Map;
+
+@RequiredArgsConstructor
+public class ComposeManagement extends ExternalResource {
+    
+    private final Map<String, ContainerCompose> composeMap = Maps.newHashMap();
+    
+    private final String suiteName;
+    
+    /**
+     * Create or get container compose.
+     *
+     * @param parameterizedArray parameterized array
+     * @return container compose
+     */
+    public ContainerCompose getOrCreateCompose(final ParameterizedArray parameterizedArray) {
+        String key = generateKey(parameterizedArray);
+        if (composeMap.containsKey(key)) {
+            return composeMap.get(key);
+        }
+        ContainerCompose compose = new ContainerCompose(suiteName, parameterizedArray);
+        composeMap.put(key, compose);
+        return compose;

Review comment:
       The result variable should name as `result` 

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ContainerCompose.java
##########
@@ -17,185 +17,105 @@
 
 package org.apache.shardingsphere.test.integration.junit.compose;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import com.google.common.collect.Lists;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.test.integration.junit.annotation.ContainerInitializer;
-import org.apache.shardingsphere.test.integration.junit.annotation.OnContainer;
-import org.apache.shardingsphere.test.integration.junit.annotation.ShardingSphereITInject;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
-import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
+import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
+import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereJDBCContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereProxyContainer;
 import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
 import org.apache.shardingsphere.test.integration.junit.logging.ContainerLogs;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
+import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.lifecycle.Startable;
 
 import java.io.Closeable;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 /**
  * Container compose.
  */
-@RequiredArgsConstructor
 @Slf4j
-public final class ContainerCompose implements Closeable {
+public final class ContainerCompose extends ExternalResource implements Closeable {
     
     private final Network network = Network.newNetwork();
     
     private final String clusterName;
     
-    private final TestClass testClass;
-    
-    private final TestCaseDescription description;
-    
-    private final TestCaseBeanContext beanContext;
-    
-    private ImmutableList<ShardingSphereContainer> containers;
+    private final ParameterizedArray parameterizedArray;
     
-    @Setter
-    private Object instance;
-    
-    /**
-     * Create container and then autowired to test-case.
-     */
-    public void createContainers() {
-        ImmutableList.Builder<ShardingSphereContainer> builder = new ImmutableList.Builder<>();
-        testClass.getAnnotatedFields(OnContainer.class).stream()
-                .map(this::createContainer)
-                .filter(Objects::nonNull)
-                .peek(this::inject)
-                .forEach(builder::add);
-        containers = builder.build();
-    }
-    
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final FrameworkField field) {
-        OnContainer metadata = field.getAnnotation(OnContainer.class);
-        try {
-            ShardingSphereContainer result = createContainer(metadata);
-            if (Objects.isNull(result)) {
-                log.warn("container {} is not activated.", metadata.name());
-                return null;
-            }
-            result.setDockerName(metadata.name());
-            String hostName = metadata.hostName();
-            if (Strings.isNullOrEmpty(hostName)) {
-                hostName = metadata.name();
-            }
-            result.withNetworkAliases(hostName);
-            result.setNetwork(network);
-            result.withLogConsumer(ContainerLogs.newConsumer(clusterName + "_" + metadata.name()));
-            field.getField().setAccessible(true);
-            field.getField().set(instance, result);
-            beanContext.registerBeanByName(metadata.name(), result);
-            log.info("container {} is activated.", metadata.name());
-            return result;
-            // CHECKSTYLE:OFF
-        } catch (final Exception ex) {
-            // CHECKSTYLE:ON
-            log.error("Failed to instantiate container {}.", metadata.name(), ex);
-        }
-        return null;
-    }
+    private final ImmutableList<ShardingSphereContainer> containers;
     
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final OnContainer metadata) {
-        switch (metadata.type()) {
-            case ADAPTER:
-                return createAdapterContainer();
-            case STORAGE:
-                return createStorageContainer();
-            case COORDINATOR:
-                throw new UnsupportedOperationException("");
-            default:
-                return null;
-        }
-    }
+    @Getter
+    private final ShardingSphereStorageContainer storageContainer;
     
-    private ShardingSphereAdapterContainer createAdapterContainer() {
-        switch (description.getAdapter()) {
-            case "proxy":
-                return new ShardingSphereProxyContainer();
-            case "jdbc":
-                return new ShardingSphereJDBCContainer();
-            default:
-                throw new RuntimeException("Adapter[" + description.getAdapter() + "] is unknown.");
-        }
-    }
+    @Getter
+    private final ShardingSphereAdapterContainer adapterContainer;
     
-    private ShardingSphereStorageContainer createStorageContainer() {
-        switch (description.getStorageType()) {
-            case MySQL:
-                return new MySQLContainer();
-            case H2:
-                return new H2Container();
-            default:
-                throw new RuntimeException("Unknown storage type " + description.getStorageType());
-        }
-    }
+    private volatile boolean started;
     
-    private void inject(final ShardingSphereContainer container) {
-        Collection<Field> fields = new LinkedList<>();
-        for (Class<?> klass = container.getClass(); Objects.nonNull(klass); klass = klass.getSuperclass()) {
-            fields.addAll(Arrays.asList(klass.getDeclaredFields()));
-        }
-        fields.stream().filter(each -> each.isAnnotationPresent(ShardingSphereITInject.class)).forEach(each -> setFieldValue(each, container));
+    public ContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
+        this.clusterName = clusterName;
+        this.parameterizedArray = parameterizedArray;
+        TestCaseDescription description = TestCaseDescription.builder()
+                .adapter(parameterizedArray.getAdapter())
+                .scenario(parameterizedArray.getScenario())
+                .database(parameterizedArray.getDatabaseType().getName())
+                .executionMode(ExecutionMode.SINGLE)
+                .sqlCommandType(SQLCommandType.DAL)
+                .build();
+        this.storageContainer = createStorageContainer(description);
+        this.adapterContainer = createAdapterContainer(description);
+        adapterContainer.dependsOn(storageContainer);
+        this.containers = ImmutableList.of(storageContainer, adapterContainer);
     }
     
-    private void setFieldValue(final Field field, final ShardingSphereContainer container) {
-        Class<?> type = field.getType();
-        field.setAccessible(true);
-        try {
-            if (type.isPrimitive() || String.class == type) {
-                field.set(container, beanContext.getBeanByName(field.getName()));
-            } else {
-                field.set(container, beanContext.getBean(type));
+    private ShardingSphereAdapterContainer createAdapterContainer(final TestCaseDescription description) {
+        Supplier<ShardingSphereAdapterContainer> supplier = () -> {
+            switch (parameterizedArray.getAdapter()) {
+                case "proxy":
+                    return new ShardingSphereProxyContainer();
+                case "jdbc":
+                    return new ShardingSphereJDBCContainer();
+                default:
+                    throw new RuntimeException("Adapter[" + parameterizedArray.getAdapter() + "] is unknown.");
+                
             }
-        } catch (final IllegalAccessException ex) {
-            log.error("Failed to auto inject {}.{}.", container.getContainerName(), field.getName());
-        }
-    }
-    
-    /**
-     * Create the initializer and execute.
-     */
-    @SneakyThrows
-    public void createInitializerAndExecute() {
-        testClass.getAnnotatedMethods(ContainerInitializer.class).forEach(this::invokeExplosively);
+        };
+        ShardingSphereAdapterContainer adapterContainer = supplier.get();
+        adapterContainer.setDescription(description);
+        adapterContainer.setNetwork(network);
+        adapterContainer.withLogConsumer(ContainerLogs.newConsumer(this.clusterName + "-adapter"));
+        return adapterContainer;

Review comment:
       The result variable should name as `result`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ContainerCompose.java
##########
@@ -17,185 +17,105 @@
 
 package org.apache.shardingsphere.test.integration.junit.compose;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import com.google.common.collect.Lists;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.test.integration.junit.annotation.ContainerInitializer;
-import org.apache.shardingsphere.test.integration.junit.annotation.OnContainer;
-import org.apache.shardingsphere.test.integration.junit.annotation.ShardingSphereITInject;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
-import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
+import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
+import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereJDBCContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereProxyContainer;
 import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
 import org.apache.shardingsphere.test.integration.junit.logging.ContainerLogs;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
+import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.lifecycle.Startable;
 
 import java.io.Closeable;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 /**
  * Container compose.
  */
-@RequiredArgsConstructor
 @Slf4j
-public final class ContainerCompose implements Closeable {
+public final class ContainerCompose extends ExternalResource implements Closeable {
     
     private final Network network = Network.newNetwork();
     
     private final String clusterName;
     
-    private final TestClass testClass;
-    
-    private final TestCaseDescription description;
-    
-    private final TestCaseBeanContext beanContext;
-    
-    private ImmutableList<ShardingSphereContainer> containers;
+    private final ParameterizedArray parameterizedArray;
     
-    @Setter
-    private Object instance;
-    
-    /**
-     * Create container and then autowired to test-case.
-     */
-    public void createContainers() {
-        ImmutableList.Builder<ShardingSphereContainer> builder = new ImmutableList.Builder<>();
-        testClass.getAnnotatedFields(OnContainer.class).stream()
-                .map(this::createContainer)
-                .filter(Objects::nonNull)
-                .peek(this::inject)
-                .forEach(builder::add);
-        containers = builder.build();
-    }
-    
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final FrameworkField field) {
-        OnContainer metadata = field.getAnnotation(OnContainer.class);
-        try {
-            ShardingSphereContainer result = createContainer(metadata);
-            if (Objects.isNull(result)) {
-                log.warn("container {} is not activated.", metadata.name());
-                return null;
-            }
-            result.setDockerName(metadata.name());
-            String hostName = metadata.hostName();
-            if (Strings.isNullOrEmpty(hostName)) {
-                hostName = metadata.name();
-            }
-            result.withNetworkAliases(hostName);
-            result.setNetwork(network);
-            result.withLogConsumer(ContainerLogs.newConsumer(clusterName + "_" + metadata.name()));
-            field.getField().setAccessible(true);
-            field.getField().set(instance, result);
-            beanContext.registerBeanByName(metadata.name(), result);
-            log.info("container {} is activated.", metadata.name());
-            return result;
-            // CHECKSTYLE:OFF
-        } catch (final Exception ex) {
-            // CHECKSTYLE:ON
-            log.error("Failed to instantiate container {}.", metadata.name(), ex);
-        }
-        return null;
-    }
+    private final ImmutableList<ShardingSphereContainer> containers;
     
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final OnContainer metadata) {
-        switch (metadata.type()) {
-            case ADAPTER:
-                return createAdapterContainer();
-            case STORAGE:
-                return createStorageContainer();
-            case COORDINATOR:
-                throw new UnsupportedOperationException("");
-            default:
-                return null;
-        }
-    }
+    @Getter
+    private final ShardingSphereStorageContainer storageContainer;
     
-    private ShardingSphereAdapterContainer createAdapterContainer() {
-        switch (description.getAdapter()) {
-            case "proxy":
-                return new ShardingSphereProxyContainer();
-            case "jdbc":
-                return new ShardingSphereJDBCContainer();
-            default:
-                throw new RuntimeException("Adapter[" + description.getAdapter() + "] is unknown.");
-        }
-    }
+    @Getter
+    private final ShardingSphereAdapterContainer adapterContainer;
     
-    private ShardingSphereStorageContainer createStorageContainer() {
-        switch (description.getStorageType()) {
-            case MySQL:
-                return new MySQLContainer();
-            case H2:
-                return new H2Container();
-            default:
-                throw new RuntimeException("Unknown storage type " + description.getStorageType());
-        }
-    }
+    private volatile boolean started;
     
-    private void inject(final ShardingSphereContainer container) {
-        Collection<Field> fields = new LinkedList<>();
-        for (Class<?> klass = container.getClass(); Objects.nonNull(klass); klass = klass.getSuperclass()) {
-            fields.addAll(Arrays.asList(klass.getDeclaredFields()));
-        }
-        fields.stream().filter(each -> each.isAnnotationPresent(ShardingSphereITInject.class)).forEach(each -> setFieldValue(each, container));
+    public ContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
+        this.clusterName = clusterName;
+        this.parameterizedArray = parameterizedArray;
+        TestCaseDescription description = TestCaseDescription.builder()
+                .adapter(parameterizedArray.getAdapter())
+                .scenario(parameterizedArray.getScenario())
+                .database(parameterizedArray.getDatabaseType().getName())
+                .executionMode(ExecutionMode.SINGLE)
+                .sqlCommandType(SQLCommandType.DAL)
+                .build();
+        this.storageContainer = createStorageContainer(description);
+        this.adapterContainer = createAdapterContainer(description);
+        adapterContainer.dependsOn(storageContainer);
+        this.containers = ImmutableList.of(storageContainer, adapterContainer);
     }
     
-    private void setFieldValue(final Field field, final ShardingSphereContainer container) {
-        Class<?> type = field.getType();
-        field.setAccessible(true);
-        try {
-            if (type.isPrimitive() || String.class == type) {
-                field.set(container, beanContext.getBeanByName(field.getName()));
-            } else {
-                field.set(container, beanContext.getBean(type));
+    private ShardingSphereAdapterContainer createAdapterContainer(final TestCaseDescription description) {
+        Supplier<ShardingSphereAdapterContainer> supplier = () -> {
+            switch (parameterizedArray.getAdapter()) {
+                case "proxy":
+                    return new ShardingSphereProxyContainer();
+                case "jdbc":
+                    return new ShardingSphereJDBCContainer();
+                default:
+                    throw new RuntimeException("Adapter[" + parameterizedArray.getAdapter() + "] is unknown.");

Review comment:
       It is better to use `UnsupportedOperationException` here

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/container/ShardingSphereContainer.java
##########
@@ -62,7 +61,7 @@
     private final boolean isFakeContainer;
     
     @Getter
-    @ShardingSphereITInject
+    @Setter

Review comment:
       Can we consider use constructor to instead of setter to initialize field?

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/compose/ContainerCompose.java
##########
@@ -17,185 +17,105 @@
 
 package org.apache.shardingsphere.test.integration.junit.compose;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import com.google.common.collect.Lists;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.test.integration.junit.annotation.ContainerInitializer;
-import org.apache.shardingsphere.test.integration.junit.annotation.OnContainer;
-import org.apache.shardingsphere.test.integration.junit.annotation.ShardingSphereITInject;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
-import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
-import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
+import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
+import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereJDBCContainer;
 import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereProxyContainer;
 import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.H2Container;
+import org.apache.shardingsphere.test.integration.junit.container.storage.impl.MySQLContainer;
 import org.apache.shardingsphere.test.integration.junit.logging.ContainerLogs;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
+import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.lifecycle.Startable;
 
 import java.io.Closeable;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 /**
  * Container compose.
  */
-@RequiredArgsConstructor
 @Slf4j
-public final class ContainerCompose implements Closeable {
+public final class ContainerCompose extends ExternalResource implements Closeable {
     
     private final Network network = Network.newNetwork();
     
     private final String clusterName;
     
-    private final TestClass testClass;
-    
-    private final TestCaseDescription description;
-    
-    private final TestCaseBeanContext beanContext;
-    
-    private ImmutableList<ShardingSphereContainer> containers;
+    private final ParameterizedArray parameterizedArray;
     
-    @Setter
-    private Object instance;
-    
-    /**
-     * Create container and then autowired to test-case.
-     */
-    public void createContainers() {
-        ImmutableList.Builder<ShardingSphereContainer> builder = new ImmutableList.Builder<>();
-        testClass.getAnnotatedFields(OnContainer.class).stream()
-                .map(this::createContainer)
-                .filter(Objects::nonNull)
-                .peek(this::inject)
-                .forEach(builder::add);
-        containers = builder.build();
-    }
-    
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final FrameworkField field) {
-        OnContainer metadata = field.getAnnotation(OnContainer.class);
-        try {
-            ShardingSphereContainer result = createContainer(metadata);
-            if (Objects.isNull(result)) {
-                log.warn("container {} is not activated.", metadata.name());
-                return null;
-            }
-            result.setDockerName(metadata.name());
-            String hostName = metadata.hostName();
-            if (Strings.isNullOrEmpty(hostName)) {
-                hostName = metadata.name();
-            }
-            result.withNetworkAliases(hostName);
-            result.setNetwork(network);
-            result.withLogConsumer(ContainerLogs.newConsumer(clusterName + "_" + metadata.name()));
-            field.getField().setAccessible(true);
-            field.getField().set(instance, result);
-            beanContext.registerBeanByName(metadata.name(), result);
-            log.info("container {} is activated.", metadata.name());
-            return result;
-            // CHECKSTYLE:OFF
-        } catch (final Exception ex) {
-            // CHECKSTYLE:ON
-            log.error("Failed to instantiate container {}.", metadata.name(), ex);
-        }
-        return null;
-    }
+    private final ImmutableList<ShardingSphereContainer> containers;
     
-    @SneakyThrows
-    private ShardingSphereContainer createContainer(final OnContainer metadata) {
-        switch (metadata.type()) {
-            case ADAPTER:
-                return createAdapterContainer();
-            case STORAGE:
-                return createStorageContainer();
-            case COORDINATOR:
-                throw new UnsupportedOperationException("");
-            default:
-                return null;
-        }
-    }
+    @Getter
+    private final ShardingSphereStorageContainer storageContainer;
     
-    private ShardingSphereAdapterContainer createAdapterContainer() {
-        switch (description.getAdapter()) {
-            case "proxy":
-                return new ShardingSphereProxyContainer();
-            case "jdbc":
-                return new ShardingSphereJDBCContainer();
-            default:
-                throw new RuntimeException("Adapter[" + description.getAdapter() + "] is unknown.");
-        }
-    }
+    @Getter
+    private final ShardingSphereAdapterContainer adapterContainer;
     
-    private ShardingSphereStorageContainer createStorageContainer() {
-        switch (description.getStorageType()) {
-            case MySQL:
-                return new MySQLContainer();
-            case H2:
-                return new H2Container();
-            default:
-                throw new RuntimeException("Unknown storage type " + description.getStorageType());
-        }
-    }
+    private volatile boolean started;
     
-    private void inject(final ShardingSphereContainer container) {
-        Collection<Field> fields = new LinkedList<>();
-        for (Class<?> klass = container.getClass(); Objects.nonNull(klass); klass = klass.getSuperclass()) {
-            fields.addAll(Arrays.asList(klass.getDeclaredFields()));
-        }
-        fields.stream().filter(each -> each.isAnnotationPresent(ShardingSphereITInject.class)).forEach(each -> setFieldValue(each, container));
+    public ContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
+        this.clusterName = clusterName;
+        this.parameterizedArray = parameterizedArray;
+        TestCaseDescription description = TestCaseDescription.builder()
+                .adapter(parameterizedArray.getAdapter())
+                .scenario(parameterizedArray.getScenario())
+                .database(parameterizedArray.getDatabaseType().getName())
+                .executionMode(ExecutionMode.SINGLE)
+                .sqlCommandType(SQLCommandType.DAL)
+                .build();
+        this.storageContainer = createStorageContainer(description);
+        this.adapterContainer = createAdapterContainer(description);
+        adapterContainer.dependsOn(storageContainer);
+        this.containers = ImmutableList.of(storageContainer, adapterContainer);
     }
     
-    private void setFieldValue(final Field field, final ShardingSphereContainer container) {
-        Class<?> type = field.getType();
-        field.setAccessible(true);
-        try {
-            if (type.isPrimitive() || String.class == type) {
-                field.set(container, beanContext.getBeanByName(field.getName()));
-            } else {
-                field.set(container, beanContext.getBean(type));
+    private ShardingSphereAdapterContainer createAdapterContainer(final TestCaseDescription description) {
+        Supplier<ShardingSphereAdapterContainer> supplier = () -> {
+            switch (parameterizedArray.getAdapter()) {
+                case "proxy":
+                    return new ShardingSphereProxyContainer();
+                case "jdbc":
+                    return new ShardingSphereJDBCContainer();
+                default:
+                    throw new RuntimeException("Adapter[" + parameterizedArray.getAdapter() + "] is unknown.");
+                
             }
-        } catch (final IllegalAccessException ex) {
-            log.error("Failed to auto inject {}.{}.", container.getContainerName(), field.getName());
-        }
-    }
-    
-    /**
-     * Create the initializer and execute.
-     */
-    @SneakyThrows
-    public void createInitializerAndExecute() {
-        testClass.getAnnotatedMethods(ContainerInitializer.class).forEach(this::invokeExplosively);
+        };
+        ShardingSphereAdapterContainer adapterContainer = supplier.get();
+        adapterContainer.setDescription(description);
+        adapterContainer.setNetwork(network);
+        adapterContainer.withLogConsumer(ContainerLogs.newConsumer(this.clusterName + "-adapter"));
+        return adapterContainer;
     }
     
-    private void invokeExplosively(final FrameworkMethod frameworkMethod) {
-        try {
-            if (frameworkMethod.isStatic()) {
-                frameworkMethod.getMethod().setAccessible(true);
-                frameworkMethod.invokeExplosively(null);
-            } else {
-                frameworkMethod.getMethod().setAccessible(true);
-                frameworkMethod.invokeExplosively(instance);
+    private ShardingSphereStorageContainer createStorageContainer(final TestCaseDescription description) {
+        Supplier<ShardingSphereStorageContainer> supplier = () -> {
+            switch (parameterizedArray.getDatabaseType().getName()) {
+                case "MySQL":
+                    return new MySQLContainer();
+                case "H2":
+                    return new H2Container();
+                default:
+                    throw new RuntimeException("Unknown storage type " + parameterizedArray.getDatabaseType());
             }
-            // CHECKSTYLE:OFF
-        } catch (final Throwable ex) {
-            // CHECKSTYLE:ON
-            throw new RuntimeException(ex);
-        }
+        };
+        ShardingSphereStorageContainer storageContainer = supplier.get();
+        storageContainer.setNetwork(network);
+        storageContainer.setDescription(description);
+        storageContainer.withLogConsumer(ContainerLogs.newConsumer(this.clusterName + "-storage"));
+        storageContainer.setNetworkAliases(Lists.newArrayList("mysql.db.host"));

Review comment:
       Please use raw JAVA API to instead of Guava

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/GeneralDALIT.java
##########
@@ -19,29 +19,47 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.ParameterFilter;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
-import org.apache.shardingsphere.test.integration.junit.param.TestCaseParameters;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
-@ParameterFilter(filter = GeneralDALIT.Filter.class)
-@TestCaseSpec(sqlCommandType = SQLCommandType.DAL)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class GeneralDALIT extends BaseDALIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDALIT");
+    
+    public GeneralDALIT(final AssertionParameterizedArray parameterizedArray) {
+        super(parameterizedArray);
+    }
+    
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<ParameterizedArray> getParameters() {
+        return ParameterizedArrayFactory.getAssertionParameterized(SQLCommandType.DAL)
+                .stream()
+                .filter(e -> SQLExecuteType.Literal == e.getSqlExecuteType())
+                .filter(e -> "proxy".equals(e.getAdapter()))
+                .peek(e -> e.setCompose(mgr.getOrCreateCompose(e)))

Review comment:
       Please do not use abbreviation with `mgr`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-fixture/src/test/java/org/apache/shardingsphere/test/integration/junit/runner/ShardingSphereRunner.java
##########
@@ -17,281 +17,24 @@
 
 package org.apache.shardingsphere.test.integration.junit.runner;
 
-import com.google.common.base.Strings;
-import lombok.Getter;
-import lombok.SneakyThrows;
-import org.apache.shardingsphere.test.integration.cases.IntegrationTestCasesLoader;
-import org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCase;
-import org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
-import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
 import org.apache.shardingsphere.test.integration.env.EnvironmentType;
 import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
-import org.apache.shardingsphere.test.integration.junit.annotation.BeforeAllCases;
-import org.apache.shardingsphere.test.integration.junit.annotation.ParameterFilter;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
-import org.apache.shardingsphere.test.integration.junit.compose.ContainerCompose;
-import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
-import org.apache.shardingsphere.test.integration.junit.param.TestCaseParameters;
-import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
-import org.apache.shardingsphere.test.integration.junit.param.model.CaseParameterizedArray;
-import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.ParallelRunnerScheduler;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
-import org.junit.runner.Runner;
-import org.junit.runners.Suite;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
+import org.junit.runners.Parameterized;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-public final class ShardingSphereRunner extends Suite {
-    
-    private final List<Runner> runners;
-    
-    @Getter
-    private final String caseName;
-    
-    private ContainerCompose compose;
-    
-    private final TestCaseBeanContext beanContext = new TestCaseBeanContext();
-    
-    public ShardingSphereRunner(final Class<?> klass) throws InitializationError {
-        super(klass, Collections.emptyList());
-        TestCaseSpec testCaseSpec = getTestClass().getAnnotation(TestCaseSpec.class);
-        caseName = Strings.isNullOrEmpty(testCaseSpec.name()) ? klass.getSimpleName() : testCaseSpec.name();
-        if (EnvironmentType.NATIVE == IntegrationTestEnvironment.getInstance().getEnvType()) {
-            ParallelRuntimeStrategy parallelRuntimeStrategy = getTestClass().getAnnotation(ParallelRuntimeStrategy.class);
+public final class ShardingSphereRunner extends Parameterized {
+    
+    // CHECKSTYLE:OFF
+    public ShardingSphereRunner(final Class<?> klass) throws Throwable {

Review comment:
       It is better to keep the variable name consist, `klass` should rename to `clazz`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/GeneralDALIT.java
##########
@@ -19,29 +19,47 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.ParameterFilter;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
-import org.apache.shardingsphere.test.integration.junit.param.TestCaseParameters;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseBeanContext;
-import org.apache.shardingsphere.test.integration.junit.runner.TestCaseDescription;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
-@ParameterFilter(filter = GeneralDALIT.Filter.class)
-@TestCaseSpec(sqlCommandType = SQLCommandType.DAL)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class GeneralDALIT extends BaseDALIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDALIT");
+    
+    public GeneralDALIT(final AssertionParameterizedArray parameterizedArray) {
+        super(parameterizedArray);
+    }
+    
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<ParameterizedArray> getParameters() {
+        return ParameterizedArrayFactory.getAssertionParameterized(SQLCommandType.DAL)

Review comment:
       Please rename `e` to `each`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/GeneralDDLIT.java
##########
@@ -19,19 +19,39 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
-@TestCaseSpec(sqlCommandType = SQLCommandType.DDL)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class GeneralDDLIT extends BaseDDLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDDLIT");

Review comment:
       Please do not use abbreviation to name variable.

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/GeneralDDLIT.java
##########
@@ -19,19 +19,39 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
-@TestCaseSpec(sqlCommandType = SQLCommandType.DDL)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class GeneralDDLIT extends BaseDDLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDDLIT");
+    
+    public GeneralDDLIT(final AssertionParameterizedArray parameterizedArray) {
+        super(parameterizedArray);
+    }
+    
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<AssertionParameterizedArray> getParameters() {
+        return ParameterizedArrayFactory.getAssertionParameterized(SQLCommandType.DDL)
+                .stream()
+                .peek(e -> e.setCompose(mgr.getOrCreateCompose(e)))

Review comment:
       please rename `e` and `mgr`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/GeneralDCLIT.java
##########
@@ -19,19 +19,40 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
-@TestCaseSpec(sqlCommandType = SQLCommandType.DCL)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class GeneralDCLIT extends BaseDCLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDCLIT");
+    
+    public GeneralDCLIT(final AssertionParameterizedArray parameterizedArray) {
+        super(parameterizedArray);
+    }
+    
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<ParameterizedArray> getParameters() {
+        return ParameterizedArrayFactory.getAssertionParameterized(SQLCommandType.DCL)
+                .stream()
+                .peek(e -> e.setCompose(mgr.getOrCreateCompose(e)))

Review comment:
       Please rename `e` and `mgr`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/AdditionalDQLIT.java
##########
@@ -19,26 +19,50 @@
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
-import org.apache.shardingsphere.test.integration.common.ExecutionMode;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertTrue;
 
-@TestCaseSpec(name = "Additional DQL", sqlCommandType = SQLCommandType.DQL, executionMode = ExecutionMode.ADDITIONAL)
 @ParallelRuntimeStrategy(ParallelLevel.CASE)
 public final class AdditionalDQLIT extends BaseDQLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("AdditionalDQLIT");
+    
+    public AdditionalDQLIT(final AssertionParameterizedArray parameter) {
+        super(parameter);
+    }
+    
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<AssertionParameterizedArray> getParameters() {
+        if (IntegrationTestEnvironment.getInstance().isRunAdditionalTestCases()) {
+            return ParameterizedArrayFactory.getAssertionParameterized(SQLCommandType.DQL)
+                    .stream()
+                    .peek(e -> e.setCompose(mgr.getOrCreateCompose(e)))

Review comment:
       Please rename `e`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/GeneralDMLIT.java
##########
@@ -20,26 +20,45 @@
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertFalse;
 
-@TestCaseSpec(name = "General DML", sqlCommandType = SQLCommandType.DML)
 @ParallelRuntimeStrategy(ParallelLevel.SCENARIO)
 public final class GeneralDMLIT extends BaseDMLIT {
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDMLIT");
+    
+    public GeneralDMLIT(final AssertionParameterizedArray parameterizedArray) {
+        super(parameterizedArray);
+    }
+    
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<AssertionParameterizedArray> getParameters() {
+        return ParameterizedArrayFactory.getAssertionParameterized(SQLCommandType.DML)
+                .stream()
+                .peek(e -> e.setCompose(mgr.getOrCreateCompose(e)))

Review comment:
       Please rename `e`

##########
File path: shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/GeneralDQLIT.java
##########
@@ -20,24 +20,45 @@
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
 import org.apache.shardingsphere.test.integration.common.SQLExecuteType;
-import org.apache.shardingsphere.test.integration.junit.annotation.TestCaseSpec;
+import org.apache.shardingsphere.test.integration.junit.compose.ComposeManagement;
+import org.apache.shardingsphere.test.integration.junit.param.ParameterizedArrayFactory;
+import org.apache.shardingsphere.test.integration.junit.param.model.AssertionParameterizedArray;
+import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelLevel;
 import org.apache.shardingsphere.test.integration.junit.runner.parallel.annotaion.ParallelRuntimeStrategy;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.runners.Parameterized;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.text.ParseException;
+import java.util.Collection;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertTrue;
 
-@TestCaseSpec(name = "GeneralDQLIT", sqlCommandType = SQLCommandType.DQL)
 @ParallelRuntimeStrategy(ParallelLevel.CASE)
 public final class GeneralDQLIT extends BaseDQLIT {
     
+    @ClassRule
+    public static ComposeManagement mgr = new ComposeManagement("GeneralDQLIT");

Review comment:
       Please rename `mgr`




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org