Ошибка ограничения заголовка Java GC при использовании JUnit 5 TestFactory с большим потоком динамического теста (DynamicContainer / DynamicNode) - PullRequest
0 голосов
/ 31 мая 2018

При попытке создать и запустить большое количество динамических тестов JUnit 5 с использованием maven-surefire-plugin 2.21.0 я сталкиваюсь с проблемой 2.21.] org.apache.maven.surefire.java: 673) [ОШИБКА] на org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork (ForkStarter.java:535) [ОШИБКА] на org.apache.maven.plugin.surefire.booterclient.ForkStarter.run (ForkStarter.java:280) [ОШИБКА] в org.apache.maven.plugin.surefire.booterclient.ForkStarter.run (ForkStarter.java:245) [ОШИБКА] в org.apache.maven.plugin.surefire.AbstractSurefireTroviderAbstractSurefireMojo.java:1124) [ОШИБКА] в org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked (AbstractSurefireMojo.java:954) [ОШИБКА] в org.apache.maven.plusrefire.AbstractSurefireMojo.execute (AbstractSurefireMojo.java:832) [ОШИБКА] в org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:134) в.REG.ORN.ORG.выполнить (MojoExecutor.java:208) [ОШИБКА] в org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154) [ОШИБКА] в org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146) [ОШИБКА] в org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117) [ОШИБКА] в org.apache.maven.lifecycle.internal.LifecycleMoildMjectBilderBuderJava: 81) [ОШИБКА] на org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:51) [ОШИБКА] на org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)

и ниже - мой код, это инструмент сравнения БД.В основном я делаю потоковую передачу данных из двух баз данных, сравниваю запись и провалю тест, если есть разница в любой из двух записей, поэтому будет создано столько динамических тестов, сколько записей в БД (~ 14M),довольно большой, не уверен, предназначены ли динамические тесты для использования в таком масштабе.Любая помощь в этом отношении с благодарностью:)

 @TestFactory
Stream<DynamicNode> dynamicTestsWithContainers() throws SQLException {
    return tableNameProvider()//List of db tables ~100
            .map(tableName -> dynamicContainer(tableName, dynamicNodeStream(tableName)));
}

private Stream<DynamicNode> dynamicNodeStream(String tableName) {

    try {
        System.out.println("Testing " + tableName);
        Stream<Row> rows = sourceRepo.rows(tableName);
        Stream<List<Row>> batchRows = batch(rows, 10000);
        Optional<TableSchema> tableInfo = sourceRepo.getTableSchema(tableName);


        final Stream<DynamicNode> dynamicNodeStream = batchRows
                .flatMap(batch -> {

                    Map<String, Row> sourceRowsMap = buildRowMap(batch, tableInfo.get());//HashMap with 10000 Objects
                    Map<String, Row> targetRowsMap = targetRepo.getTargetDBRows(sourceRowsMap, tableInfo.get());//HashMap with 10000 Objects
                    Set<String> commonKeys = Sets.intersection(sourceRowsMap.keySet(), targetRowsMap.keySet());

                    final Stream<DynamicTest> dynamicTestStream = Streams.concat(
                            Stream.of(
                                    dynamicTest("All source records should be present in target DB", () -> assertThat(targetRowsMap.keySet())
                                            .as("Comparing " + sourceRepo.getServerName() + " against " + targetRepo.getServerName())
                                            .hasSameElementsAs(sourceRowsMap.keySet()))
                            ),
                            commonKeys
                                    .stream()
                                    .map(rowKey -> dynamicTest(tableName + " Row with #" + rowKey + " should be same in target DB",
                                            () -> assertThat(targetRowsMap.get(rowKey).getRowData())
                                                    .isEqualToComparingFieldByFieldRecursively(sourceRowsMap.get(rowKey).getRowData())
                                    ))

                    );

                    return dynamicTestStream;
                });

        return dynamicNodeStream;
    } catch (Exception e) {
        throw new RuntimeException("Error running tests on table " + tableName, e);
    }
}
...