You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/04/29 15:07:34 UTC

[shardingsphere] branch master updated: Refactor external test case loader (#25407)

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

zhangliang 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 16a5cca5df3 Refactor external test case loader (#25407)
16a5cca5df3 is described below

commit 16a5cca5df32eaa24ddbcd185f188893f20ca358
Author: Guocheng Tang <to...@apache.org>
AuthorDate: Sat Apr 29 23:07:28 2023 +0800

    Refactor external test case loader (#25407)
    
    * abstract external test cases are loaded and put into the test util module
    
    * refactor sql parser module
---
 .../it/mysql/external/ExternalMySQLParserIT.java   |  4 +-
 .../external/ExternalPostgreSQLParserIT.java       |  4 +-
 test/it/parser/pom.xml                             | 13 ++--
 .../sql/parser/external/ExternalSQLParserIT.java   | 11 ++-
 .../ExternalSQLParserTestParameterLoader.java      | 61 ++++-----------
 .../result/SQLParseResultReporterCreator.java      |  3 +-
 .../result/type/csv/CsvSQLParseResultReporter.java |  5 +-
 .../type/csv/CsvSQLParseResultReporterCreator.java |  4 +-
 .../type/log/LogSQLParseResultReporterCreator.java |  2 +-
 test/util/pom.xml                                  | 33 +++++---
 .../test/loader/AbstractTestParameterLoader.java   | 91 ++++++++++++++++++++++
 .../test/loader/ExternalCaseSettings.java}         |  6 +-
 .../loader/strategy/TestParameterLoadStrategy.java |  4 +-
 .../impl/GitHubTestParameterLoadStrategy.java      |  6 +-
 .../impl/LocalFileTestParameterLoadStrategy.java   |  6 +-
 .../loader/summary/AssertableFileSummary.java      |  2 +-
 .../test}/loader/summary/FileSummary.java          |  2 +-
 17 files changed, 166 insertions(+), 91 deletions(-)

diff --git a/sql-parser/dialect/mysql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/mysql/external/ExternalMySQLParserIT.java b/sql-parser/dialect/mysql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/mysql/external/ExternalMySQLParserIT.java
index bde03a3a4a5..d377c211c2e 100644
--- a/sql-parser/dialect/mysql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/mysql/external/ExternalMySQLParserIT.java
+++ b/sql-parser/dialect/mysql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/mysql/external/ExternalMySQLParserIT.java
@@ -18,9 +18,9 @@
 package org.apache.shardingsphere.test.it.sql.parser.it.mysql.external;
 
 import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLParserIT;
-import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLParserITSettings;
+import org.apache.shardingsphere.test.loader.ExternalCaseSettings;
 
-@ExternalSQLParserITSettings(value = "MySQL", caseURL = ExternalMySQLParserIT.CASE_URL, resultURL = ExternalMySQLParserIT.RESULT_URL)
+@ExternalCaseSettings(value = "MySQL", caseURL = ExternalMySQLParserIT.CASE_URL, resultURL = ExternalMySQLParserIT.RESULT_URL)
 class ExternalMySQLParserIT extends ExternalSQLParserIT {
     
     static final String CASE_URL = "https://github.com/mysql/mysql-server/tree/8.0/mysql-test/t";
diff --git a/sql-parser/dialect/postgresql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/postgresql/external/ExternalPostgreSQLParserIT.java b/sql-parser/dialect/postgresql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/postgresql/external/ExternalPostgreSQLParserIT.java
index 6916dade58f..74acd54b101 100644
--- a/sql-parser/dialect/postgresql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/postgresql/external/ExternalPostgreSQLParserIT.java
+++ b/sql-parser/dialect/postgresql/src/test/java/org/apache/shardingsphere/test/it/sql/parser/it/postgresql/external/ExternalPostgreSQLParserIT.java
@@ -18,9 +18,9 @@
 package org.apache.shardingsphere.test.it.sql.parser.it.postgresql.external;
 
 import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLParserIT;
-import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLParserITSettings;
+import org.apache.shardingsphere.test.loader.ExternalCaseSettings;
 
-@ExternalSQLParserITSettings(value = "PostgreSQL", caseURL = ExternalPostgreSQLParserIT.CASE_URL, resultURL = ExternalPostgreSQLParserIT.RESULT_URL)
+@ExternalCaseSettings(value = "PostgreSQL", caseURL = ExternalPostgreSQLParserIT.CASE_URL, resultURL = ExternalPostgreSQLParserIT.RESULT_URL)
 class ExternalPostgreSQLParserIT extends ExternalSQLParserIT {
     
     static final String CASE_URL = "https://github.com/postgres/postgres/tree/master/src/test/regress/sql";
diff --git a/test/it/parser/pom.xml b/test/it/parser/pom.xml
index be6e1f0eace..0849ef8da31 100644
--- a/test/it/parser/pom.xml
+++ b/test/it/parser/pom.xml
@@ -30,7 +30,6 @@
     <properties>
         <maven.deploy.skip>true</maven.deploy.skip>
         
-        <json-path.version>2.4.0</json-path.version>
         <commons-csv.version>1.9.0</commons-csv.version>
     </properties>
     
@@ -121,6 +120,12 @@
             <version>${project.version}</version>
         </dependency>
         
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-test-util</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
@@ -152,12 +157,6 @@
             <version>${mockito.version}</version>
             <scope>compile</scope>
         </dependency>
-        
-        <dependency>
-            <groupId>com.jayway.jsonpath</groupId>
-            <artifactId>json-path</artifactId>
-            <version>${json-path.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-csv</artifactId>
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java
index fcc6dc2078d..bbe5ab55a71 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java
@@ -26,9 +26,10 @@ import org.apache.shardingsphere.sql.parser.api.SQLStatementVisitorEngine;
 import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
 import org.apache.shardingsphere.test.it.sql.parser.external.env.SQLParserExternalITEnvironment;
 import org.apache.shardingsphere.test.it.sql.parser.external.loader.ExternalSQLParserTestParameterLoader;
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.strategy.impl.GitHubTestParameterLoadStrategy;
 import org.apache.shardingsphere.test.it.sql.parser.external.result.SQLParseResultReporter;
 import org.apache.shardingsphere.test.it.sql.parser.external.result.SQLParseResultReporterCreator;
+import org.apache.shardingsphere.test.loader.ExternalCaseSettings;
+import org.apache.shardingsphere.test.loader.strategy.impl.GitHubTestParameterLoadStrategy;
 import org.junit.jupiter.api.condition.EnabledIf;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -48,7 +49,9 @@ public abstract class ExternalSQLParserIT {
     @ArgumentsSource(TestCaseArgumentsProvider.class)
     void assertParseSQL(final String sqlCaseId, final String databaseType, final String sql, final String reportType) throws IOException {
         boolean isSuccess = true;
-        try (SQLParseResultReporter resultReporter = TypedSPILoader.getService(SQLParseResultReporterCreator.class, reportType).create(databaseType)) {
+        try (
+                SQLParseResultReporter resultReporter = TypedSPILoader.getService(SQLParseResultReporterCreator.class, reportType)
+                        .create(databaseType, SQLParserExternalITEnvironment.getInstance().getResultPath())) {
             try {
                 ParseASTNode parseASTNode = new SQLParserEngine(databaseType, new CacheOption(128, 1024L)).parse(sql, false);
                 new SQLStatementVisitorEngine(databaseType, true).visit(parseASTNode);
@@ -67,12 +70,12 @@ public abstract class ExternalSQLParserIT {
         
         @Override
         public Stream<? extends Arguments> provideArguments(final ExtensionContext extensionContext) {
-            ExternalSQLParserITSettings settings = extensionContext.getRequiredTestClass().getAnnotation(ExternalSQLParserITSettings.class);
+            ExternalCaseSettings settings = extensionContext.getRequiredTestClass().getAnnotation(ExternalCaseSettings.class);
             Preconditions.checkNotNull(settings, "Annotation ExternalSQLParserITSettings is required.");
             return getTestParameters(settings).stream().map(each -> Arguments.of(each.getSqlCaseId(), each.getDatabaseType(), each.getSql(), each.getReportType()));
         }
         
-        private Collection<ExternalSQLParserTestParameter> getTestParameters(final ExternalSQLParserITSettings settings) {
+        private Collection<ExternalSQLParserTestParameter> getTestParameters(final ExternalCaseSettings settings) {
             return new ExternalSQLParserTestParameterLoader(
                     new GitHubTestParameterLoadStrategy()).load(URI.create(settings.caseURL()), URI.create(settings.resultURL()), settings.value(), settings.reportType());
         }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalSQLParserTestParameterLoader.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalSQLParserTestParameterLoader.java
index 7306b003fc3..39450ec4522 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalSQLParserTestParameterLoader.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalSQLParserTestParameterLoader.java
@@ -17,69 +17,36 @@
 
 package org.apache.shardingsphere.test.it.sql.parser.external.loader;
 
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLParserTestParameter;
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.strategy.TestParameterLoadStrategy;
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.summary.FileSummary;
+import org.apache.shardingsphere.test.loader.AbstractTestParameterLoader;
+import org.apache.shardingsphere.test.loader.strategy.TestParameterLoadStrategy;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URI;
 import java.util.Collection;
 import java.util.LinkedList;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
 
 /**
  * External SQL parser test parameter loader.
  */
-@RequiredArgsConstructor
 @Slf4j
-public final class ExternalSQLParserTestParameterLoader {
+public final class ExternalSQLParserTestParameterLoader extends AbstractTestParameterLoader<ExternalSQLParserTestParameter> {
     
-    private final TestParameterLoadStrategy loadStrategy;
+    public ExternalSQLParserTestParameterLoader(final TestParameterLoadStrategy loadStrategy) {
+        super(loadStrategy);
+    }
     
     /**
-     * Load SQL parser test parameters.
-     *
-     * @param sqlCaseURI SQL case URI
-     * @param resultURI result URI
+     * Create external SQL parser test parameters.
+     * 
+     * @param sqlCaseFileName SQL case file name
+     * @param sqlCaseFileContent SQL case file content
+     * @param resultFileContent result file content
      * @param databaseType database type
      * @param reportType report type
-     * @return loaded test parameters
+     * @return external SQL parser test parameters
      */
-    public Collection<ExternalSQLParserTestParameter> load(final URI sqlCaseURI, final URI resultURI, final String databaseType, final String reportType) {
-        Collection<ExternalSQLParserTestParameter> result = new LinkedList<>();
-        Map<String, FileSummary> sqlCaseFileSummaries = loadStrategy.loadSQLCaseFileSummaries(sqlCaseURI).stream().collect(Collectors.toMap(FileSummary::getFileName, v -> v, (k, v) -> v));
-        Map<String, FileSummary> resultFileSummaries = loadStrategy.loadSQLCaseFileSummaries(resultURI).stream().collect(Collectors.toMap(FileSummary::getFileName, v -> v, (k, v) -> v));
-        for (Entry<String, FileSummary> entry : sqlCaseFileSummaries.entrySet()) {
-            String fileName = entry.getKey();
-            String sqlCaseFileContent = loadContent(URI.create(entry.getValue().getAccessURI()));
-            String resultFileContent = resultFileSummaries.containsKey(fileName) ? loadContent(URI.create(resultFileSummaries.get(fileName).getAccessURI())) : "";
-            result.addAll(createTestParameters(fileName, sqlCaseFileContent, resultFileContent, databaseType, reportType));
-        }
-        if (result.isEmpty()) {
-            result.add(new ExternalSQLParserTestParameter("", databaseType, "", reportType));
-        }
-        return result;
-    }
-    
-    private String loadContent(final URI uri) {
-        try (
-                InputStreamReader in = new InputStreamReader(uri.toURL().openStream());
-                BufferedReader reader = new BufferedReader(in)) {
-            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
-        } catch (final IOException ex) {
-            log.warn("Load failed, reason is: ", ex);
-            return "";
-        }
-    }
-    
-    private Collection<ExternalSQLParserTestParameter> createTestParameters(final String sqlCaseFileName,
-                                                                            final String sqlCaseFileContent, final String resultFileContent, final String databaseType, final String reportType) {
+    public Collection<ExternalSQLParserTestParameter> createTestParameters(final String sqlCaseFileName,
+                                                                           final String sqlCaseFileContent, final String resultFileContent, final String databaseType, final String reportType) {
         Collection<ExternalSQLParserTestParameter> result = new LinkedList<>();
         String[] rawCaseLines = sqlCaseFileContent.split("\n");
         String[] rawResultLines = resultFileContent.split("\n");
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/SQLParseResultReporterCreator.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/SQLParseResultReporterCreator.java
index ed40b99bcbf..4d47982eb3f 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/SQLParseResultReporterCreator.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/SQLParseResultReporterCreator.java
@@ -28,7 +28,8 @@ public interface SQLParseResultReporterCreator extends TypedSPI {
      * Create SQL parse result reporter.
      * 
      * @param databaseType database type
+     * @param resultPath result path
      * @return created SQL parse result reporter
      */
-    SQLParseResultReporter create(String databaseType);
+    SQLParseResultReporter create(String databaseType, String resultPath);
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporter.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporter.java
index 9c7cc608760..b07d88f9b7d 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporter.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporter.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.test.it.sql.parser.external.result.type.csv;
 import lombok.SneakyThrows;
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVPrinter;
-import org.apache.shardingsphere.test.it.sql.parser.external.env.SQLParserExternalITEnvironment;
 import org.apache.shardingsphere.test.it.sql.parser.external.result.SQLParseResultReporter;
 
 import java.io.File;
@@ -37,8 +36,8 @@ public final class CsvSQLParseResultReporter implements SQLParseResultReporter {
     private final CSVPrinter printer;
     
     @SneakyThrows(IOException.class)
-    public CsvSQLParseResultReporter(final String databaseType) {
-        File csvFile = new File(SQLParserExternalITEnvironment.getInstance().getResultPath() + databaseType + "-result.csv");
+    public CsvSQLParseResultReporter(final String databaseType, final String resultPath) {
+        File csvFile = new File(resultPath + databaseType + "-result.csv");
         printHeader(csvFile);
         printer = new CSVPrinter(Files.newBufferedWriter(Paths.get(csvFile.toURI()), StandardOpenOption.APPEND), CSVFormat.DEFAULT.builder().setSkipHeaderRecord(true).build());
     }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporterCreator.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporterCreator.java
index e9694bab3cd..c061e8c8a5c 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporterCreator.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/csv/CsvSQLParseResultReporterCreator.java
@@ -26,8 +26,8 @@ import org.apache.shardingsphere.test.it.sql.parser.external.result.SQLParseResu
 public final class CsvSQLParseResultReporterCreator implements SQLParseResultReporterCreator {
     
     @Override
-    public SQLParseResultReporter create(final String databaseType) {
-        return new CsvSQLParseResultReporter(databaseType);
+    public SQLParseResultReporter create(final String databaseType, final String resultPath) {
+        return new CsvSQLParseResultReporter(databaseType, resultPath);
     }
     
     @Override
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/log/LogSQLParseResultReporterCreator.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/log/LogSQLParseResultReporterCreator.java
index 12d2490ebdf..47008dc045c 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/log/LogSQLParseResultReporterCreator.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/result/type/log/LogSQLParseResultReporterCreator.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.test.it.sql.parser.external.result.SQLParseResu
 public final class LogSQLParseResultReporterCreator implements SQLParseResultReporterCreator {
     
     @Override
-    public SQLParseResultReporter create(final String databaseType) {
+    public SQLParseResultReporter create(final String databaseType, final String resultPath) {
         return new LogSQLParseResultReporter();
     }
     
diff --git a/test/util/pom.xml b/test/util/pom.xml
index beb04274dd6..07bebac403b 100644
--- a/test/util/pom.xml
+++ b/test/util/pom.xml
@@ -27,10 +27,25 @@
     <artifactId>shardingsphere-test-util</artifactId>
     <name>${project.artifactId}</name>
     
+    <properties>
+        <json-path.version>2.4.0</json-path.version>
+    </properties>
+    
     <dependencies>
         <dependency>
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter-api</artifactId>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-junit-jupiter</artifactId>
+            <version>${mockito.version}</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
@@ -39,19 +54,19 @@
             <scope>compile</scope>
         </dependency>
         <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
             <scope>compile</scope>
         </dependency>
         <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>compile</scope>
         </dependency>
         <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-junit-jupiter</artifactId>
-            <scope>compile</scope>
+            <groupId>com.jayway.jsonpath</groupId>
+            <artifactId>json-path</artifactId>
+            <version>${json-path.version}</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/test/util/src/main/java/org/apache/shardingsphere/test/loader/AbstractTestParameterLoader.java b/test/util/src/main/java/org/apache/shardingsphere/test/loader/AbstractTestParameterLoader.java
new file mode 100644
index 00000000000..7cd4fc414a7
--- /dev/null
+++ b/test/util/src/main/java/org/apache/shardingsphere/test/loader/AbstractTestParameterLoader.java
@@ -0,0 +1,91 @@
+/*
+ * 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.loader;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.test.loader.strategy.TestParameterLoadStrategy;
+import org.apache.shardingsphere.test.loader.summary.FileSummary;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+/**
+ * Test parameter loader.
+ * 
+ * @param <T> type of test parameter
+ */
+@RequiredArgsConstructor
+@Slf4j
+public abstract class AbstractTestParameterLoader<T> {
+    
+    private final TestParameterLoadStrategy loadStrategy;
+    
+    /**
+     * Load test parameters.
+     *
+     * @param sqlCaseURI SQL case URI
+     * @param resultURI result URI
+     * @param databaseType database type
+     * @param reportType report type
+     * @return loaded test parameters
+     */
+    public Collection<T> load(final URI sqlCaseURI, final URI resultURI, final String databaseType, final String reportType) {
+        Collection<T> result = new LinkedList<>();
+        Map<String, FileSummary> sqlCaseFileSummaries = loadStrategy.loadSQLCaseFileSummaries(sqlCaseURI).stream().collect(Collectors.toMap(FileSummary::getFileName, v -> v, (k, v) -> v));
+        Map<String, FileSummary> resultFileSummaries = loadStrategy.loadSQLCaseFileSummaries(resultURI).stream().collect(Collectors.toMap(FileSummary::getFileName, v -> v, (k, v) -> v));
+        for (Entry<String, FileSummary> each : sqlCaseFileSummaries.entrySet()) {
+            String fileName = each.getKey();
+            String sqlCaseFileContent = loadContent(URI.create(each.getValue().getAccessURI()));
+            String resultFileContent = resultFileSummaries.containsKey(fileName) ? loadContent(URI.create(resultFileSummaries.get(fileName).getAccessURI())) : "";
+            result.addAll(createTestParameters(fileName, sqlCaseFileContent, resultFileContent, databaseType, reportType));
+        }
+        return result;
+    }
+    
+    /**
+     * Create test parameters.
+     * 
+     * @param sqlCaseFileName SQL case file name
+     * @param sqlCaseFileContent SQL case file content
+     * @param resultFileContent result file content
+     * @param databaseType database type
+     * @param reportType report type
+     * @return test parameters
+     */
+    public abstract Collection<T> createTestParameters(String sqlCaseFileName, String sqlCaseFileContent,
+                                                       String resultFileContent, String databaseType, String reportType);
+    
+    private String loadContent(final URI uri) {
+        try (
+                InputStreamReader in = new InputStreamReader(uri.toURL().openStream());
+                BufferedReader reader = new BufferedReader(in)) {
+            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
+        } catch (final IOException ex) {
+            log.warn("Load failed, reason is: ", ex);
+            return "";
+        }
+    }
+}
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserITSettings.java b/test/util/src/main/java/org/apache/shardingsphere/test/loader/ExternalCaseSettings.java
similarity index 90%
rename from test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserITSettings.java
rename to test/util/src/main/java/org/apache/shardingsphere/test/loader/ExternalCaseSettings.java
index f550e93bcac..3100f78cbf0 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserITSettings.java
+++ b/test/util/src/main/java/org/apache/shardingsphere/test/loader/ExternalCaseSettings.java
@@ -15,18 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.it.sql.parser.external;
+package org.apache.shardingsphere.test.loader;
 
 import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 /**
- * External SQL parser integrate test settings.
+ * External SQL case test settings.
  */
 @Inherited
 @Retention(RetentionPolicy.RUNTIME)
-public @interface ExternalSQLParserITSettings {
+public @interface ExternalCaseSettings {
     
     /**
      * Get to be tested database types.
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/TestParameterLoadStrategy.java b/test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/TestParameterLoadStrategy.java
similarity index 87%
rename from test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/TestParameterLoadStrategy.java
rename to test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/TestParameterLoadStrategy.java
index 78dc5c06771..7f9282bf0e9 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/TestParameterLoadStrategy.java
+++ b/test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/TestParameterLoadStrategy.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.it.sql.parser.external.loader.strategy;
+package org.apache.shardingsphere.test.loader.strategy;
 
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.summary.FileSummary;
+import org.apache.shardingsphere.test.loader.summary.FileSummary;
 
 import java.net.URI;
 import java.util.Collection;
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/impl/GitHubTestParameterLoadStrategy.java b/test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/impl/GitHubTestParameterLoadStrategy.java
similarity index 92%
rename from test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/impl/GitHubTestParameterLoadStrategy.java
rename to test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/impl/GitHubTestParameterLoadStrategy.java
index 0dd27ff21a0..666675e22db 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/impl/GitHubTestParameterLoadStrategy.java
+++ b/test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/impl/GitHubTestParameterLoadStrategy.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.it.sql.parser.external.loader.strategy.impl;
+package org.apache.shardingsphere.test.loader.strategy.impl;
 
 import com.jayway.jsonpath.JsonPath;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.strategy.TestParameterLoadStrategy;
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.summary.FileSummary;
+import org.apache.shardingsphere.test.loader.strategy.TestParameterLoadStrategy;
+import org.apache.shardingsphere.test.loader.summary.FileSummary;
 
 import java.io.BufferedReader;
 import java.io.IOException;
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/impl/LocalFileTestParameterLoadStrategy.java b/test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/impl/LocalFileTestParameterLoadStrategy.java
similarity index 85%
rename from test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/impl/LocalFileTestParameterLoadStrategy.java
rename to test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/impl/LocalFileTestParameterLoadStrategy.java
index 0f05d118292..774a711679d 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/strategy/impl/LocalFileTestParameterLoadStrategy.java
+++ b/test/util/src/main/java/org/apache/shardingsphere/test/loader/strategy/impl/LocalFileTestParameterLoadStrategy.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.it.sql.parser.external.loader.strategy.impl;
+package org.apache.shardingsphere.test.loader.strategy.impl;
 
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.strategy.TestParameterLoadStrategy;
-import org.apache.shardingsphere.test.it.sql.parser.external.loader.summary.FileSummary;
+import org.apache.shardingsphere.test.loader.strategy.TestParameterLoadStrategy;
+import org.apache.shardingsphere.test.loader.summary.FileSummary;
 
 import java.net.URI;
 import java.nio.file.Files;
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/summary/AssertableFileSummary.java b/test/util/src/main/java/org/apache/shardingsphere/test/loader/summary/AssertableFileSummary.java
similarity index 93%
rename from test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/summary/AssertableFileSummary.java
rename to test/util/src/main/java/org/apache/shardingsphere/test/loader/summary/AssertableFileSummary.java
index 4368d61f8e1..c8425904dfb 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/summary/AssertableFileSummary.java
+++ b/test/util/src/main/java/org/apache/shardingsphere/test/loader/summary/AssertableFileSummary.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.it.sql.parser.external.loader.summary;
+package org.apache.shardingsphere.test.loader.summary;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/summary/FileSummary.java b/test/util/src/main/java/org/apache/shardingsphere/test/loader/summary/FileSummary.java
similarity index 93%
rename from test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/summary/FileSummary.java
rename to test/util/src/main/java/org/apache/shardingsphere/test/loader/summary/FileSummary.java
index 9774f6fbfb2..b07a2a53273 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/summary/FileSummary.java
+++ b/test/util/src/main/java/org/apache/shardingsphere/test/loader/summary/FileSummary.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.it.sql.parser.external.loader.summary;
+package org.apache.shardingsphere.test.loader.summary;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;