当前位置: 首页 > 知识库问答 >
问题:

在同一构建中执行JUnit4和JUnit5测试

欧盛
2023-03-14

在Maven项目中,我有一些现有的测试依赖于JUnit4。由于多种原因,我无法在JUnit5中迁移这些测试。
本质上,一些测试依赖于使用JUnit4运行程序的库,代码迁移可能需要时间。

我同样希望用JUnit5创建新的测试类,它现在发布并提供了新的有趣的特性。
如何做到这一点?

共有1个答案

郑星雨
2023-03-14

JUnit 5提供了一种开箱即用的方法

JUnit 5=JUnit Platform+JUnit Jupiter+JUnit Vintage

每一个都是一个不同的项目,使用它们可以在同一个项目中编译和执行JUnit4和JUnit5测试。

在JUnit5文档中:

从版本2.22.0开始,Maven Surefire为在JUnit平台上执行测试提供了本机支持。


注意,JUnit-4api依赖项是可选的,因为现在所需的Engine依赖项已经拉出默认的api版本(JUnit4和5都是这样)。

<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>

下面是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编译并运行JUnit4和JUnit5测试。

注意1:junit-vintage-engine(4.12.1)和junit(4.12)依赖关系没有指定相同的版本。
这根本不是问题,因为:

注2:2.19.1版本的maven-surefire-plugin对编译JUnit5测试类或JUnit4和JUnit5测试类都很重要。
插件的下一个版本确实会在JUnit5测试执行期间导致一些异常,但2.22.0最终解决了这个问题(请参见答案的第一部分:“update:from Maven Surefire 2.22.0”)。

 类似资料:
  • 我有一个工作环境,包括我不管理的bom和JUnit5测试,除非我从如果我从它们不会被maven surefire插件拾取。我阅读了许多部分,并在一个较小的项目中进行了测试,它的工作和拾取,我不知道该在这篇文章中包含什么,因此您有足够的信息来查看问题所在。此外,如果有人能解释我阅读的导入的幕后内容,JUnit 4和5都需要使用surefire即 与版本 我很感激。 注意到 < li >我的测试都在s

  • 我使用的是JUnit5Vintage,所以我的测试任务同时运行JUnit4和JUnit5测试。

  • 主要内容:1 概述,2 测试执行顺序,3 例子,4 结论1 概述 在本指南中,我们将学习如何按顺序执行测试。默认情况下,JUnit以任何顺序执行测试。 2 测试执行顺序 要更改测试执行顺序,只需使用@FixMethodOrder注释测试类并指定可用的MethodSorters之一: @FixMethodOrder(MethodSorters.JVM):按照JVM返回的顺序保留测试方法。此顺序可能因运行而异。 @FixMethodOrder(Method

  • 在JUnit 4中,通过使用注释很容易跨一堆类测试不变量。关键是一组测试正在针对单个参数列表运行。 如何在JUnit 5中复制这一点,而不使用JUnit-vintage? 不适用于测试类。听起来可能是合适的,但该注释的目标也是一个方法。 此类 JUnit 4 测试的一个示例是:

  • 我试图在JUnit5测试环境中使用JUnit4。事实上,我已经升级了我的pom来使用更高版本的MOckito和POwerMock。到目前为止,所有测试都基于JUnit4。我将平台和vintage依赖项添加到我的pom.xml中。 更早的pom。xml依赖关系

  • 我使用Jfunc构建了我现有的框架,它提供了一个即使测试用例中的一个断言失败也能继续执行的工具。Jfunc使用junit3. x框架。但是现在我们正在迁移到Junit4,所以我不能再使用Jfunc,而是用junit4.10 jar代替了它。 现在的问题是,因为我们已经在我们的框架中广泛使用了jfunc,并且使用junit4,我们希望让我们的代码继续执行,即使其中一个断言在测试用例中失败。 有人对此