代码之家  ›  专栏  ›  技术社区  ›  Basil Bourque

测试在JUnit 4下运行,但不是JUnit 5__编译干净,但执行0个测试

  •  7
  • Basil Bourque  · 技术社区  · 5 年前

    任何人都可以在几分钟内轻松地重现这个问题。

    基本文法 quickstart 项目

    借助Intellij 2018.3和Maven 3.6.0,我使用Maven原型创建了一个全新的项目 maven-archetype-quickstart 版本1.4。

    enter image description here

    爪哇11

    在新项目的pom文件中,我更改的属性 maven.compiler.source maven.compiler.target 从1.7到11,对于当前使用的Java1.0.2, Zulu Azul Systems .

    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>11</maven.compiler.source>
      <maven.compiler.target>11</maven.compiler.target>
    </properties>
    

    在Intellij的Maven面板上,我运行 clean install 生命周期事件。

    enter image description here

    6月4日试运行

    作为一部分 安装 ,运行测试。这个 快速入门 原型附带一个断言 true .

    enter image description here

    结果显示在 Run 智能面板。

    [信息]running work.basil.example.apptest

    [信息]测试运行:1,失败:0,错误:0,跳过:0,已用时间:0.026 s-in work.basil.example.apptest

    所以我知道测试执行了。

    JUnit 5,而不是4

    这都很好。现在让我们升级到Junit 5,看看问题所在。

    在POM中,我将JUnit依赖项从以下内容更改为:

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
    

    对此:

    <dependencies>
      <!--JUnit 5-->
      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.2</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
    

    木星进口(无年份测试)

    编译器抱怨我的 AppTest.java 文件。所以我改变了 import 使用的语句 jupiter 包装。我只想在我的新贪婪领域项目中运行JUnit 5测试,而不需要复古的JUnit 4测试。因此,进口从以下方面发生了变化:

    import static org.junit.Assert.assertTrue;
    import org.junit.Test;
    

    对此:

    import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.assertTrue;
    

    然后我执行 Maven gt; Lifecycle gt; 清洁的 和; 安装 .

    _和Voil_,问题是:我们的测试没有执行。报告见 Intellij小组:

    [信息]running work.basil.example.apptest

    [信息]测试运行:0,失败:0,错误:0,跳过:0,已用时间:0.003 s-in work.basil.example.apptest

    _为什么Junit 5未能运行与Junit 4愉快运行的测试相同的测试?

    更新 surefire 插件

    我怀疑 Maven Surefire Plugin 需要更新。所以在POM中我改变了这个:

    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.22.1</version>
    </plugin>
    

    对此:

    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M3</version>
    </plugin>
    

    另一 清洁的 和; 安装 . 但是没有更好的,仍然运行0个测试。

    [信息]running work.basil.example.apptest

    [信息]测试运行:0,失败:0,错误:0,跳过:0,已用时间:0.004 s-in work.basil.example.apptest

    全POM

    这是我所有的POM文件。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <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>work.basil.example</groupId>
      <artifactId>tester</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <name>tester</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
      </properties>
    
      <dependencies>
        <!--JUnit 5-->
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-api</artifactId>
          <version>5.3.2</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>3.0.0-M3</version>
            </plugin>
            <plugin>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
            <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
            <plugin>
              <artifactId>maven-site-plugin</artifactId>
              <version>3.7.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-project-info-reports-plugin</artifactId>
              <version>3.0.0</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    

    JUnit图书馆

    做了一个小牛后 清洁的 和; 安装 ,两个JUnit库出现: junit-jupiter-api junit-platform-commons .

    enter image description here

    6月5日的其他版本

    我在我的 朱比特木星API 附属国:

    • 5.0.0 M1
    • 5.1.1
    • 5.3.0
    • 5.3.2
    • 5.4.0 M1

    每次尝试,我都会跑一个小牛 清洁的 和; 安装 . 没有更好的。每个版本都报告了 Tests run: 0 .

    不要责怪 马文原型快速启动

    实际上,我在一个完全不同的Maven原型的项目中发现了这个问题。

    为了解决这个问题,我尝试了一个新的项目,使用非常简单的 马文原型快速启动 . 我发现了完全相同的行为:所有东西都在编译,测试工具在运行,但是没有测试在JUnit5下执行。

    1 回复  |  直到 5 年前
        1
  •  5
  •   Basil Bourque    5 年前

    DR

    对于JUnit 5版本5.4.0-M1或更高版本,请指定新的单maven工件 junit-jupiter _聚合器_在您的POM中。

    <!--JUnit 5-->
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.4.0-M1</version>
    </dependency>
    

    对于早期版本,至少指定这两个工件: junit-jupiter-api 和; junit-jupiter-engine .

    Junit 5 Yokes多个测试框架

    据我所知,JUnit5已经被重新架构为多个测试框架的枷锁。这些测试系统包括JUnit 4__Vintage_157;测试、新的JUnit 5测试(新的测试语法、新的注释和方法),以及其他诸如 Specsy , Spek , Cucumber ,流口水场景, jqwik more that implement 这个 TestEngine 接口。

    显然是 朱比特木星API 神器只是外轭。您还必须指定一个或多个 测试引擎 实际运行测试的实现。例如,要运行Vintage Junit 4测试,需要 VintageTestEngine 或者运行JUnit 5测试,您需要 JupiterTestEngine 实施。

    因此,要运行JUnit 5测试,必须指定 Jupiter发动机 在Maven POM中使用 Junit Jupiter引擎 伪影。

    参见JUnit 5手册,特别是章节 Configuring Test Engines .

    this presentation 由MarcPhilipp绘制,图中显示了JUnit5作为一个平台,(a)一个用于IDE/构建工具的核心,(b)一个用于程序员编写测试的可插拔测试编写框架。

    Junit Jupiter引擎

    如所见 this sample ,为添加第二个JUnit相关依赖项 JUNit Jupiter Engine . 这个 documentation for this artifact 简单地说:junit jupiter测试引擎实现,只在运行时需要。

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.4.0-M1</version>
        <scope>test</scope>
    </dependency>
    

    只需将一个依赖项添加到问题中显示的项目中,就可以看到测试的运行。

    [信息]running work.basil.example.apptest

    [信息]测试运行:1,失败:0,错误:0,跳过:0,已用时间:0.004 s-in work.basil.example.apptest


    junit-jupiter-params

    同一个示例还显示了第三个JUnit依赖项,用于 JUnit Jupiter Params . 虽然不需要运行示例测试,但它可能有其他用途。显然与 Parameterized Tests .

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <version>5.4.0-M1</version>
        <scope>test</scope>
    </dependency>
    

    这使得共有3个JUnit依赖项。

    <!--JUnit 5-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.4.0-M1</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <version>5.4.0-M1</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.4.0-M1</version>
        <scope>test</scope>
    </dependency>
    

    您的同一个POM文件,现在更新为所有3个JUnit依赖项。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <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>work.basil.example</groupId>
        <artifactId>tester</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <name>tester</name>
        <!-- FIXME change it to the project's website -->
        <url>http://www.example.com</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    
        <dependencies>
    
            <!--JUnit 5-->
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>5.4.0-M1</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-params</artifactId>
                <version>5.4.0-M1</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-engine</artifactId>
                <version>5.4.0-M1</version>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
        <build>
            <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
                <plugins>
                    <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
                    <plugin>
                        <artifactId>maven-clean-plugin</artifactId>
                        <version>3.1.0</version>
                    </plugin>
                    <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>3.0.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.8.0</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>3.0.0-M3</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-jar-plugin</artifactId>
                        <version>3.0.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-install-plugin</artifactId>
                        <version>2.5.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <version>2.8.2</version>
                    </plugin>
                    <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
                    <plugin>
                        <artifactId>maven-site-plugin</artifactId>
                        <version>3.7.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-project-info-reports-plugin</artifactId>
                        <version>3.0.0</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    

    JUnit木星 人工制品

    Junit 5的5.4.0版带来了一个新的Maven工件, JUnit木星 有头衔的 Junit Jupiter(聚合器) . 为了方便编程,单词_aggregator*显然是指它捆绑了Maven中一些常用的JUnit 5构件。

    加上这一个 dependency 在你的pom中,你的项目中有8个库。

    <!——JUnit 5—& GT;
    &!--https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-->
    <相关性>
    <groupid>org.junit.jupiter</groupid>
    <artifactid>Junit Jupiter</artifactid>
    <版本>5.4.0-M1</version>
    </dependency>
    

    Screenshot of IntelliJ panes for project structure and POM file contents, where a single dependency for <code>junit-jupiter</code> adds eight libraries to your project, all you need to run JUnit 5 tests.

    推荐文章