Запуск файловых тестов на платформе Junit 5 с использованием Apache Maven Surefire - PullRequest
0 голосов
/ 20 июня 2020

Я реализовал собственный класс TestEngine, который может обнаруживать и запускать модульные тесты из *.csv файлов (не java классов), проверяя FileSelector в EngineDiscoveryRequest от Junit 5.

Я могу без проблем запускать эти тесты, используя ConsoleLauncher, предоставленный командой Junit, вызывая org.junit.platform.console.ConsoleLauncher -f build/resources/test/testfile_1.csv (это вызывается из задачи gradle, потому что gradle не поддерживает тестирование на основе ресурсов , но здесь это не имеет значения).

Теперь я пытаюсь запустить те же тесты, используя тот же пользовательский механизм тестирования, но с использованием maven и плагина surefire вместо средства запуска консоли. Мой текущий pom.xml выглядит следующим образом (соответствующая часть):

<project>
    <dependencies>
        <dependency>
            <groupId>my_custom_test_engine</groupId>
            <artifactId>custom_test_engine</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-engine</artifactId>
            <version>1.7.0-M1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-console</artifactId>
            <version>1.7.0-M1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.30</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
        </plugins>
    </build>
</project>

К сожалению, surefire:test, похоже, даже не вызывает мою тестовую систему для обнаружения и просто заканчивается:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.626 s
[INFO] Finished at: 2020-06-20T17:00:01+02:00
[INFO] ------------------------------------------------------------------------

У меня нет тестовых классов в моей папке src, только один тестовый файл под resources/testfile_1.csv.

Поддерживает ли surefire даже файловое тестирование с помощью Junit 5? Если да, то как я могу заставить Surefire вызывать мой собственный механизм тестирования для обнаружения тестов?

- Обновление

Часть обнаружения в моей реализации TestEngine выглядит примерно так (только соответствующая часть показано):

public class MyTestEngine implements TestEngine {

    @Override
    public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) {
        EngineDescriptor engineDescriptor = new EngineDescriptor(uniqueId, name);

        logger.debug("Discovering tests");

        discoveryRequest.getSelectorsByType(FileSelector.class).forEach(selector -> {
            logger.debug("Discovered: {}", selector.getFile().getAbsolutePath());
                engineDescriptor.addChild(new TestDescriptor (engineDescriptor.getUniqueId(), selector.getFile().getName()));

        });
}

- Обновление 2 Мои тестовые файлы находятся в src/test/resources.

1 Ответ

0 голосов
/ 21 июня 2020

Разобрался. Благодарим @johanneslink за то, что он указал мне в правильном направлении.

Surefire действительно не поддерживает тестирование на основе ресурсов (см. Также эту проблему ). Вместо этого я (как советовал @johanneslink) создал пустой класс, который может быть обнаружен с помощью surefire, так что вызывается пользовательский TestEngine:

public class TestInitializer {
}

Затем в моем TestEngine , Я проверяю наличие ClassSelector и обнаруживаю тесты на основе ресурсов:

discoveryRequest.getSelectorsByType(ClassSelector.class).forEach(selector -> {
            if (selector.getClassName().equals(TestInitializer.class.getName())) {
                discoverTests(new File(System.getenv("test_dir")), engineDescriptor);
            }
        });

Фактический каталог, в котором находятся мои тестовые файлы, указывается в переменной среды test_dir.

Затем , для фактического использования пользовательского TestEngine измените свой pom.xml следующим образом:

   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <dependenciesToScan>
                        <dependency>
                            my_custom_test_engine:custom_test_engine
                        </dependency>
                    </dependenciesToScan>
                    <includes>
                        <include>**/TestInitializer*
                        </include>
                    </includes>
                    <environmentVariables>
                        <test_dir>target/test-classes
                        </test_dir>
                    </environmentVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>

Свойство dependenciesToScan гарантирует, что surefire просканирует зависимость, содержащую класс TestInitializer.

Обратите внимание, что последняя версия 3.0.0-M5 из maven-surefire-plugin, похоже, не работает в этом отношении, так как тесты будут обнаружены и запущены, но верный ответ не получит результатов. Вместо этого используйте 2.22.2.

...