Выполнение тестов JUnit 4 и JUnit 5 в одной сборке

В проектах Maven у меня есть некоторые существующие тесты, основанные на JUnit 4. Я не могу перенести эти тесты в JUnit 5 по нескольким причинам.
По сути, некоторые тесты зависят от библиотеки, в которой используется модуль запуска JUnit 4, и миграция кода может занять некоторое время.

Я хотел бы все же создать новые тестовые классы с помощью JUnit 5, который сейчас выпущен и предоставляет новые интересные функции.
Как это сделать?

3 ответа

JUnit 5 предоставляет выход из коробки.

JUnit 5 = платформа JUnit + юнит Юпитер + винтаж Юнит

Каждый из них является отдельным проектом, и использование их всех позволяет скомпилировать и выполнить тесты JUnit 4 и JUnit 5 в одном проекте.

JUnit Jupiter - это сочетание новой модели программирования и модели расширений для написания тестов и расширений в JUnit 5.

JUnit Vintage предоставляет TestEngine для запуска тестов на основе JUnit 3 и JUnit 4 на платформе.

Платформа JUnit служит основой для запуска сред тестирования на JVM


Обновление: от Maven Surefire2.22.0

Из документации JUnit 5:

Начиная с версии 2.22.0Maven Surefire предоставляет встроенную поддержку для выполнения тестов на платформе JUnit.

Таким образом, конфигурация намного проще.
Обратите внимание, что junit-4 зависимость API является необязательной, так как engine зависимости, которые теперь требуются, уже тянут по умолчанию api версия (это относится и к junit 4, и к 5).

Вот образец pom.xml,

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>david</groupId>
    <artifactId>jupiter-4-and-5-same-build</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit-jupiter.version>5.1.0</junit-jupiter.version>
        <!-- optional : if we want to use a junit4 specific version -->
        <junit.version>4.12</junit.version>
    </properties>
    <dependencies>
        <!--JUnit Jupiter Engine to depend on the JUnit5 engine and JUnit 5 API -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <!--JUnit Jupiter Engine to depend on the JUnit4 engine and JUnit 4 API  -->
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>${junit-jupiter.version}</version>
        </dependency>
        <!-- Optional : override the JUnit 4 API version provided by junit-vintage-engine -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
        </plugins>
    </build>

</project>

В моем пространстве GitHub я добавил рабочий пример проекта maven, который вы можете просматривать / клонировать. URL: https://github.com/ebundy/junit4-and-5-minimal-maven-project


Старый способ: для Maven Surefire ниже2.22.0

Вот минимальная конфигурация, которую следует использовать с Maven для настройки проекта для компиляции и запуска тестов JUnit4 и JUnit5:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>mygroup</groupId>
    <artifactId>minimal-conf-junit4-5</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <!-- JUnit 5 depends on JDK 1.8 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!--  JUnit dependency versions -->
        <junit.version>4.12</junit.version>
        <junit-vintage-engine>4.12.1</junit-vintage-engine>
        <junit-jupiter.version>5.0.1</junit-jupiter.version>
        <junit-platform.version>1.0.1</junit-platform.version>
    </properties>

    <dependencies>
        <!--JUnit Jupiter API to write and compile tests with JUnit5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- JUnit 4 to make legacy JUnit 4 tests compile -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version> <!-- matters until now-->
                <dependencies>
                    <!-- to let surefire to run JUnit 4 but also JUnit 5 tests -->
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${junit-platform.version}</version>
                    </dependency>
                    <!-- JUnit vintage engine to run JUnit 3 or JUnit 4 tests -->
                    <dependency>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                        <version>${junit-vintage-engine}</version>
                    </dependency>
                    <!-- JUnit 5 engine to run JUnit 5 tests -->
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit-jupiter.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

Сейчас mvn test компилирует и запускает тесты JUnit 4 и JUnit 5.

Примечание 1: junit-vintage-engine (4.12.1) и junit (4.12) зависимости не указывают одну и ту же точную версию.
Это не проблема, так как:

  • их выпуск не связан между ними

  • junit-vintage-engine предназначен для запуска любых тестов JUnit 3 или 4.

Примечание 2: maven-surefire-плагин с 2.19.1 Версия имеет значение, что вы хотите скомпилировать тестовые классы JUnit 5 или оба тестовых класса JUnit 4 и JUnit 5.
Следующая версия плагина действительно вызывает некоторые исключения во время выполнения тестов JUnit 5, но 2.22.0 это, наконец, решает проблему (см. первую часть ответа: "Обновление: из Maven Surefire 2.22.0").

У JUnit есть несколько примеров проектов на https://github.com/junit-team/junit5-samples .

У меня был проект Gradle, и у меня работало следующее https://github.com/junit-team/junit5-samples/tree/main/junit5-migration-gradle .

https://github.com/junit-team/junit5-samples/tree/main/junit5-migration-maven - это эквивалент Maven - я не пробовал, но думаю, что он тоже работает.

Для реализации градиента. Просто используйте junit 4 и винтажные зависимости junit.

      dependencies {
testImplementation 'junit:junit:4.13.1'
testImplementation 'org.junit.vintage:junit-vintage-engine'
}

а также добавить тест для использования junitPlatform

      test {
    useJUnitPlatform()
}

и тогда оба теста junit4 и junit5 должны работать нормально.

Другие вопросы по тегам