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

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 117de56e685 Upgrade to junit 5 on transaction E2E (#24560)
117de56e685 is described below

commit 117de56e685b6e18751d566ea86e8ad4f93a4d99
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Mar 12 17:47:05 2023 +0800

    Upgrade to junit 5 on transaction E2E (#24560)
---
 .../cases/DiscoveryContainerComposer.java          |   2 +-
 .../cases/alterresource/AddResourceTestCase.java   |  11 +-
 .../cases/alterresource/CloseResourceTestCase.java |   9 +-
 .../cases/autocommit/MySQLAutoCommitTestCase.java  |   3 +-
 .../autocommit/PostgreSQLAutoCommitTestCase.java   |   3 +-
 .../cases/base/BaseTransactionTestCase.java        |   8 +-
 .../classictransfer/ClassicTransferTestCase.java   |   3 +-
 .../BroadcastTableTransactionTestCase.java         |   3 +-
 .../ExceptionInTransactionTestCase.java            |   3 +-
 .../MultiJDBCConnectionsTestCase.java              |   3 +-
 .../MultiOperationsCommitAndRollbackTestCase.java  |   3 +-
 .../MultiTableCommitAndRollbackTestCase.java       |   3 +-
 .../MultiTransactionInConnectionTestCase.java      |   3 +-
 .../SingleTableCommitAndRollbackTestCase.java      |   3 +-
 .../cases/cursor/OpenGaussCursorTestCase.java      |   8 +-
 .../cases/nested/NestedTransactionTestCase.java    |   3 +-
 .../cases/readonly/MySQLSetReadOnlyTestCase.java   |   3 +-
 .../readonly/PostgreSQLSetReadOnlyTestCase.java    |   3 +-
 .../cases/savepoint/MySQLSavePointTestCase.java    |   3 +-
 .../savepoint/OpenGaussSavePointTestCase.java      |   3 +-
 .../savepoint/PostgreSQLSavePointTestCase.java     |   3 +-
 .../cases/settype/SetTransactionTypeTestCase.java  |   3 +-
 .../settype/TransactionTypeHolderTestCase.java     |   3 +-
 .../cases/truncate/MySQLLocalTruncateTestCase.java |   3 +-
 .../cases/truncate/MySQLXATruncateTestCase.java    |   3 +-
 .../PostgreSQLAndOpenGaussTruncateTestCase.java    |   3 +-
 .../e2e/transaction/engine/base/BaseE2EIT.java     | 344 ------------------
 .../engine/base/TransactionBaseE2EIT.java          | 403 +++++++++++++++++----
 .../engine/base/TransactionContainerComposer.java  |  88 +++++
 .../engine/base/TransactionE2ESettings.java        |  37 ++
 .../database/mysql/MySQLJdbcTransactionE2ETT.java  |  35 +-
 .../database/mysql/MySQLProxyTransactionE2EIT.java |  37 +-
 .../opengauss/OpenGaussJdbcTransactionE2EIT.java   |  37 +-
 .../opengauss/OpenGaussProxyTransactionE2EIT.java  |  37 +-
 .../postgresql/PostgreSQLJdbcTransactionE2EIT.java |  37 +-
 .../PostgreSQLProxyTransactionE2EIT.java           |  37 +-
 36 files changed, 537 insertions(+), 656 deletions(-)

diff --git 
a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/DiscoveryContainerComposer.java
 
b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/DiscoveryContainerComposer.java
index 661d490bd98..812bdaf9d1e 100644
--- 
a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/DiscoveryContainerComposer.java
+++ 
b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/DiscoveryContainerComposer.java
@@ -46,6 +46,6 @@ public final class DiscoveryContainerComposer implements 
AutoCloseable {
     
     @Override
     public void close() {
-        containerComposer.close();
+        containerComposer.stop();
     }
 }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java
index 9ee31f9a806..81d7238c283 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.alterresource;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
@@ -40,13 +41,13 @@ public final class AddResourceTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
-        assertAddResource();
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
+        assertAddResource(containerComposer);
     }
     
-    private void assertAddResource() throws SQLException {
+    private void assertAddResource(final TransactionContainerComposer 
containerComposer) throws SQLException {
         Connection connection = getDataSource().getConnection();
-        getBaseTransactionITCase().addResource(connection, "transaction_it_2");
+        getBaseTransactionITCase().addResource(connection, "transaction_it_2", 
containerComposer);
         createThreeDataSourceAccountTableRule(connection);
         reCreateAccountTable(connection);
         assertRollback();
@@ -56,7 +57,7 @@ public final class AddResourceTestCase extends 
BaseTransactionTestCase {
     
     private void createThreeDataSourceAccountTableRule(final Connection 
connection) throws SQLException {
         executeWithLog(connection, "DROP SHARDING TABLE RULE account;");
-        executeWithLog(connection, 
getBaseTransactionITCase().getCommonSQLCommand().getCreateThreeDataSourceAccountTableRule());
+        executeWithLog(connection, 
getBaseTransactionITCase().getCommonSQL().getCreateThreeDataSourceAccountTableRule());
         int ruleCount = countWithLog(connection, "SHOW SHARDING TABLE RULES 
FROM sharding_db;");
         assertThat(ruleCount, is(3));
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java
index c33964df6a4..f7d6ae0439c 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.alterresource;
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
@@ -39,13 +40,13 @@ public final class CloseResourceTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
-        assertCloseResource();
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
+        assertCloseResource(containerComposer);
     }
     
-    private void assertCloseResource() throws SQLException {
+    private void assertCloseResource(final TransactionContainerComposer 
containerComposer) throws SQLException {
         Connection connection = getDataSource().getConnection();
-        getBaseTransactionITCase().createOriginalAccountTableRule(connection);
+        getBaseTransactionITCase().createOriginalAccountTableRule(connection, 
containerComposer);
         reCreateAccountTable(connection);
         assertRollback();
         assertCommit();
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/MySQLAutoCommitTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/MySQLAutoCommitTestCase.java
index 29f036e3c25..5b06887e6f0 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/MySQLAutoCommitTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/MySQLAutoCommitTestCase.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.autocommit;
 import org.apache.shardingsphere.data.pipeline.core.util.ThreadUtil;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -43,7 +44,7 @@ public final class MySQLAutoCommitTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertAutoCommit();
     }
     
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/PostgreSQLAutoCommitTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/PostgreSQLAutoCommitTestCase.java
index 1f688ca8d0c..961a088e762 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/PostgreSQLAutoCommitTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/autocommit/PostgreSQLAutoCommitTestCase.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.autocommit;
 import org.apache.shardingsphere.data.pipeline.core.util.ThreadUtil;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -43,7 +44,7 @@ public final class PostgreSQLAutoCommitTestCase extends 
BaseTransactionTestCase
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertAutoCommit();
     }
     
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/base/BaseTransactionTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/base/BaseTransactionTestCase.java
index a98f27e292b..b88a99a19d6 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/base/BaseTransactionTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/base/BaseTransactionTestCase.java
@@ -22,6 +22,7 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
 import javax.sql.DataSource;
@@ -48,15 +49,16 @@ public abstract class BaseTransactionTestCase {
     /**
      * Execute test cases.
      *
+     * @param containerComposer container composer
      * @throws SQLException SQL exception
      */
-    public void execute() throws SQLException {
+    public void execute(final TransactionContainerComposer containerComposer) 
throws SQLException {
         beforeTest();
-        executeTest();
+        executeTest(containerComposer);
         afterTest();
     }
     
-    protected abstract void executeTest() throws SQLException;
+    protected abstract void executeTest(TransactionContainerComposer 
containerComposer) throws SQLException;
     
     protected void beforeTest() throws SQLException {
         Connection connection = getDataSource().getConnection();
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/classictransfer/ClassicTransferTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/classictransfer/ClassicTransferTestCase.java
index e8da3e37a4f..1650ca3c1e9 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/classictransfer/ClassicTransferTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/classictransfer/ClassicTransferTestCase.java
@@ -22,6 +22,7 @@ import lombok.Getter;
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 
 import javax.sql.DataSource;
@@ -46,7 +47,7 @@ public final class ClassicTransferTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         Connection connection = getDataSource().getConnection();
         executeUpdateWithLog(connection, "insert into account(transaction_id, 
balance) values (1,0), (2,100);");
         innerRun();
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/BroadcastTableTransactionTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/BroadcastTableTransactionTestCase.java
index b6d90b0b299..4e2beefb701 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/BroadcastTableTransactionTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/BroadcastTableTransactionTestCase.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.commitrollback;
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 
 import javax.sql.DataSource;
@@ -52,7 +53,7 @@ public final class BroadcastTableTransactionTestCase extends 
BaseTransactionTest
     
     @Override
     @SneakyThrows(SQLException.class)
-    protected void executeTest() {
+    protected void executeTest(final TransactionContainerComposer 
containerComposer) {
         rollback();
         commit();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/ExceptionInTransactionTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/ExceptionInTransactionTestCase.java
index b34f65ba8f5..96f378fbbd2 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/ExceptionInTransactionTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/ExceptionInTransactionTestCase.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.commitrollback;
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
@@ -43,7 +44,7 @@ public final class ExceptionInTransactionTestCase extends 
BaseTransactionTestCas
     }
     
     @Override
-    protected void executeTest() throws SQLException {
+    protected void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         Connection connection = null;
         try {
             connection = getDataSource().getConnection();
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiJDBCConnectionsTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiJDBCConnectionsTestCase.java
index 9c5368f43a2..d29debcb89d 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiJDBCConnectionsTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiJDBCConnectionsTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.commitrollback;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -39,7 +40,7 @@ public final class MultiJDBCConnectionsTestCase extends 
BaseTransactionTestCase
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         try (Connection connection = getDataSource().getConnection()) {
             PreparedStatement statement = connection.prepareStatement("insert 
into account(id, balance, transaction_id) values(?, ?, ?)");
             connection.setAutoCommit(false);
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiOperationsCommitAndRollbackTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiOperationsCommitAndRollbackTestCase.java
index 0ad4731756a..13a35bff5d1 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiOperationsCommitAndRollbackTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiOperationsCommitAndRollbackTestCase.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.commitrollback;
 import com.google.common.base.Preconditions;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
@@ -43,7 +44,7 @@ public final class MultiOperationsCommitAndRollbackTestCase 
extends BaseTransact
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertRollback();
         assertCommit();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTableCommitAndRollbackTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTableCommitAndRollbackTestCase.java
index 93634fe9e74..170e64a42e3 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTableCommitAndRollbackTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTableCommitAndRollbackTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.commitrollback;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 
 import javax.sql.DataSource;
@@ -40,7 +41,7 @@ public final class MultiTableCommitAndRollbackTestCase 
extends BaseTransactionTe
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertRollback();
         assertCommit();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTransactionInConnectionTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTransactionInConnectionTestCase.java
index accc7c85d15..f31030cb3d6 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTransactionInConnectionTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/MultiTransactionInConnectionTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.commitrollback;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 
 import javax.sql.DataSource;
@@ -37,7 +38,7 @@ public final class MultiTransactionInConnectionTestCase 
extends BaseTransactionT
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         try (Connection connection = getDataSource().getConnection()) {
             PreparedStatement statement = connection.prepareStatement("insert 
into account(id, balance, transaction_id) values(?, ?, ?)");
             for (int i = 0; i < 8; i++) {
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/SingleTableCommitAndRollbackTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/SingleTableCommitAndRollbackTestCase.java
index 8fe7258f651..ba6a9d1d6a5 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/SingleTableCommitAndRollbackTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/commitrollback/SingleTableCommitAndRollbackTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.commitrollback;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 
 import javax.sql.DataSource;
@@ -37,7 +38,7 @@ public final class SingleTableCommitAndRollbackTestCase 
extends BaseTransactionT
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertRollback();
         assertCommit();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/cursor/OpenGaussCursorTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/cursor/OpenGaussCursorTestCase.java
index 258de38633f..659540ce4eb 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/cursor/OpenGaussCursorTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/cursor/OpenGaussCursorTestCase.java
@@ -19,8 +19,8 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.cursor;
 
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
-import org.apache.shardingsphere.test.e2e.transaction.engine.base.BaseE2EIT;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.command.CursorSQLCommand;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
@@ -34,8 +34,8 @@ import java.util.Objects;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 
 /**
  * OpenGauss cursor transaction integration test.
@@ -52,7 +52,7 @@ public final class OpenGaussCursorTestCase extends 
BaseTransactionTestCase {
     }
     
     private CursorSQLCommand loadCursorSQLCommand() {
-        return 
JAXB.unmarshal(Objects.requireNonNull(BaseE2EIT.class.getClassLoader().getResource("env/common/cursor-command.xml")),
 CursorSQLCommand.class);
+        return 
JAXB.unmarshal(Objects.requireNonNull(TransactionBaseE2EIT.class.getClassLoader().getResource("env/common/cursor-command.xml")),
 CursorSQLCommand.class);
     }
     
     @Override
@@ -62,7 +62,7 @@ public final class OpenGaussCursorTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         Connection connection = getDataSource().getConnection();
         singleTableCursorTest(connection);
         singleTableCursorOrderByTest(connection);
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
index a6723ec5465..b0afdc06402 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.nested;
 import 
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -41,7 +42,7 @@ public class NestedTransactionTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    protected void executeTest() throws SQLException {
+    protected void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         ShardingSphereConnection connection = (ShardingSphereConnection) 
getDataSource().getConnection();
         assertFalse(connection.isHoldTransaction());
         connection.setAutoCommit(false);
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/MySQLSetReadOnlyTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/MySQLSetReadOnlyTestCase.java
index de2da51cdb1..1043ef62930 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/MySQLSetReadOnlyTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/MySQLSetReadOnlyTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.readonly;
 
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
@@ -40,7 +41,7 @@ public final class MySQLSetReadOnlyTestCase extends 
SetReadOnlyTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertSetReadOnly();
         assertNotSetReadOnly();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/PostgreSQLSetReadOnlyTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/PostgreSQLSetReadOnlyTestCase.java
index f9016ecb4ab..d1b550798cd 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/PostgreSQLSetReadOnlyTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/readonly/PostgreSQLSetReadOnlyTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.readonly;
 
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.junit.Assert;
@@ -39,7 +40,7 @@ public final class PostgreSQLSetReadOnlyTestCase extends 
SetReadOnlyTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertSetReadOnly();
         assertNotSetReadOnly();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/MySQLSavePointTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/MySQLSavePointTestCase.java
index a399e63aafa..a1a3d5e7671 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/MySQLSavePointTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/MySQLSavePointTestCase.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.test.e2e.transaction.cases.savepoint;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
@@ -35,7 +36,7 @@ public final class MySQLSavePointTestCase extends 
BaseSavePointTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertRollback2Savepoint();
         assertReleaseSavepoint();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
index fc5ddc468cf..55ab0ff036a 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.test.e2e.transaction.cases.savepoint;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.opengauss.jdbc.PSQLSavepoint;
@@ -42,7 +43,7 @@ public final class OpenGaussSavePointTestCase extends 
BaseSavePointTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertRollback2Savepoint();
         assertReleaseSavepoint();
         assertErrors();
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
index 83990a4b224..86f2f54e87a 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.savepoint;
 
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.postgresql.jdbc.PSQLSavepoint;
@@ -43,7 +44,7 @@ public final class PostgreSQLSavePointTestCase extends 
BaseSavePointTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertRollback2Savepoint();
         assertReleaseSavepoint();
         assertErrors();
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/SetTransactionTypeTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/SetTransactionTypeTestCase.java
index 88d58078c17..2ae28dd7749 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/SetTransactionTypeTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/SetTransactionTypeTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.settype;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -42,7 +43,7 @@ public class SetTransactionTypeTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    protected void executeTest() throws SQLException {
+    protected void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         try (Connection connection = getDataSource().getConnection()) {
             assertTransactionType(connection, TransactionType.XA.name());
             executeWithLog(connection, "SET DIST VARIABLE TRANSACTION_TYPE = 
'LOCAL'");
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/TransactionTypeHolderTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/TransactionTypeHolderTestCase.java
index 186db3cb61a..7e430cf910e 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/TransactionTypeHolderTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/settype/TransactionTypeHolderTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.settype;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -42,7 +43,7 @@ public final class TransactionTypeHolderTestCase extends 
BaseTransactionTestCase
     }
     
     @Override
-    protected void executeTest() throws SQLException {
+    protected void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         try (Connection connection = getDataSource().getConnection()) {
             TransactionTypeHolder.set(TransactionType.LOCAL);
             assertThat(TransactionTypeHolder.get(), is(TransactionType.LOCAL));
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLLocalTruncateTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLLocalTruncateTestCase.java
index c51b1521194..81d657cb1c7 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLLocalTruncateTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLLocalTruncateTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.truncate;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -38,7 +39,7 @@ public final class MySQLLocalTruncateTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertTruncateRollback();
         assertTruncateCommit();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLXATruncateTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLXATruncateTestCase.java
index 10b806fc8d1..bb889e59b6c 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLXATruncateTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/MySQLXATruncateTestCase.java
@@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.dialect.exception.transaction.TableModifyInTransactionException;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -56,7 +57,7 @@ public final class MySQLXATruncateTestCase extends 
BaseTransactionTestCase {
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertTruncateInMySQLXATransaction();
     }
     
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/PostgreSQLAndOpenGaussTruncateTestCase.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/PostgreSQLAndOpenGaussTruncateTestCase.java
index 995ff3b1c9e..007c842ecb4 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/PostgreSQLAndOpenGaussTruncateTestCase.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/truncate/PostgreSQLAndOpenGaussTruncateTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.transaction.cases.truncate;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 
@@ -37,7 +38,7 @@ public final class PostgreSQLAndOpenGaussTruncateTestCase 
extends BaseTransactio
     }
     
     @Override
-    public void executeTest() throws SQLException {
+    public void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
         assertTruncateRollback();
         assertTruncateCommit();
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/BaseE2EIT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/BaseE2EIT.java
deleted file mode 100644
index 56d52e5ee0c..00000000000
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/BaseE2EIT.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * 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.e2e.transaction.engine.base;
-
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.data.pipeline.core.util.ThreadUtil;
-import org.apache.shardingsphere.infra.database.metadata.url.JdbcUrlAppender;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
-import 
org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType;
-import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
-import 
org.apache.shardingsphere.test.e2e.env.container.atomic.enums.AdapterType;
-import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.DockerStorageContainer;
-import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtil;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
-import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
-import 
org.apache.shardingsphere.test.e2e.transaction.engine.command.CommonSQLCommand;
-import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
-import 
org.apache.shardingsphere.test.e2e.transaction.env.TransactionE2EEnvironment;
-import 
org.apache.shardingsphere.test.e2e.transaction.env.enums.TransactionE2EEnvTypeEnum;
-import 
org.apache.shardingsphere.test.e2e.transaction.env.enums.TransactionTestCaseRegistry;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.container.compose.BaseContainerComposer;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.container.compose.DockerContainerComposer;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.container.compose.NativeContainerComposer;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
-import 
org.apache.shardingsphere.test.e2e.transaction.util.TestCaseClassScanner;
-import org.apache.shardingsphere.transaction.api.TransactionType;
-
-import javax.sql.DataSource;
-import javax.xml.bind.JAXB;
-import java.io.File;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-@Getter(AccessLevel.PROTECTED)
-@Slf4j
-public abstract class BaseE2EIT {
-    
-    protected static final TransactionE2EEnvironment ENV = 
TransactionE2EEnvironment.getInstance();
-    
-    protected static final JdbcUrlAppender JDBC_URL_APPENDER = new 
JdbcUrlAppender();
-    
-    protected static final String TRANSACTION_IT = "transaction_it";
-    
-    protected static final String DATA_SOURCE_0 = TRANSACTION_IT + "_0";
-    
-    protected static final String DATA_SOURCE_1 = TRANSACTION_IT + "_1";
-    
-    protected static final List<String> ALL_XA_PROVIDERS = 
Arrays.asList(TransactionTestConstants.ATOMIKOS, 
TransactionTestConstants.BITRONIX, TransactionTestConstants.NARAYANA);
-    
-    protected static final String SHARDING_DB = "sharding_db";
-    
-    private static final List<Class<? extends BaseTransactionTestCase>> 
TEST_CASES;
-    
-    private final BaseContainerComposer containerComposer;
-    
-    @Getter(AccessLevel.PUBLIC)
-    private final CommonSQLCommand commonSQLCommand;
-    
-    private final DatabaseType databaseType;
-    
-    private final String adapter;
-    
-    private final AutoDataSource dataSource;
-    
-    static {
-        long startTime = System.currentTimeMillis();
-        TEST_CASES = TestCaseClassScanner.scan();
-        log.info("Load transaction test case classes time consume: {}.", 
System.currentTimeMillis() - startTime);
-    }
-    
-    public BaseE2EIT(final TransactionTestParameter testParam) {
-        databaseType = testParam.getDatabaseType();
-        adapter = testParam.getAdapter();
-        containerComposer = initializeContainerComposer(testParam);
-        commonSQLCommand = loadCommonSQLCommand();
-        dataSource = isProxyAdapter(testParam) ? createProxyDataSource() : 
createJdbcDataSource();
-    }
-    
-    private BaseContainerComposer initializeContainerComposer(final 
TransactionTestParameter testParam) {
-        BaseContainerComposer result = ENV.getItEnvType() == 
TransactionE2EEnvTypeEnum.DOCKER ? new DockerContainerComposer(testParam) : new 
NativeContainerComposer(testParam.getDatabaseType());
-        result.start();
-        return result;
-    }
-    
-    private CommonSQLCommand loadCommonSQLCommand() {
-        return 
JAXB.unmarshal(Objects.requireNonNull(BaseE2EIT.class.getClassLoader().getResource("env/common/command.xml")),
 CommonSQLCommand.class);
-    }
-    
-    final boolean isProxyAdapter(final TransactionTestParameter testParam) {
-        return 
AdapterType.PROXY.getValue().equalsIgnoreCase(testParam.getAdapter());
-    }
-    
-    private ProxyDataSource createProxyDataSource() {
-        return new ProxyDataSource(containerComposer, SHARDING_DB, 
ENV.getProxyUserName(), ENV.getProxyPassword());
-    }
-    
-    private JdbcDataSource createJdbcDataSource() {
-        DockerContainerComposer dockerContainerComposer = 
(DockerContainerComposer) containerComposer;
-        DockerStorageContainer storageContainer = 
dockerContainerComposer.getStorageContainer();
-        Map<String, DataSource> actualDataSourceMap = 
storageContainer.getActualDataSourceMap();
-        actualDataSourceMap.put("ds_0", createDataSource(storageContainer, 
DATA_SOURCE_0));
-        actualDataSourceMap.put("ds_1", createDataSource(storageContainer, 
DATA_SOURCE_1));
-        return new JdbcDataSource(dockerContainerComposer);
-    }
-    
-    private DataSource createDataSource(final DockerStorageContainer 
storageContainer, final String dataSourceName) {
-        return 
StorageContainerUtil.generateDataSource(DataSourceEnvironment.getURL(databaseType,
 storageContainer.getHost(), storageContainer.getMappedPort(), dataSourceName),
-                storageContainer.getUsername(), 
storageContainer.getPassword(), 50);
-    }
-    
-    protected static Collection<TransactionTestParameter> 
getTransactionTestParameters(final Class<? extends TransactionBaseE2EIT> 
testCaseClass) {
-        TransactionTestCaseRegistry currentTestCaseInfo = 
ENV.getTransactionTestCaseRegistryMap().get(testCaseClass.getName());
-        Collection<TransactionTestParameter> result = new LinkedList<>();
-        if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.NONE) {
-            return result;
-        }
-        if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.DOCKER) {
-            addTestParameters(currentTestCaseInfo, result);
-        }
-        if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.NATIVE && 
"MySQL".equalsIgnoreCase(ENV.getNativeDatabaseType())) {
-            addParametersByVersions(ENV.getMysqlVersions(), result, 
currentTestCaseInfo);
-        }
-        return result;
-    }
-    
-    private static void addTestParameters(final TransactionTestCaseRegistry 
currentTestCaseInfo, final Collection<TransactionTestParameter> testParams) {
-        if 
(TransactionTestConstants.MYSQL.equalsIgnoreCase(currentTestCaseInfo.getDbType()))
 {
-            addParametersByVersions(ENV.getMysqlVersions(), testParams, 
currentTestCaseInfo);
-        } else if 
(TransactionTestConstants.POSTGRESQL.equalsIgnoreCase(currentTestCaseInfo.getDbType()))
 {
-            addParametersByVersions(ENV.getPostgresqlVersions(), testParams, 
currentTestCaseInfo);
-        } else if 
(TransactionTestConstants.OPENGAUSS.equalsIgnoreCase(currentTestCaseInfo.getDbType()))
 {
-            addParametersByVersions(ENV.getOpenGaussVersions(), testParams, 
currentTestCaseInfo);
-        }
-    }
-    
-    private static void addParametersByVersions(final List<String> 
databaseVersion, final Collection<TransactionTestParameter> testParams, final 
TransactionTestCaseRegistry currentTestCaseInfo) {
-        for (String each : databaseVersion) {
-            testParams.addAll(addParametersByTestCaseClasses(each, 
currentTestCaseInfo));
-        }
-    }
-    
-    private static Collection<TransactionTestParameter> 
addParametersByTestCaseClasses(final String version, final 
TransactionTestCaseRegistry currentTestCaseInfo) {
-        Map<String, TransactionTestParameter> testParams = new 
LinkedHashMap<>();
-        for (Class<? extends BaseTransactionTestCase> each : TEST_CASES) {
-            if (!ENV.getNeedToRunTestCases().isEmpty() && 
!ENV.getNeedToRunTestCases().contains(each.getSimpleName())) {
-                log.info("Collect transaction test case, need to run cases 
don't contain this, skip: {}.", each.getName());
-                continue;
-            }
-            TransactionTestCase annotation = 
each.getAnnotation(TransactionTestCase.class);
-            if (null == annotation) {
-                log.info("Collect transaction test case, annotation is null, 
skip: {}.", each.getName());
-                continue;
-            }
-            Optional<String> dbType = 
Arrays.stream(annotation.dbTypes()).filter(currentTestCaseInfo.getDbType()::equalsIgnoreCase).findAny();
-            if (!dbType.isPresent()) {
-                log.info("Collect transaction test case, dbType is not 
matched, skip: {}.", each.getName());
-                continue;
-            }
-            Optional<String> runAdapters = 
Arrays.stream(annotation.adapters()).filter(currentTestCaseInfo.getRunningAdaptor()::equalsIgnoreCase).findAny();
-            if (!runAdapters.isPresent()) {
-                log.info("Collect transaction test case, runAdapter is not 
matched, skip: {}.", each.getName());
-                continue;
-            }
-            String scenario = annotation.scenario();
-            addParametersByTransactionTypes(version, currentTestCaseInfo, 
each, annotation, testParams, scenario);
-        }
-        return testParams.values();
-    }
-    
-    private static void addParametersByTransactionTypes(final String version, 
final TransactionTestCaseRegistry currentTestCaseInfo,
-                                                        final Class<? extends 
BaseTransactionTestCase> caseClass, final TransactionTestCase annotation,
-                                                        final Map<String, 
TransactionTestParameter> testParams, final String scenario) {
-        if 
(AdapterType.PROXY.getValue().equals(currentTestCaseInfo.getRunningAdaptor())) {
-            List<TransactionType> allowTransactionTypes = 
ENV.getAllowTransactionTypes().isEmpty() ? 
Arrays.stream(TransactionType.values()).collect(Collectors.toList())
-                    : 
ENV.getAllowTransactionTypes().stream().map(TransactionType::valueOf).collect(Collectors.toList());
-            List<String> allowProviders = ENV.getAllowXAProviders().isEmpty() 
? ALL_XA_PROVIDERS : ENV.getAllowXAProviders();
-            addParameters(version, currentTestCaseInfo, caseClass, 
allowTransactionTypes, allowProviders, testParams, scenario);
-        } else {
-            for (TransactionType each : annotation.transactionTypes()) {
-                if (!ENV.getAllowTransactionTypes().isEmpty() && 
!ENV.getAllowTransactionTypes().contains(each.toString())) {
-                    log.info("Collect transaction test case, need to run 
transaction types don't contain this, skip: {}-{}.", caseClass.getName(), each);
-                    continue;
-                }
-                addParametersByTransactionProvidersInJDBC(version, 
currentTestCaseInfo, caseClass, each, testParams, scenario);
-            }
-        }
-    }
-    
-    private static void addParametersByTransactionProvidersInJDBC(final String 
version, final TransactionTestCaseRegistry currentTestCaseInfo,
-                                                                  final 
Class<? extends BaseTransactionTestCase> caseClass, final TransactionType each,
-                                                                  final 
Map<String, TransactionTestParameter> testParams, final String scenario) {
-        if (TransactionType.LOCAL.equals(each)) {
-            addParameters(version, currentTestCaseInfo, caseClass, 
Collections.singletonList(each), Collections.singletonList(""), testParams, 
scenario);
-        } else if (TransactionType.XA.equals(each)) {
-            List<String> allowProviders = ENV.getAllowXAProviders().isEmpty() 
? ALL_XA_PROVIDERS : ENV.getAllowXAProviders();
-            for (String provider : allowProviders) {
-                addParameters(version, currentTestCaseInfo, caseClass, 
Collections.singletonList(each), Collections.singletonList(provider), 
testParams, scenario);
-            }
-        }
-    }
-    
-    private static void addParameters(final String version, final 
TransactionTestCaseRegistry currentTestCaseInfo,
-                                      final Class<? extends 
BaseTransactionTestCase> caseClass, final List<TransactionType> 
transactionTypes, final List<String> providers,
-                                      final Map<String, 
TransactionTestParameter> testParams, final String scenario) {
-        String uniqueKey = getUniqueKey(currentTestCaseInfo.getDbType(), 
currentTestCaseInfo.getRunningAdaptor(), transactionTypes, providers, scenario);
-        testParams.putIfAbsent(uniqueKey, new 
TransactionTestParameter(getSqlDatabaseType(currentTestCaseInfo.getDbType()), 
currentTestCaseInfo.getRunningAdaptor(), transactionTypes, providers,
-                getStorageContainerImage(currentTestCaseInfo.getDbType(), 
version), scenario, new LinkedList<>()));
-        
testParams.get(uniqueKey).getTransactionTestCaseClasses().add(caseClass);
-    }
-    
-    private static String getUniqueKey(final String dbType, final String 
runningAdapter, final List<TransactionType> transactionTypes, final 
List<String> providers, final String scenario) {
-        return dbType + File.separator + runningAdapter + File.separator + 
transactionTypes + File.separator + providers + File.separator + scenario;
-    }
-    
-    private static DatabaseType getSqlDatabaseType(final String databaseType) {
-        switch (databaseType) {
-            case TransactionTestConstants.MYSQL:
-                return new MySQLDatabaseType();
-            case TransactionTestConstants.POSTGRESQL:
-                return new PostgreSQLDatabaseType();
-            case TransactionTestConstants.OPENGAUSS:
-                return new OpenGaussDatabaseType();
-            default:
-                throw new 
UnsupportedOperationException(String.format("Unsupported database type `%s`.", 
databaseType));
-        }
-    }
-    
-    private static String getStorageContainerImage(final String databaseType, 
final String version) {
-        switch (databaseType) {
-            case TransactionTestConstants.MYSQL:
-                return "mysql/mysql-server:" + version;
-            case TransactionTestConstants.POSTGRESQL:
-            case TransactionTestConstants.OPENGAUSS:
-                return version;
-            default:
-                throw new 
UnsupportedOperationException(String.format("Unsupported database type `%s`.", 
databaseType));
-        }
-    }
-    
-    final Connection getProxyConnection() throws SQLException {
-        return dataSource.getConnection();
-    }
-    
-    private String getActualJdbcUrlTemplate(final String databaseName) {
-        if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.DOCKER) {
-            DockerStorageContainer storageContainer = 
((DockerContainerComposer) containerComposer).getStorageContainer();
-            return DataSourceEnvironment.getURL(getDatabaseType(), 
getDatabaseType().getType().toLowerCase() + ".host", 
storageContainer.getExposedPort(), databaseName);
-        }
-        return DataSourceEnvironment.getURL(getDatabaseType(), "127.0.0.1", 
ENV.getActualDataSourceDefaultPort(databaseType), databaseName);
-    }
-    
-    /**
-     * Add resource.
-     *
-     * @param connection connection
-     * @param databaseName database name
-     * @throws SQLException SQL exception
-     */
-    @SneakyThrows(InterruptedException.class)
-    public final void addResource(final Connection connection, final String 
databaseName) throws SQLException {
-        String addSourceResource = 
commonSQLCommand.getSourceAddNewResourceTemplate()
-                .replace("${user}", 
ENV.getActualDataSourceUsername(databaseType))
-                .replace("${password}", 
ENV.getActualDataSourcePassword(databaseType))
-                .replace("${ds2}", getActualJdbcUrlTemplate(databaseName));
-        executeWithLog(connection, addSourceResource);
-        int resourceCount = countWithLog("SHOW STORAGE UNITS FROM 
sharding_db");
-        Thread.sleep(5000L);
-        assertThat(resourceCount, is(3));
-    }
-    
-    /**
-     * Create the account table rule with one data source.
-     *
-     * @param connection connection
-     * @throws SQLException SQL exception
-     */
-    public final void createOriginalAccountTableRule(final Connection 
connection) throws SQLException {
-        executeWithLog(connection, "DROP SHARDING TABLE RULE account;");
-        executeWithLog(connection, 
getCommonSQLCommand().getCreateOneDataSourceAccountTableRule());
-        assertThat(countWithLog("SHOW SHARDING TABLE RULES FROM 
sharding_db;"), is(3));
-    }
-    
-    int countWithLog(final String sql) throws SQLException {
-        Connection connection = getProxyConnection();
-        int retryNumber = 0;
-        while (retryNumber <= 3) {
-            try {
-                Statement statement = connection.createStatement();
-                ResultSet resultSet = statement.executeQuery(sql);
-                int result = 0;
-                while (resultSet.next()) {
-                    result++;
-                }
-                return result;
-            } catch (final SQLException ex) {
-                log.error("Data access error.", ex);
-            }
-            ThreadUtil.sleep(2, TimeUnit.SECONDS);
-            retryNumber++;
-        }
-        throw new RuntimeException("Can't get result from proxy.");
-    }
-    
-    protected final void executeWithLog(final Connection connection, final 
String sql) throws SQLException {
-        log.info("Connection execute:{}.", sql);
-        connection.createStatement().execute(sql);
-        ThreadUtil.sleep(1, TimeUnit.SECONDS);
-    }
-}
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionBaseE2EIT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionBaseE2EIT.java
index 4c161369a44..f40cddb61db 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionBaseE2EIT.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionBaseE2EIT.java
@@ -17,32 +17,160 @@
 
 package org.apache.shardingsphere.test.e2e.transaction.engine.base;
 
+import com.google.common.base.Preconditions;
+import lombok.Getter;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.data.pipeline.core.util.ThreadUtil;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
+import 
org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType;
+import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.enums.AdapterType;
+import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.DockerStorageContainer;
+import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.command.CommonSQLCommand;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
+import 
org.apache.shardingsphere.test.e2e.transaction.env.TransactionE2EEnvironment;
+import 
org.apache.shardingsphere.test.e2e.transaction.env.enums.TransactionE2EEnvTypeEnum;
+import 
org.apache.shardingsphere.test.e2e.transaction.env.enums.TransactionTestCaseRegistry;
+import 
org.apache.shardingsphere.test.e2e.transaction.framework.container.compose.DockerContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
+import 
org.apache.shardingsphere.test.e2e.transaction.util.TestCaseClassScanner;
 import org.apache.shardingsphere.transaction.api.TransactionType;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+import org.junit.jupiter.params.provider.ArgumentsSource;
 
 import javax.sql.DataSource;
+import javax.xml.bind.JAXB;
+import java.io.File;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@Getter
 @Slf4j
-public abstract class TransactionBaseE2EIT extends BaseE2EIT {
+public abstract class TransactionBaseE2EIT {
     
-    public TransactionBaseE2EIT(final TransactionTestParameter testParam) {
-        super(testParam);
+    private static final List<String> ALL_XA_PROVIDERS = 
Arrays.asList(TransactionTestConstants.ATOMIKOS, 
TransactionTestConstants.BITRONIX, TransactionTestConstants.NARAYANA);
+    
+    private static final List<Class<? extends BaseTransactionTestCase>> 
TEST_CASES = TestCaseClassScanner.scan();
+    
+    private static final TransactionE2EEnvironment ENV = 
TransactionE2EEnvironment.getInstance();
+    
+    private final CommonSQLCommand commonSQL;
+    
+    public TransactionBaseE2EIT() {
+        commonSQL = loadCommonSQLCommand();
+    }
+    
+    private CommonSQLCommand loadCommonSQLCommand() {
+        return 
JAXB.unmarshal(Objects.requireNonNull(TransactionBaseE2EIT.class.getClassLoader().getResource("env/common/command.xml")),
 CommonSQLCommand.class);
+    }
+    
+    @ParameterizedTest(name = "{0}")
+    @EnabledIf("isEnabled")
+    @ArgumentsSource(TestCaseArgumentsProvider.class)
+    public void assertTransaction(final TransactionTestParameter testParam) 
throws SQLException {
+        try (TransactionContainerComposer containerComposer = new 
TransactionContainerComposer(testParam)) {
+            try {
+                callTestCases(testParam, containerComposer);
+            } finally {
+                containerComposer.getDataSource().close();
+            }
+        }
+    }
+    
+    private void callTestCases(final TransactionTestParameter testParam, final 
TransactionContainerComposer containerComposer) throws SQLException {
+        if 
(AdapterType.PROXY.getValue().equalsIgnoreCase(testParam.getAdapter())) {
+            for (TransactionType each : testParam.getTransactionTypes()) {
+                if (TransactionType.LOCAL.equals(each)) {
+                    log.info("Call transaction IT {}, alter transaction rule 
{}.", testParam, "");
+                    alterTransactionRule(each, "", containerComposer);
+                    doCallTestCases(testParam, each, "", containerComposer);
+                } else if (TransactionType.XA.equals(each)) {
+                    for (String eachProvider : testParam.getProviders()) {
+                        log.info("Call transaction IT {}, alter transaction 
rule {}.", testParam, eachProvider);
+                        alterTransactionRule(each, eachProvider, 
containerComposer);
+                        doCallTestCases(testParam, each, eachProvider, 
containerComposer);
+                    }
+                }
+            }
+        } else {
+            doCallTestCases(testParam, containerComposer);
+        }
+    }
+    
+    private void alterTransactionRule(final TransactionType transactionType, 
final String providerType, final TransactionContainerComposer 
containerComposer) throws SQLException {
+        if (Objects.equals(transactionType, TransactionType.LOCAL)) {
+            alterLocalTransactionRule(containerComposer);
+        } else if (Objects.equals(transactionType, TransactionType.XA)) {
+            alterXaTransactionRule(providerType, containerComposer);
+        }
+    }
+    
+    private void doCallTestCases(final TransactionTestParameter testParam, 
final TransactionContainerComposer containerComposer) {
+        for (Class<? extends BaseTransactionTestCase> each : 
testParam.getTransactionTestCaseClasses()) {
+            log.info("Transaction IT {} -> {} test begin.", testParam, 
each.getSimpleName());
+            try {
+                each.getConstructor(TransactionBaseE2EIT.class, 
DataSource.class).newInstance(this, 
containerComposer.getDataSource()).execute(containerComposer);
+                // CHECKSTYLE:OFF
+            } catch (final Exception ex) {
+                // CHECKSTYLE:ON
+                log.error(String.format("Transaction IT %s -> %s test failed", 
testParam, each.getSimpleName()), ex);
+                throw new RuntimeException(ex);
+            }
+            log.info("Transaction IT {} -> {} test end.", testParam, 
each.getSimpleName());
+            try {
+                containerComposer.getDataSource().close();
+            } catch (final SQLException ignored) {
+            }
+        }
+    }
+    
+    private void doCallTestCases(final TransactionTestParameter testParam, 
final TransactionType transactionType, final String provider, final 
TransactionContainerComposer containerComposer) {
+        for (Class<? extends BaseTransactionTestCase> each : 
testParam.getTransactionTestCaseClasses()) {
+            if 
(!Arrays.asList(each.getAnnotation(TransactionTestCase.class).transactionTypes()).contains(transactionType))
 {
+                return;
+            }
+            log.info("Call transaction IT {} -> {} -> {} -> {} test begin.", 
testParam, transactionType, provider, each.getSimpleName());
+            try {
+                each.getConstructor(TransactionBaseE2EIT.class, 
DataSource.class).newInstance(this, 
containerComposer.getDataSource()).execute(containerComposer);
+                // CHECKSTYLE:OFF
+            } catch (final Exception ex) {
+                // CHECKSTYLE:ON
+                log.error(String.format("Transaction IT %s -> %s test failed", 
testParam, each.getSimpleName()), ex);
+                throw new RuntimeException(ex);
+            }
+            log.info("Call transaction IT {} -> {} -> {} -> {} test end.", 
testParam, transactionType, provider, each.getSimpleName());
+            try {
+                containerComposer.getDataSource().close();
+            } catch (final SQLException ignored) {
+            }
+        }
     }
     
     /**
@@ -52,7 +180,7 @@ public abstract class TransactionBaseE2EIT extends BaseE2EIT 
{
      * @throws SQLException SQL exception
      */
     public void createAccountTable(final Connection connection) throws 
SQLException {
-        executeWithLog(connection, 
getCommonSQLCommand().getCreateAccountTable());
+        executeWithLog(connection, commonSQL.getCreateAccountTable());
     }
     
     /**
@@ -65,24 +193,24 @@ public abstract class TransactionBaseE2EIT extends 
BaseE2EIT {
         executeWithLog(connection, "drop table if exists account;");
     }
     
-    private void alterLocalTransactionRule() throws SQLException {
-        Connection connection = getProxyConnection();
+    private void alterLocalTransactionRule(final TransactionContainerComposer 
containerComposer) throws SQLException {
+        Connection connection = 
containerComposer.getDataSource().getConnection();
         if (isExpectedTransactionRule(connection, TransactionType.LOCAL, "")) {
             return;
         }
-        String alterLocalTransactionRule = 
getCommonSQLCommand().getAlterLocalTransactionRule();
+        String alterLocalTransactionRule = 
commonSQL.getAlterLocalTransactionRule();
         executeWithLog(connection, alterLocalTransactionRule);
-        assertTrue(waitExpectedTransactionRule(TransactionType.LOCAL, ""));
+        assertTrue(waitExpectedTransactionRule(TransactionType.LOCAL, "", 
containerComposer));
     }
     
-    private void alterXaTransactionRule(final String providerType) throws 
SQLException {
-        Connection connection = getProxyConnection();
+    private void alterXaTransactionRule(final String providerType, final 
TransactionContainerComposer containerComposer) throws SQLException {
+        Connection connection = 
containerComposer.getDataSource().getConnection();
         if (isExpectedTransactionRule(connection, TransactionType.XA, 
providerType)) {
             return;
         }
-        String alterXaTransactionRule = 
getCommonSQLCommand().getAlterXATransactionRule().replace("${providerType}", 
providerType);
+        String alterXaTransactionRule = 
commonSQL.getAlterXATransactionRule().replace("${providerType}", providerType);
         executeWithLog(connection, alterXaTransactionRule);
-        assertTrue(waitExpectedTransactionRule(TransactionType.XA, 
providerType));
+        assertTrue(waitExpectedTransactionRule(TransactionType.XA, 
providerType, containerComposer));
     }
     
     private boolean isExpectedTransactionRule(final Connection connection, 
final TransactionType expectedTransType, final String expectedProviderType) 
throws SQLException {
@@ -91,9 +219,9 @@ public abstract class TransactionBaseE2EIT extends BaseE2EIT 
{
                 && 
Objects.equals(transactionRuleMap.get(TransactionTestConstants.PROVIDER_TYPE), 
expectedProviderType);
     }
     
-    private boolean waitExpectedTransactionRule(final TransactionType 
expectedTransType, final String expectedProviderType) throws SQLException {
+    private boolean waitExpectedTransactionRule(final TransactionType 
expectedTransType, final String expectedProviderType, final 
TransactionContainerComposer containerComposer) throws SQLException {
         ThreadUtil.sleep(5, TimeUnit.SECONDS);
-        Connection connection = getProxyConnection();
+        Connection connection = 
containerComposer.getDataSource().getConnection();
         int waitTimes = 0;
         do {
             if (isExpectedTransactionRule(connection, expectedTransType, 
expectedProviderType)) {
@@ -119,71 +247,214 @@ public abstract class TransactionBaseE2EIT extends 
BaseE2EIT {
         return result;
     }
     
-    protected void callTestCases(final TransactionTestParameter testParam) 
throws SQLException {
-        if 
(AdapterType.PROXY.getValue().equalsIgnoreCase(testParam.getAdapter())) {
-            for (TransactionType each : testParam.getTransactionTypes()) {
-                if (TransactionType.LOCAL.equals(each)) {
-                    log.info("Call transaction IT {}, alter transaction rule 
{}.", testParam, "");
-                    alterTransactionRule(each, "");
-                    doCallTestCases(testParam, each, "");
-                } else if (TransactionType.XA.equals(each)) {
-                    for (String eachProvider : testParam.getProviders()) {
-                        log.info("Call transaction IT {}, alter transaction 
rule {}.", testParam, eachProvider);
-                        alterTransactionRule(each, eachProvider);
-                        doCallTestCases(testParam, each, eachProvider);
-                    }
+    /**
+     * Add resource.
+     *
+     * @param connection connection
+     * @param databaseName database name
+     * @param containerComposer container composer
+     * @throws SQLException SQL exception
+     */
+    @SneakyThrows(InterruptedException.class)
+    public void addResource(final Connection connection, final String 
databaseName, final TransactionContainerComposer containerComposer) throws 
SQLException {
+        String addSourceResource = commonSQL.getSourceAddNewResourceTemplate()
+                .replace("${user}", 
ENV.getActualDataSourceUsername(containerComposer.getDatabaseType()))
+                .replace("${password}", 
ENV.getActualDataSourcePassword(containerComposer.getDatabaseType()))
+                .replace("${ds2}", getActualJdbcUrlTemplate(databaseName, 
containerComposer));
+        executeWithLog(connection, addSourceResource);
+        int resourceCount = countWithLog("SHOW STORAGE UNITS FROM 
sharding_db", containerComposer);
+        Thread.sleep(5000L);
+        assertThat(resourceCount, is(3));
+    }
+    
+    private String getActualJdbcUrlTemplate(final String databaseName, final 
TransactionContainerComposer containerComposer) {
+        if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.DOCKER) {
+            DockerStorageContainer storageContainer = 
((DockerContainerComposer) 
containerComposer.getContainerComposer()).getStorageContainer();
+            return 
DataSourceEnvironment.getURL(containerComposer.getDatabaseType(),
+                    
containerComposer.getDatabaseType().getType().toLowerCase() + ".host", 
storageContainer.getExposedPort(), databaseName);
+        }
+        return 
DataSourceEnvironment.getURL(containerComposer.getDatabaseType(), "127.0.0.1", 
ENV.getActualDataSourceDefaultPort(containerComposer.getDatabaseType()), 
databaseName);
+    }
+    
+    /**
+     * Create the account table rule with one data source.
+     *
+     * @param connection connection
+     * @param containerComposer container composer 
+     * @throws SQLException SQL exception
+     */
+    public void createOriginalAccountTableRule(final Connection connection, 
final TransactionContainerComposer containerComposer) throws SQLException {
+        executeWithLog(connection, "DROP SHARDING TABLE RULE account;");
+        executeWithLog(connection, 
commonSQL.getCreateOneDataSourceAccountTableRule());
+        assertThat(countWithLog("SHOW SHARDING TABLE RULES FROM sharding_db;", 
containerComposer), is(3));
+    }
+    
+    private void executeWithLog(final Connection connection, final String sql) 
throws SQLException {
+        log.info("Connection execute:{}.", sql);
+        connection.createStatement().execute(sql);
+        ThreadUtil.sleep(1, TimeUnit.SECONDS);
+    }
+    
+    private int countWithLog(final String sql, final 
TransactionContainerComposer containerComposer) throws SQLException {
+        Connection connection = 
containerComposer.getDataSource().getConnection();
+        int retryNumber = 0;
+        while (retryNumber <= 3) {
+            try {
+                Statement statement = connection.createStatement();
+                ResultSet resultSet = statement.executeQuery(sql);
+                int result = 0;
+                while (resultSet.next()) {
+                    result++;
                 }
+                return result;
+            } catch (final SQLException ex) {
+                log.error("Data access error.", ex);
             }
-        } else {
-            doCallTestCases(testParam);
+            ThreadUtil.sleep(2, TimeUnit.SECONDS);
+            retryNumber++;
         }
+        throw new RuntimeException("Can't get result from proxy.");
     }
     
-    private void alterTransactionRule(final TransactionType transactionType, 
final String providerType) throws SQLException {
-        if (Objects.equals(transactionType, TransactionType.LOCAL)) {
-            alterLocalTransactionRule();
-        } else if (Objects.equals(transactionType, TransactionType.XA)) {
-            alterXaTransactionRule(providerType);
-        }
+    private static boolean isEnabled() {
+        return ENV.getItEnvType() != TransactionE2EEnvTypeEnum.NONE;
     }
     
-    private void doCallTestCases(final TransactionTestParameter testParam) {
-        for (Class<? extends BaseTransactionTestCase> each : 
testParam.getTransactionTestCaseClasses()) {
-            log.info("Transaction IT {} -> {} test begin.", testParam, 
each.getSimpleName());
-            try {
-                each.getConstructor(TransactionBaseE2EIT.class, 
DataSource.class).newInstance(this, getDataSource()).execute();
-                // CHECKSTYLE:OFF
-            } catch (final Exception ex) {
-                // CHECKSTYLE:ON
-                log.error(String.format("Transaction IT %s -> %s test failed", 
testParam, each.getSimpleName()), ex);
-                throw new RuntimeException(ex);
+    private static class TestCaseArgumentsProvider implements 
ArgumentsProvider {
+        
+        @Override
+        public Stream<? extends Arguments> provideArguments(final 
ExtensionContext extensionContext) {
+            TransactionE2ESettings settings = 
extensionContext.getRequiredTestClass().getAnnotation(TransactionE2ESettings.class);
+            Preconditions.checkNotNull(settings, "Annotation 
TransactionE2ESettings is required.");
+            return 
getTransactionTestParameters(settings.value()).stream().map(Arguments::of);
+        }
+        
+        private Collection<TransactionTestParameter> 
getTransactionTestParameters(final Class<? extends TransactionBaseE2EIT> 
testCaseClass) {
+            TransactionTestCaseRegistry currentTestCaseInfo = 
ENV.getTransactionTestCaseRegistryMap().get(testCaseClass.getName());
+            Collection<TransactionTestParameter> result = new LinkedList<>();
+            if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.NONE) {
+                return result;
             }
-            log.info("Transaction IT {} -> {} test end.", testParam, 
each.getSimpleName());
-            try {
-                getDataSource().close();
-            } catch (final SQLException ignored) {
+            if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.DOCKER) {
+                addTestParameters(currentTestCaseInfo, result);
+            }
+            if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.NATIVE && 
"MySQL".equalsIgnoreCase(ENV.getNativeDatabaseType())) {
+                addParametersByVersions(ENV.getMysqlVersions(), result, 
currentTestCaseInfo);
             }
+            return result;
         }
-    }
     
-    private void doCallTestCases(final TransactionTestParameter testParam, 
final TransactionType transactionType, final String provider) {
-        for (Class<? extends BaseTransactionTestCase> each : 
testParam.getTransactionTestCaseClasses()) {
-            if 
(!Arrays.asList(each.getAnnotation(TransactionTestCase.class).transactionTypes()).contains(transactionType))
 {
-                return;
+        private void addTestParameters(final TransactionTestCaseRegistry 
currentTestCaseInfo, final Collection<TransactionTestParameter> testParams) {
+            if 
(TransactionTestConstants.MYSQL.equalsIgnoreCase(currentTestCaseInfo.getDbType()))
 {
+                addParametersByVersions(ENV.getMysqlVersions(), testParams, 
currentTestCaseInfo);
+            } else if 
(TransactionTestConstants.POSTGRESQL.equalsIgnoreCase(currentTestCaseInfo.getDbType()))
 {
+                addParametersByVersions(ENV.getPostgresqlVersions(), 
testParams, currentTestCaseInfo);
+            } else if 
(TransactionTestConstants.OPENGAUSS.equalsIgnoreCase(currentTestCaseInfo.getDbType()))
 {
+                addParametersByVersions(ENV.getOpenGaussVersions(), 
testParams, currentTestCaseInfo);
             }
-            log.info("Call transaction IT {} -> {} -> {} -> {} test begin.", 
testParam, transactionType, provider, each.getSimpleName());
-            try {
-                each.getConstructor(TransactionBaseE2EIT.class, 
DataSource.class).newInstance(this, getDataSource()).execute();
-                // CHECKSTYLE:OFF
-            } catch (final Exception ex) {
-                // CHECKSTYLE:ON
-                log.error(String.format("Transaction IT %s -> %s test failed", 
testParam, each.getSimpleName()), ex);
-                throw new RuntimeException(ex);
+        }
+    
+        private void addParametersByVersions(final List<String> 
databaseVersion, final Collection<TransactionTestParameter> testParams, final 
TransactionTestCaseRegistry currentTestCaseInfo) {
+            for (String each : databaseVersion) {
+                testParams.addAll(addParametersByTestCaseClasses(each, 
currentTestCaseInfo));
             }
-            log.info("Call transaction IT {} -> {} -> {} -> {} test end.", 
testParam, transactionType, provider, each.getSimpleName());
-            try {
-                getDataSource().close();
-            } catch (final SQLException ignored) {
+        }
+    
+        private Collection<TransactionTestParameter> 
addParametersByTestCaseClasses(final String version, final 
TransactionTestCaseRegistry currentTestCaseInfo) {
+            Map<String, TransactionTestParameter> testParams = new 
LinkedHashMap<>();
+            for (Class<? extends BaseTransactionTestCase> each : TEST_CASES) {
+                if (!ENV.getNeedToRunTestCases().isEmpty() && 
!ENV.getNeedToRunTestCases().contains(each.getSimpleName())) {
+                    log.info("Collect transaction test case, need to run cases 
don't contain this, skip: {}.", each.getName());
+                    continue;
+                }
+                TransactionTestCase annotation = 
each.getAnnotation(TransactionTestCase.class);
+                if (null == annotation) {
+                    log.info("Collect transaction test case, annotation is 
null, skip: {}.", each.getName());
+                    continue;
+                }
+                Optional<String> dbType = 
Arrays.stream(annotation.dbTypes()).filter(currentTestCaseInfo.getDbType()::equalsIgnoreCase).findAny();
+                if (!dbType.isPresent()) {
+                    log.info("Collect transaction test case, dbType is not 
matched, skip: {}.", each.getName());
+                    continue;
+                }
+                Optional<String> runAdapters = 
Arrays.stream(annotation.adapters()).filter(currentTestCaseInfo.getRunningAdaptor()::equalsIgnoreCase).findAny();
+                if (!runAdapters.isPresent()) {
+                    log.info("Collect transaction test case, runAdapter is not 
matched, skip: {}.", each.getName());
+                    continue;
+                }
+                String scenario = annotation.scenario();
+                addParametersByTransactionTypes(version, currentTestCaseInfo, 
each, annotation, testParams, scenario);
+            }
+            return testParams.values();
+        }
+    
+        private void addParametersByTransactionTypes(final String version, 
final TransactionTestCaseRegistry currentTestCaseInfo,
+                                                            final Class<? 
extends BaseTransactionTestCase> caseClass, final TransactionTestCase 
annotation,
+                                                            final Map<String, 
TransactionTestParameter> testParams, final String scenario) {
+            if 
(AdapterType.PROXY.getValue().equals(currentTestCaseInfo.getRunningAdaptor())) {
+                List<TransactionType> allowTransactionTypes = 
ENV.getAllowTransactionTypes().isEmpty() ? 
Arrays.stream(TransactionType.values()).collect(Collectors.toList())
+                        : 
ENV.getAllowTransactionTypes().stream().map(TransactionType::valueOf).collect(Collectors.toList());
+                List<String> allowProviders = 
ENV.getAllowXAProviders().isEmpty() ? ALL_XA_PROVIDERS : 
ENV.getAllowXAProviders();
+                addParameters(version, currentTestCaseInfo, caseClass, 
allowTransactionTypes, allowProviders, testParams, scenario);
+            } else {
+                for (TransactionType each : annotation.transactionTypes()) {
+                    if (!ENV.getAllowTransactionTypes().isEmpty() && 
!ENV.getAllowTransactionTypes().contains(each.toString())) {
+                        log.info("Collect transaction test case, need to run 
transaction types don't contain this, skip: {}-{}.", caseClass.getName(), each);
+                        continue;
+                    }
+                    addParametersByTransactionProvidersInJDBC(version, 
currentTestCaseInfo, caseClass, each, testParams, scenario);
+                }
+            }
+        }
+    
+        private void addParametersByTransactionProvidersInJDBC(final String 
version, final TransactionTestCaseRegistry currentTestCaseInfo,
+                                                                      final 
Class<? extends BaseTransactionTestCase> caseClass, final TransactionType each,
+                                                                      final 
Map<String, TransactionTestParameter> testParams, final String scenario) {
+            if (TransactionType.LOCAL.equals(each)) {
+                addParameters(version, currentTestCaseInfo, caseClass, 
Collections.singletonList(each), Collections.singletonList(""), testParams, 
scenario);
+            } else if (TransactionType.XA.equals(each)) {
+                List<String> allowProviders = 
ENV.getAllowXAProviders().isEmpty() ? ALL_XA_PROVIDERS : 
ENV.getAllowXAProviders();
+                for (String provider : allowProviders) {
+                    addParameters(version, currentTestCaseInfo, caseClass, 
Collections.singletonList(each), Collections.singletonList(provider), 
testParams, scenario);
+                }
+            }
+        }
+    
+        private void addParameters(final String version, final 
TransactionTestCaseRegistry currentTestCaseInfo,
+                                          final Class<? extends 
BaseTransactionTestCase> caseClass, final List<TransactionType> 
transactionTypes, final List<String> providers,
+                                          final Map<String, 
TransactionTestParameter> testParams, final String scenario) {
+            String uniqueKey = getUniqueKey(currentTestCaseInfo.getDbType(), 
currentTestCaseInfo.getRunningAdaptor(), transactionTypes, providers, scenario);
+            testParams.putIfAbsent(uniqueKey, new 
TransactionTestParameter(getSqlDatabaseType(currentTestCaseInfo.getDbType()), 
currentTestCaseInfo.getRunningAdaptor(), transactionTypes, providers,
+                    getStorageContainerImage(currentTestCaseInfo.getDbType(), 
version), scenario, new LinkedList<>()));
+            
testParams.get(uniqueKey).getTransactionTestCaseClasses().add(caseClass);
+        }
+    
+        private String getUniqueKey(final String dbType, final String 
runningAdapter, final List<TransactionType> transactionTypes, final 
List<String> providers, final String scenario) {
+            return dbType + File.separator + runningAdapter + File.separator + 
transactionTypes + File.separator + providers + File.separator + scenario;
+        }
+    
+        private DatabaseType getSqlDatabaseType(final String databaseType) {
+            switch (databaseType) {
+                case TransactionTestConstants.MYSQL:
+                    return new MySQLDatabaseType();
+                case TransactionTestConstants.POSTGRESQL:
+                    return new PostgreSQLDatabaseType();
+                case TransactionTestConstants.OPENGAUSS:
+                    return new OpenGaussDatabaseType();
+                default:
+                    throw new 
UnsupportedOperationException(String.format("Unsupported database type `%s`.", 
databaseType));
+            }
+        }
+    
+        private String getStorageContainerImage(final String databaseType, 
final String version) {
+            switch (databaseType) {
+                case TransactionTestConstants.MYSQL:
+                    return "mysql/mysql-server:" + version;
+                case TransactionTestConstants.POSTGRESQL:
+                case TransactionTestConstants.OPENGAUSS:
+                    return version;
+                default:
+                    throw new 
UnsupportedOperationException(String.format("Unsupported database type `%s`.", 
databaseType));
             }
         }
     }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionContainerComposer.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionContainerComposer.java
new file mode 100644
index 00000000000..d1381bc60fd
--- /dev/null
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionContainerComposer.java
@@ -0,0 +1,88 @@
+/*
+ * 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.e2e.transaction.engine.base;
+
+import lombok.Getter;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import 
org.apache.shardingsphere.test.e2e.env.container.atomic.enums.AdapterType;
+import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.DockerStorageContainer;
+import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtil;
+import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.transaction.env.TransactionE2EEnvironment;
+import 
org.apache.shardingsphere.test.e2e.transaction.env.enums.TransactionE2EEnvTypeEnum;
+import 
org.apache.shardingsphere.test.e2e.transaction.framework.container.compose.BaseContainerComposer;
+import 
org.apache.shardingsphere.test.e2e.transaction.framework.container.compose.DockerContainerComposer;
+import 
org.apache.shardingsphere.test.e2e.transaction.framework.container.compose.NativeContainerComposer;
+import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
+
+import javax.sql.DataSource;
+import java.util.Map;
+
+/**
+ * Transaction container composer.
+ */
+@Getter
+public final class TransactionContainerComposer implements AutoCloseable {
+    
+    private static final TransactionE2EEnvironment ENV = 
TransactionE2EEnvironment.getInstance();
+    
+    private final DatabaseType databaseType;
+    
+    private final BaseContainerComposer containerComposer;
+    
+    private final AutoDataSource dataSource;
+    
+    public TransactionContainerComposer(final TransactionTestParameter 
testParam) {
+        databaseType = testParam.getDatabaseType();
+        containerComposer = initContainerComposer(testParam);
+        dataSource = isProxyAdapter(testParam) ? createProxyDataSource() : 
createJdbcDataSource();
+    }
+    
+    private BaseContainerComposer initContainerComposer(final 
TransactionTestParameter testParam) {
+        BaseContainerComposer result = ENV.getItEnvType() == 
TransactionE2EEnvTypeEnum.DOCKER ? new DockerContainerComposer(testParam) : new 
NativeContainerComposer(testParam.getDatabaseType());
+        result.start();
+        return result;
+    }
+    
+    boolean isProxyAdapter(final TransactionTestParameter testParam) {
+        return 
AdapterType.PROXY.getValue().equalsIgnoreCase(testParam.getAdapter());
+    }
+    
+    private ProxyDataSource createProxyDataSource() {
+        return new ProxyDataSource(containerComposer, "sharding_db", 
ENV.getProxyUserName(), ENV.getProxyPassword());
+    }
+    
+    private JdbcDataSource createJdbcDataSource() {
+        DockerContainerComposer dockerContainerComposer = 
(DockerContainerComposer) containerComposer;
+        DockerStorageContainer storageContainer = 
dockerContainerComposer.getStorageContainer();
+        Map<String, DataSource> actualDataSourceMap = 
storageContainer.getActualDataSourceMap();
+        actualDataSourceMap.put("ds_0", createDataSource(storageContainer, 
"transaction_it_0"));
+        actualDataSourceMap.put("ds_1", createDataSource(storageContainer, 
"transaction_it_1"));
+        return new JdbcDataSource(dockerContainerComposer);
+    }
+    
+    private DataSource createDataSource(final DockerStorageContainer 
storageContainer, final String dataSourceName) {
+        return 
StorageContainerUtil.generateDataSource(DataSourceEnvironment.getURL(databaseType,
 storageContainer.getHost(), storageContainer.getMappedPort(), dataSourceName),
+                storageContainer.getUsername(), 
storageContainer.getPassword(), 50);
+    }
+    
+    @Override
+    public void close() {
+        containerComposer.stop();
+    }
+}
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionE2ESettings.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionE2ESettings.java
new file mode 100644
index 00000000000..9b2e2b20625
--- /dev/null
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/base/TransactionE2ESettings.java
@@ -0,0 +1,37 @@
+/*
+ * 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.e2e.transaction.engine.base;
+
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Transaction E2E Settings.
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TransactionE2ESettings {
+    
+    /**
+     * Get test case class.
+     *
+     * @return test case class
+     */
+    Class<? extends TransactionBaseE2EIT> value();
+}
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLJdbcTransactionE2ETT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLJdbcTransactionE2ETT.java
index 107fdfbb5b4..fbfca36cc80 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLJdbcTransactionE2ETT.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLJdbcTransactionE2ETT.java
@@ -18,39 +18,8 @@
 package org.apache.shardingsphere.test.e2e.transaction.engine.database.mysql;
 
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionE2ESettings;
 
-import java.sql.SQLException;
-import java.util.Collection;
-
-@RunWith(Parameterized.class)
+@TransactionE2ESettings(MySQLJdbcTransactionE2ETT.class)
 public final class MySQLJdbcTransactionE2ETT extends TransactionBaseE2EIT {
-    
-    private final TransactionTestParameter testParam;
-    
-    public MySQLJdbcTransactionE2ETT(final TransactionTestParameter testParam) 
{
-        super(testParam);
-        this.testParam = testParam;
-    }
-    
-    @Parameters(name = "{0}")
-    public static Collection<TransactionTestParameter> getTestParameters() {
-        return getTransactionTestParameters(MySQLJdbcTransactionE2ETT.class);
-    }
-    
-    @After
-    public void after() throws SQLException {
-        getDataSource().close();
-        getContainerComposer().close();
-    }
-    
-    @Test
-    public void assertTransaction() throws SQLException {
-        callTestCases(testParam);
-    }
 }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLProxyTransactionE2EIT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLProxyTransactionE2EIT.java
index b61236de2d4..89e1c57ac41 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLProxyTransactionE2EIT.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/mysql/MySQLProxyTransactionE2EIT.java
@@ -17,42 +17,9 @@
 
 package org.apache.shardingsphere.test.e2e.transaction.engine.database.mysql;
 
-import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionE2ESettings;
 
-import java.sql.SQLException;
-import java.util.Collection;
-
-@RunWith(Parameterized.class)
+@TransactionE2ESettings(MySQLProxyTransactionE2EIT.class)
 public final class MySQLProxyTransactionE2EIT extends TransactionBaseE2EIT {
-    
-    private final TransactionTestParameter testParam;
-    
-    public MySQLProxyTransactionE2EIT(final TransactionTestParameter 
testParam) {
-        super(testParam);
-        this.testParam = testParam;
-    }
-    
-    @Parameters(name = "{0}")
-    public static Collection<TransactionTestParameter> getTestParameters() {
-        return getTransactionTestParameters(MySQLProxyTransactionE2EIT.class);
-    }
-    
-    @After
-    @SneakyThrows(SQLException.class)
-    public void after() {
-        getDataSource().close();
-        getContainerComposer().close();
-    }
-    
-    @Test
-    public void assertTransaction() throws SQLException {
-        callTestCases(testParam);
-    }
 }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussJdbcTransactionE2EIT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussJdbcTransactionE2EIT.java
index a3bb564c6fd..d6c9d474f53 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussJdbcTransactionE2EIT.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussJdbcTransactionE2EIT.java
@@ -17,42 +17,9 @@
 
 package 
org.apache.shardingsphere.test.e2e.transaction.engine.database.opengauss;
 
-import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionE2ESettings;
 
-import java.sql.SQLException;
-import java.util.Collection;
-
-@RunWith(Parameterized.class)
+@TransactionE2ESettings(OpenGaussJdbcTransactionE2EIT.class)
 public final class OpenGaussJdbcTransactionE2EIT extends TransactionBaseE2EIT {
-    
-    private final TransactionTestParameter testParam;
-    
-    public OpenGaussJdbcTransactionE2EIT(final TransactionTestParameter 
testParam) {
-        super(testParam);
-        this.testParam = testParam;
-    }
-    
-    @Parameters(name = "{0}")
-    public static Collection<TransactionTestParameter> getTestParameters() {
-        return 
getTransactionTestParameters(OpenGaussJdbcTransactionE2EIT.class);
-    }
-    
-    @After
-    @SneakyThrows(SQLException.class)
-    public void after() {
-        getDataSource().close();
-        getContainerComposer().close();
-    }
-    
-    @Test
-    public void assertTransaction() throws SQLException {
-        callTestCases(testParam);
-    }
 }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussProxyTransactionE2EIT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussProxyTransactionE2EIT.java
index b46e983524a..92ea31f70c0 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussProxyTransactionE2EIT.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/opengauss/OpenGaussProxyTransactionE2EIT.java
@@ -17,42 +17,9 @@
 
 package 
org.apache.shardingsphere.test.e2e.transaction.engine.database.opengauss;
 
-import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionE2ESettings;
 
-import java.sql.SQLException;
-import java.util.Collection;
-
-@RunWith(Parameterized.class)
+@TransactionE2ESettings(OpenGaussProxyTransactionE2EIT.class)
 public final class OpenGaussProxyTransactionE2EIT extends TransactionBaseE2EIT 
{
-    
-    private final TransactionTestParameter testParam;
-    
-    public OpenGaussProxyTransactionE2EIT(final TransactionTestParameter 
testParam) {
-        super(testParam);
-        this.testParam = testParam;
-    }
-    
-    @Parameters(name = "{0}")
-    public static Collection<TransactionTestParameter> getTestParameters() {
-        return 
getTransactionTestParameters(OpenGaussProxyTransactionE2EIT.class);
-    }
-    
-    @After
-    @SneakyThrows(SQLException.class)
-    public void after() {
-        getDataSource().close();
-        getContainerComposer().close();
-    }
-    
-    @Test
-    public void assertTransaction() throws SQLException {
-        callTestCases(testParam);
-    }
 }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLJdbcTransactionE2EIT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLJdbcTransactionE2EIT.java
index f4e9120cec6..876bf35e953 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLJdbcTransactionE2EIT.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLJdbcTransactionE2EIT.java
@@ -17,42 +17,9 @@
 
 package 
org.apache.shardingsphere.test.e2e.transaction.engine.database.postgresql;
 
-import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionE2ESettings;
 
-import java.sql.SQLException;
-import java.util.Collection;
-
-@RunWith(Parameterized.class)
+@TransactionE2ESettings(PostgreSQLJdbcTransactionE2EIT.class)
 public final class PostgreSQLJdbcTransactionE2EIT extends TransactionBaseE2EIT 
{
-    
-    private final TransactionTestParameter testParam;
-    
-    public PostgreSQLJdbcTransactionE2EIT(final TransactionTestParameter 
testParam) {
-        super(testParam);
-        this.testParam = testParam;
-    }
-    
-    @Parameters(name = "{0}")
-    public static Collection<TransactionTestParameter> getTestParameters() {
-        return 
getTransactionTestParameters(PostgreSQLJdbcTransactionE2EIT.class);
-    }
-    
-    @After
-    @SneakyThrows(SQLException.class)
-    public void after() {
-        getDataSource().close();
-        getContainerComposer().close();
-    }
-    
-    @Test
-    public void assertTransaction() throws SQLException {
-        callTestCases(testParam);
-    }
 }
diff --git 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLProxyTransactionE2EIT.java
 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLProxyTransactionE2EIT.java
index 1c0b8f890ce..73fff609c75 100644
--- 
a/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLProxyTransactionE2EIT.java
+++ 
b/test/e2e/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/engine/database/postgresql/PostgreSQLProxyTransactionE2EIT.java
@@ -17,42 +17,9 @@
 
 package 
org.apache.shardingsphere.test.e2e.transaction.engine.database.postgresql;
 
-import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionBaseE2EIT;
-import 
org.apache.shardingsphere.test.e2e.transaction.framework.param.TransactionTestParameter;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionE2ESettings;
 
-import java.sql.SQLException;
-import java.util.Collection;
-
-@RunWith(Parameterized.class)
+@TransactionE2ESettings(PostgreSQLProxyTransactionE2EIT.class)
 public final class PostgreSQLProxyTransactionE2EIT extends 
TransactionBaseE2EIT {
-    
-    private final TransactionTestParameter testParam;
-    
-    public PostgreSQLProxyTransactionE2EIT(final TransactionTestParameter 
testParam) {
-        super(testParam);
-        this.testParam = testParam;
-    }
-    
-    @Parameters(name = "{0}")
-    public static Collection<TransactionTestParameter> getTestParameters() {
-        return 
getTransactionTestParameters(PostgreSQLProxyTransactionE2EIT.class);
-    }
-    
-    @After
-    @SneakyThrows(SQLException.class)
-    public void after() {
-        getDataSource().close();
-        getContainerComposer().close();
-    }
-    
-    @Test
-    public void assertTransaction() throws SQLException {
-        callTestCases(testParam);
-    }
 }

Reply via email to