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 bb8ee69 Refactor for IT parallel execute (#9297)
bb8ee69 is described below
commit bb8ee69e312ef38610216b24f1e6251078c43174
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Feb 3 18:08:48 2021 +0800
Refactor for IT parallel execute (#9297)
* Code format for BaseIT
* Code format for BatchIT
* Code format for ParallelParameterized
* Refactor ITRunnerScheduler
* Remove ITRunnerScheduler.executorCounter
* Refactor ITRunnerScheduler
* Refactor ITRunnerWithParametersFactory
* Move ITWatcher to junit package
---
.../test/integration/engine/it/BaseIT.java | 5 +-
.../test/integration/engine/it/BatchIT.java | 5 +-
.../test/integration/engine/it/SingleIT.java | 2 +-
.../ITBlockJUnit4ClassRunnerWithParameters.java | 8 +-
.../engine/junit/ITRunnerScheduler.java | 105 +++++++++++----------
.../junit/ITRunnerWithParametersFactory.java | 12 +--
.../engine/{watcher => junit}/ITWatcher.java | 2 +-
.../engine/junit/ParallelParameterized.java | 13 ++-
8 files changed, 76 insertions(+), 76 deletions(-)
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
index b64b88e..09b6124 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
@@ -26,12 +26,13 @@ import
org.apache.shardingsphere.test.integration.engine.junit.ITRunnerWithParam
import
org.apache.shardingsphere.test.integration.engine.junit.ParallelParameterized;
import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
import
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import
org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
import
org.apache.shardingsphere.test.integration.env.datasource.builder.ActualDataSourceBuilder;
import
org.apache.shardingsphere.test.integration.env.datasource.builder.ProxyDataSourceBuilder;
-import
org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized.UseParametersRunnerFactory;
import javax.sql.DataSource;
import javax.xml.bind.JAXBException;
@@ -42,7 +43,7 @@ import java.util.Map;
import java.util.TimeZone;
@RunWith(ParallelParameterized.class)
[email protected](ITRunnerWithParametersFactory.class)
+@UseParametersRunnerFactory(ITRunnerWithParametersFactory.class)
@Getter(AccessLevel.PROTECTED)
public abstract class BaseIT {
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
index 1727129..4853655 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
@@ -57,13 +57,14 @@ import static org.junit.Assert.assertThat;
@Getter(AccessLevel.PROTECTED)
public abstract class BatchIT extends BaseIT {
- private DataSetEnvironmentManager dataSetEnvironmentManager;
-
private final IntegrationTestCaseContext testCaseContext;
private final String sql;
private final Collection<DataSet> dataSets;
+
+ @Getter(AccessLevel.NONE)
+ private final DataSetEnvironmentManager dataSetEnvironmentManager;
protected BatchIT(final IntegrationTestCaseContext testCaseContext,
final String adapter, final String scenario, final
DatabaseType databaseType, final String sql) throws IOException, JAXBException,
SQLException {
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
index 7cb4634..19ae29d 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
@@ -25,7 +25,7 @@ import
org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
import org.apache.shardingsphere.test.integration.cases.dataset.DataSet;
import org.apache.shardingsphere.test.integration.cases.dataset.DataSetLoader;
-import org.apache.shardingsphere.test.integration.engine.watcher.ITWatcher;
+import org.apache.shardingsphere.test.integration.engine.junit.ITWatcher;
import org.junit.Rule;
import javax.xml.bind.JAXBException;
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
index 78c56e5..da3d7aa 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
@@ -37,15 +37,15 @@ import java.util.List;
*/
public final class ITBlockJUnit4ClassRunnerWithParameters extends
BlockJUnit4ClassRunner {
+ private final String name;
+
@Getter
private final Object[] parameters;
- private final String name;
-
public ITBlockJUnit4ClassRunnerWithParameters(final TestWithParameters
test) throws InitializationError {
super(test.getTestClass().getJavaClass());
- parameters = test.getParameters().toArray(new
Object[test.getParameters().size()]);
name = test.getName();
+ parameters = test.getParameters().toArray(new
Object[test.getParameters().size()]);
}
@Override
@@ -57,7 +57,7 @@ public final class ITBlockJUnit4ClassRunnerWithParameters
extends BlockJUnit4Cla
}
}
- private Object createTestUsingConstructorInjection() throws Exception {
+ private Object createTestUsingConstructorInjection() throws
ReflectiveOperationException {
return getTestClass().getOnlyConstructor().newInstance(parameters);
}
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
index 1327b3e..c407eef 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
@@ -19,7 +19,6 @@ package
org.apache.shardingsphere.test.integration.engine.junit;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
import org.junit.runners.model.RunnerScheduler;
@@ -29,94 +28,102 @@ import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
/**
- * Represents a strategy for scheduling when individual test methods
- * should be run (in serial or parallel).
+ * Represents a strategy for scheduling when individual test methods should be
run (in serial or parallel).
+ *
* <p>
* WARNING: still experimental, may go away.
* </p>
*/
-@Slf4j
-public class ITRunnerScheduler implements RunnerScheduler {
+public final class ITRunnerScheduler implements RunnerScheduler {
private static final String DEFAULT_EXECUTOR_KEY = "default";
private final Map<String, ExecutorService> executors = new HashMap<>();
- private final Map<String, AtomicInteger> executorCounter = new HashMap<>();
-
public ITRunnerScheduler() {
- Collection<String> adapters =
IntegrationTestEnvironment.getInstance().getAdapters();
- Collection<String> scenarios =
IntegrationTestEnvironment.getInstance().getScenarios();
- Set<DatabaseType> databaseTypes =
IntegrationTestEnvironment.getInstance().getDatabaseEnvironments().keySet();
-
- executors.put(DEFAULT_EXECUTOR_KEY,
getExecutorService(DEFAULT_EXECUTOR_KEY));
- executorCounter.put(DEFAULT_EXECUTOR_KEY, new AtomicInteger(0));
+ IntegrationTestEnvironment itEnv =
IntegrationTestEnvironment.getInstance();
+ addExecutors(itEnv.getAdapters(), itEnv.getScenarios(),
itEnv.getDatabaseEnvironments().keySet());
+ addExecutor(DEFAULT_EXECUTOR_KEY);
+ }
+
+ private void addExecutors(final Collection<String> adapters, final
Collection<String> scenarios, final Collection<DatabaseType> databaseTypes) {
for (String each : adapters) {
- for (String scenario : scenarios) {
- for (DatabaseType databaseType : databaseTypes) {
- String executorServiceKey = getExecutorServiceKey(each,
scenario, databaseType.getName());
- executors.put(executorServiceKey,
getExecutorService(executorServiceKey));
- executorCounter.put(executorServiceKey, new
AtomicInteger(0));
- }
- }
+ addExecutors(each, scenarios, databaseTypes);
+ }
+ }
+
+ private void addExecutors(final String adapter, final Collection<String>
scenarios, final Collection<DatabaseType> databaseTypes) {
+ for (String each : scenarios) {
+ addExecutors(adapter, each, databaseTypes);
}
}
- @SneakyThrows
+ private void addExecutors(final String adapter, final String scenario,
final Collection<DatabaseType> databaseTypes) {
+ for (DatabaseType each : databaseTypes) {
+ addExecutor(String.join("_", adapter, scenario, each.getName()));
+ }
+ }
+
+ private void addExecutor(final String executorKey) {
+ executors.put(executorKey, createExecutorService(executorKey));
+ }
+
+ private ExecutorService createExecutorService(final String
executorServiceKey) {
+ return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue<>(), new
ThreadFactoryBuilder().setNameFormat("ITRunnerScheduler-" + executorServiceKey
+ "-pool-%d").build());
+ }
+
@Override
public void schedule(final Runnable childStatement) {
// TODO Gets the parameters of the Runnable closure
- Field field = childStatement.getClass().getDeclaredField("val$each");
- field.setAccessible(true);
- ITBlockJUnit4ClassRunnerWithParameters runnerWithParameters =
(ITBlockJUnit4ClassRunnerWithParameters) field.get(childStatement);
- String executorServiceKey =
getExecutorServiceKey(runnerWithParameters.getParameters(),
runnerWithParameters.getTestClass());
- executorCounter.get(executorServiceKey).incrementAndGet();
- executors.get(executorServiceKey).submit(childStatement);
+ ITBlockJUnit4ClassRunnerWithParameters runnerWithParameters =
getRunnerWithParameters(childStatement);
+ String executorKey =
getExecutorKey(runnerWithParameters.getTestClass(),
runnerWithParameters.getParameters());
+ executors.get(executorKey).submit(childStatement);
}
- private String getExecutorServiceKey(final String adapter, final String
scenario, final String databaseTypeName) {
- return String.join("_", adapter, scenario, databaseTypeName);
+ @SneakyThrows(ReflectiveOperationException.class)
+ private ITBlockJUnit4ClassRunnerWithParameters
getRunnerWithParameters(final Runnable childStatement) {
+ Field field = childStatement.getClass().getDeclaredField("val$each");
+ field.setAccessible(true);
+ return (ITBlockJUnit4ClassRunnerWithParameters)
field.get(childStatement);
}
- private String getExecutorServiceKey(final Object[] parameters, final
TestClass testClass) {
- Class<?> realTestClass = testClass.getJavaClass();
- if (realTestClass == null) {
+ private String getExecutorKey(final TestClass testClass, final Object[]
parameters) {
+ if (null == testClass.getJavaClass()) {
return DEFAULT_EXECUTOR_KEY;
}
int parametersLength = parameters.length;
- if (parametersLength == 7) {
+ if (isSingleTest(parametersLength)) {
return String.join("_", String.valueOf(parameters[2]),
String.valueOf(parameters[3]), String.valueOf(parameters[4]));
- } else if (parametersLength == 5) {
+ } else if (isBatchTest(parametersLength)) {
return String.join("_", String.valueOf(parameters[1]),
String.valueOf(parameters[2]), String.valueOf(parameters[3]));
}
return DEFAULT_EXECUTOR_KEY;
}
+ private boolean isSingleTest(final int parametersLength) {
+ return 7 == parametersLength;
+ }
+
+ private boolean isBatchTest(final int parametersLength) {
+ return 5 == parametersLength;
+ }
+
@Override
public void finished() {
- for (Map.Entry<String, AtomicInteger> each :
executorCounter.entrySet()) {
- log.info(String.join(" -> ", each.getKey(),
String.valueOf(each.getValue().get())));
- }
- executors.values().forEach(executorService -> {
+ executors.values().forEach(each -> {
try {
- executorService.shutdown();
- executorService.awaitTermination(Long.MAX_VALUE,
TimeUnit.NANOSECONDS);
- } catch (InterruptedException e) {
- e.printStackTrace(System.err);
+ each.shutdown();
+ each.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
+ } catch (final InterruptedException ex) {
+ ex.printStackTrace(System.err);
}
});
}
-
- private ExecutorService getExecutorService(final String
executorServiceKey) {
- return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
- new LinkedBlockingQueue<Runnable>(), new
ThreadFactoryBuilder().setNameFormat("ITRunnerScheduler-" + executorServiceKey
+ "-pool-%d").build());
- }
}
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
index 740d7ef..f661d6c 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
@@ -23,19 +23,11 @@ import
org.junit.runners.parameterized.ParametersRunnerFactory;
import org.junit.runners.parameterized.TestWithParameters;
/**
- * A {@code ParameterizedRunnerFactory} creates a runner for a single
- * {@link TestWithParameters}.
+ * Integration test runner with parameters factory.
*/
public final class ITRunnerWithParametersFactory implements
ParametersRunnerFactory {
- /**
- * Returns a runner for the specified {@link TestWithParameters}.
- *
- * @param test test with parameters
- * @return runner runner
- * @throws InitializationError
- * if the runner could not be created.
- */
+ @Override
public Runner createRunnerForTestWithParameters(final TestWithParameters
test) throws InitializationError {
return new ITBlockJUnit4ClassRunnerWithParameters(test);
}
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/watcher/ITWatcher.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITWatcher.java
similarity index 94%
rename from
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/watcher/ITWatcher.java
rename to
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITWatcher.java
index 277bf3d..eb11939 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/watcher/ITWatcher.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITWatcher.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.test.integration.engine.watcher;
+package org.apache.shardingsphere.test.integration.engine.junit;
import lombok.extern.slf4j.Slf4j;
import org.junit.rules.TestWatcher;
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
index de947d0..20943c3 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
@@ -20,19 +20,18 @@ package
org.apache.shardingsphere.test.integration.engine.junit;
import org.junit.runners.Parameterized;
/**
- * Parallel parameterized by parameter.
+ * Parallel parameterized.
+ *
+ * <p>
+ * Reflective call only, do not use programmatically.
+ * </p>
*/
public final class ParallelParameterized extends Parameterized {
- /**
- * Only called reflectively. Do not use programmatically.
- *
- * @param klass root of the suite
- */
//CHECKSTYLE:OFF
public ParallelParameterized(final Class<?> klass) throws Throwable {
+ //CHECKSTYLE:ON
super(klass);
setScheduler(new ITRunnerScheduler());
- //CHECKSTYLE:ON
}
}