Skip to content

JUnit5简介、安装与准备

JUnit5 简介安装与准备

简介

todo 截图

  • JUnit 5 是一个强大的测试框架,广泛应用于 Java 开发中,用于编写和运行测试。 它提供了丰富的功能和灵活的扩展性,可以用于各种类型的测试,包括单元测试、集成测试、回归测试、行为驱动开发测试、验收测试和性能测试。通过使用 JUnit 5 完成这些测试测试工作,可以确保代码的正确性、稳定性和性能,最终达到提升软件质量。

使用场景

  • 单元测试:验证单个类或方法的功能是否正确。适用于代码中的每个独立模块,确保其按照预期工作。
  • 集成测试:测试多个组件或模块之间的交互,确保它们能协同工作。通常涉及数据库、网络等外部资源。
  • 回归测试:在代码发生变化后,验证新代码没有引入新的错误,旧功能仍然正常工作。用于长期维护项目。
  • 行为驱动开发(BDD):通过描述系统的行为来驱动开发和测试。增强了测试用例的可读性和可维护性。
  • 验收测试:验证系统是否满足业务需求和用户期望。通常由 QA 团队或产品经理编写和执行。
  • 性能测试:测量系统在不同负载条件下的性能表现,确保系统在预期负载下稳定运行。

使用价值

1.丰富的注解支持:提供了 @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll 等多种注解,方便测试生命周期管理。

2.强大的断言和假设:丰富的断言方法和假设工具,使得测试验证更加方便和直观。

3.动态测试支持:支持通过 @TestFactory 在运行时生成测试用例,提供更灵活的测试编写方式。

4.条件测试执行:通过注解(如 @EnabledOnOs, @EnabledIf),可以根据特定条件有选择地执行测试,提高测试的灵活性。

5.良好的兼容性和迁移支持:通过 JUnit Vintage 支持运行 JUnit 3JUnit 4 的测试,确保平滑迁移到 JUnit 5

6.Lambda 表达式支持:充分利用 Java 8 的新特性,如 lambda 表达式,使得编写测试更加简洁和强大。

7.更好的 IDE 和构建工具支持:与现代 IDE(如 IntelliJ IDEAEclipse)和构建工具(如 MavenGradle)集成良好,提供了丰富的运行和报告功能。

JUnit 5 通过其模块化设计、丰富的功能和灵活的扩展性,为现代 Java 开发提供了全面而强大的测试解决方案。尽管存在一定的学习曲线和配置复杂性,但其优点远远超过缺点,使得它成为当前最受欢迎和推荐的 Java 测试框架之一。

组成部分

  • JUnit 5 由三个子项目组成:JUnit PlatformJUnit JupiterJUnit Vintage。这种模块化设计使得框架更加灵活和可扩展。

JUnit平台(JUnit Platform)

  • 在 JVM 上启动测试框架,所有的执行都离不开 JUnit 的使用。
  • 使用 TestEngine API 来构建在 JUnit 平台上运行的测试框架。
  • 定义了公共的测试引擎 API ,允许第三方测试框架集成。

JUnit Jupiter

  • 混合了用于编写测试的新编程模型和用于扩展的扩展模型。
  • 提供新的注解(如 @Test , @BeforeEach , @AfterEach ),断言和假设( Assertions 和 Assumptions ),以及测试生命周期控制和条件执行功能。
  • 支持自定义扩展(通过 Extension API )。

JUnit Vintage

  • 使用 JUnit Vintage 提供向上兼容的作用,可以使用之前的版本。

结构图

todo 截图

  • JUnit Platform :IDEsBuild tools (如 MavenGradle)通过调用 JUnit Platform 执行。
  • TestEngine interface : JUnit Platform 需要 TestEngine interface 测试引擎接口进行执行。能够调用测试引擎接口的包括 JUnit Jupiter (注解)、 JUnit Vintage (兼容的版本)、 Custom engine (自定义测试引擎)。

环境准备

  • Java 环境:教程中使用 JDK11 ,其他 Java 环境也可(如 JDK8)。
  • 编辑器:IDEA (推荐) 、Eclipse、VScode。
  • 编译依赖:Maven(推荐)、Gradle、Ant。

操作步骤

1.配置 Maven 依赖

  • 配置 pom.xml 文件
  • 打开 pom.xml
  • 复制下边内容到 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>org.example</groupId>
    <artifactId>JUnitTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>11</java.version>
        <!-- 使用 Java 11 语言特性 ( -source 11 ) 并且还希望编译后的类与 JVM 11 ( -target 11 )兼容,您可以添加以下两个属性,它们是默认属性插件参数的名称-->
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.source>11</maven.compiler.source>
        <!-- 对应junit Jupiter的版本号;放在这里就不需要在每个依赖里面写版本号,导致对应版本号会冲突-->
        <junit.jupiter.version>5.8.2</junit.jupiter.version>
        <!-- plugins -->
        <maven.compiler.version>3.8.1</maven.compiler.version>
        <maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
        <poi.version>5.2.2</poi.version>
        <!-- 断言-->
        <hamcrest.version>2.2</hamcrest.version>
        <slf4j.version>2.0.0-alpha7</slf4j.version>
        <logback.version>1.3.0-alpha16</logback.version>
    </properties>

    <!--    物料清单 (BOM)-->
    <dependencyManagement>
        <dependencies>
            <!--当使用 Gradle 或 Maven 引用多个 JUnit 工件时,此物料清单 POM 可用于简化依赖项管理。不再需要在添加依赖时设置版本-->
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>${junit.jupiter.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>



    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <!--            对应添加的依赖的作用范围-->
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest</artifactId>
            <version>${hamcrest.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>

                    <!--                    <includes>-->
                    <!--                        <include>top/testeru/group/*_Test.class</include>-->
                    <!--                    </includes>-->
                    <!--                    <excludes>-->
                    <!--                        <exclude>com/testeru/suites/cases2/*Test.class</exclude>-->
                    <!--                        <exclude>*Suite*Test</exclude>-->
                    <!--                    </excludes>-->
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit.jupiter.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                        <version>${junit.jupiter.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.version}</version>
                <configuration>

                    <!-- 设置jre版本为 11 -->
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <!-- 设置编码为 UTF-8 -->
                    <encoding>${maven.compiler.encoding}</encoding>
                </configuration>
            </plugin>

        </plugins>
    </build>
</project>

2.创建项目

  • 创建 Maven 项目
  • File->New->Project
  • 按照下图信息进行创建,根据自己的版本进行修改
  • File->Settings 点击
  • 1.打开后在搜索框中输入 java 回车
  • 2.找到 Build, Execution, Deployment,点击列表中的 Complier 点击 Java Complier
  • 3.检查 model 中版本是否匹配
  • 4.点击 Javac Options 下方的 model 的加号添加 Model
  • 5.检查无误后点击 OK 保存

3.创建测试类

  • 在 src->test->java 右键创建测试类
  • 输入类名 注意类名要以 Test 结尾 这样才可以被识别为测试文件 输入后回车进行创建

4.编写测试代码

//导入Test模块
import org.junit.jupiter.api.Test;

public class FirstJUnitTest {
    //测试方法前需要添加Test注解才可以被识别为测试用例
    @Test
    void first(){

        System.out.print("第一个测试用例");
    }
    @Test
    void second(){
        System.out.print("第二个测试用例");
    }
}

5.运行测试脚本

运行第一个测试脚本(IDE)
  • 单一方法右侧的运行键是运行单个测试用例
  • 点击测试类旁的运行执行当前测试类用的所有测试用例
运行第一个测试脚本(mvn 命令)
  • 软件下方打开命令行(终端)
  • 在当前模块下输入
# 执行项目路径下的所有测试用例
mvn test

  • 执行结果

总结

  • JUnit 5 由三个子项目组成:JUnit PlatformJUnit JupiterJUnit Vintage
  • 创建测试类时要保证测试类以 Test 结尾。
  • 测试方法前需要添加 Test 注解才可以被识别为测试用例。
  • 使用 mvn 命令执行测试用例前,首先保证安装两个对应的 plugin,其次要在对应 module 路径下执行 mvn test 。