junit5学习笔记-01 入门

Junit 入门

[TOC]

什么是 JUnit 5

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

  • JUnit Platform

    它是在 JVM 上启动测试框架的基础。它还定义了TestEngine用于开发在平台上运行的测试框架的 API。此外,该平台还提供了一个 控制台启动器,用于从命令行启动平台,并提供JUnit 平台套件引擎,用于使用平台上的一个或多个测试引擎运行自定义测试套件。流行的 IDE(参见IntelliJ IDEAEclipseNetBeansVisual Studio Code)和构建工具(参见GradleMaven蚂蚁)。

  • JUnit Jupiter

    是用于在 JUnit 5 中编写测试和扩展的新编程模型扩展模型的组合。Jupiter 子项目提供了一个TestEngine用于在平台上运行基于 Jupiter 的测试。

  • JUnit Vintage

    JUnit Vintage 为在平台上运行基于 JUnit 3和 JUnit 4的测试提供了一个 TestEngine。它要求 JUnit 4.12或更高版本出现在类路径或模块路径上

个人总结:

JUnit Platform 它是 Junit 向测试平台演进,提供平台功能的模块,通过它,其他的自动化测试引擎或开发人员自己定制的引擎都可以接入 JUnit 实现对接执行

JUnit Jupite 是 Jnuit5 的核心,也是 JUnit Platform 的引擎实现。

JUnit Vintage 这个模块是对 JUnit3、JUnit4 版本兼容的测试引擎,让旧版本 JUnit 的自动化脚本也可以顺畅运行在 JUnit5 下。它也可以看做是基于 JUnit Platform 实现的引擎范例。

image-20220120163648206

图(1)- junit 3大块之间的关系图

特性

  • 嵌套单元测试
  • Lambada 支持
  • 参数化测试
  • 重复测试
  • 动态测试

环境依赖

java 版本

官方明确:

JUnit 5 requires Java 8 (or higher) at runtime. However, you can still test code that has been compiled with previous versions of the JDK.

推荐jdk

  • JDK 8
  • JDK 11

编辑器

  • IDEA
  • Eclipse
  • VScode

编译依赖

  • Maven
  • Gradle
  • Ant
Maven 项目配置

2.22.0 版本开始,Maven Surefire 和 Maven Failsafe 为在 JUnit 平台上执行测试提供了本地支持Junit5-jupiter-starter-Maven 项目中的 pom.xml 文件演示了如何使用 Maven Surefire 插件,可以作为配置 Maven 构建的起点。

为了让 Maven Surefire 或 Maven Failsafe 运行任何测试,必须将至少一个 TestEngine 实现添加到测试类路径中。

为了配置对基于 JUnit Jupiter 的测试的支持,可以配置测试范围内对 JUnit Jupiter API 和 JUnit Jupiter TestEngine 实现的依赖,如下所示。

pom.xml 配置

<!-- ... -->
<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
    
</dependencies>
<build>
    <!-- Maven 运行的依赖插件 -->
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>

maven库:https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api

注释

JUnit Jupiter 支持以下配置测试和扩展框架的注释。

除非另有说明,所有核心注释都位于 junit-jupiter-api 模块中的 org.junit. jupinter. api 包中。

注释 描述
@ Test 表示某个方法是一个测试方法。与 JUnit 4的@ Test 注释不同,这个注释没有声明任何属性,因为 JUnit Jupiter 的测试扩展基于它们自己的专用注释运行。这些方法是继承的,除非它们被重写。
@ ParameterizedTest 表示方法是参数化测试。除非重写这些方法,否则将继承它们。
@ RepeatedTest 表示一个方法是一个重复测试的测试模板。这样的方法是继承的,除非它们被重写。
@ TestFactory 表示一个方法是动态测试的测试工厂。这样的方法是继承的,除非它们被重写。
@ TestTemplate 表示方法是用于测试用例的模板,根据注册提供程序返回的调用上下文的数量设计为多次调用。这些方法是继承的,除非它们被重写。
@ TestClassOrder 用于在带注释的测试类中配置@ Nested 测试类的测试类执行顺序。这样的注释是继承的。
@ TestMethodOrder 用于配置带注释的测试类的测试方法执行顺序; 类似于 JUnit 4的@ FixMethodOrder。这样的注释是继承的。
@ TestInstance 用于为带注释的测试类配置测试实例的生命周期。
@ DisplayName 声明测试类或测试方法的自定义显示名称。这样的注释不会被继承。
@ DisplayNameGeneration 声明测试类的自定义显示名生成器。这样的注释会被继承的。
@ BeforeEach 表示应在当前类中的每个@ Test、@ repeatedtest、@ parameterizedtest 或@ TestFactory 方法之前执行带注释的方法; 类似于 JUnit 4的@ Before。这些方法是继承的,除非它们被重写。
@ AfterEach 表示应在当前类中的每个@ Test、@ repeatedtest、@ parameterizedtest 或@ TestFactory 方法之后执行带注释的方法; 类似于 JUnit 4的@ After。这些方法是继承的,除非它们被重写。
@ BeforeAll 表示应该在当前类中的所有@ Test、@ repeatedtest、@ parameterizedtest 和@ TestFactory 方法之前执行带注释的方法; 类似于 JUnit 4的@ BeforeClass。这些方法是继承的(除非它们被隐藏或重写) ,并且必须是静态的(除非使用了“每类”测试实例生命周期)。
@ AfterAll 表示应该在当前类中的所有@ Test、@ repeatedtest、@ parameterizedtest 和@ TestFactory 方法之后执行带注释的方法; 类似于 JUnit 4的@ AfterClass。这些方法是继承的(除非它们被隐藏或重写) ,并且必须是静态的(除非使用了“每类”测试实例生命周期)。
@ Nested 表示带注释的类是非静态嵌套测试类。@ beforeall 和@ AfterAll 方法不能直接在@ Nested 测试类中使用,除非使用了“每个类”测试实例的生命周期。这样的注释是不能继承的。
@ Tag 用于在类或方法级别声明筛选测试的标记; 类似于 TestNG 中的测试组或 JUnit 4中的 Categories。这样的注释可以在类级别继承,但不能在方法级别继承。
@ Disabled 用于禁用测试类或测试方法。
@ Timeout 用于在测试、测试工厂、测试模板或生命周期方法的执行超过给定的持续时间时失败。这样的注释是继承的。
@ ExtendWith 用于以声明方式注册扩展。这样的注释是继承的。
@ RegisterExtension 用于通过字段以编程方式注册扩展。除非这些字段被隐藏,否则将继承它们。
@ TempDir 用于在生命周期方法或测试方法中通过字段注入或参数注入提供临时目录; 位于 org.junit.jupiter.api.io /目录包中。

:注释加粗部分为常用注释。

JUnit5 命名规则

Junit5 文件工程目录

  • 单元测试代码文件
    • 默认协助工程目录:src/test/java
    • 不予许写在业务代码目录下
  • 测试资源文件
    • 默认写在资源目录:src/test/resources

Junit5 文件命名

  • 默认命令规则

    • 以 Test 开头

image-20220120181531309

  • 以 Test 结尾

image-20220120181606989

如果命名没有遵循上面其中一种规范。结果如下:

  • 在 IDEA 中可以右键执行

    原因: IDEA 并没有针对文件名做限制

  • 使用 maven构建时,则不会收集不满足规则要求的用例

  • 自定义命名规则(拓展)

    使用 surefire 插件

<build>
    <plugins>
        <!-- 某些版本需要添加groupId,否则报错 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M5</version>
            <configuration>
                <includes>
                    <!-- 只要java文件名中包含 Hogwarts 的,都是测试文件 -->
                    <include>**/*Hogwarts*.java</include>
                    <!-- 只要java文件名中以 TestCase 结尾的,都是测试文件 -->
                    <include>**/*TestCase.java</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

注:不建议使用

官方文档:JUnit 5 User Guide

2 个赞