JUnit 5的框架介绍

下面我来用比较口语化的方式和你聊聊JUnit 5的用法,从导包、简单Demo,到注意事项和一些小技巧,咱们一步步说清楚~


1. 导入依赖(导包)

首先,如果你是用Maven构建项目,就需要在pom.xml里加上JUnit 5的依赖。基本上只需要添加下面这段配置就行(记得scope设为test哦):

xml 复制代码
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-engine</artifactId>
  <version>5.8.2</version>
  <scope>test</scope>
</dependency>

这样Maven就会自动下载JUnit 5相关的jar包。除了这个,如果你需要参数化测试,还可以加上junit-jupiter-params依赖~

citeturn0search2


2. 编写Demo

咱们写个简单的单元测试来验证一个方法。假设你有个类叫HelloWorld,它有个方法sayHello()返回一个字符串。你可以这么写测试类:

java 复制代码
import org.junit.jupiter.api.*;

class HelloWorldTest {

    @BeforeAll
    static void initAll() {
        System.out.println("所有测试开始前的初始化...");
    }

    @BeforeEach
    void init() {
        System.out.println("每个测试前的准备工作...");
    }

    @DisplayName("测试 sayHello 方法")
    @Test
    void testSayHello() {
        HelloWorld hw = new HelloWorld();
        String result = hw.sayHello();
        // 使用断言来检查返回结果是否符合预期
        Assertions.assertEquals("Hello, world!", result);
    }

    @AfterEach
    void tearDown() {
        System.out.println("每个测试结束后的清理工作...");
    }

    @AfterAll
    static void tearDownAll() {
        System.out.println("所有测试结束后的清理工作...");
    }
}

这里几个注解的意思简单说一下:

  • @BeforeAll@AfterAll:分别在所有测试开始前和结束后只运行一次(记得它们必须是静态方法)。
  • @BeforeEach@AfterEach:每个测试方法执行前后各执行一次。
  • @DisplayName:可以给测试类或方法自定义一个更友好的名字,这样在测试报告里看起来更清晰。
  • @Test :标记一个方法为测试方法。
    citeturn0search0
    在JUnit 5里,有个好处就是测试方法和类不用非得写成public,这和之前JUnit 4有点区别,写成包级私有也OK。

3. 注意事项

在使用JUnit 5时,有几点小细节需要注意:

  • 测试方法必须是无参且返回void。如果有参数了(除非你用参数化测试),JUnit 5会报错。
  • @BeforeAll 和 @AfterAll方法一定要是static,否则运行时会出错。
  • 测试方法不需要public修饰符 ,包级可见就够了。这点可以减少一些不必要的暴露~
    citeturn0search5
  • 如果你不想某个测试执行,可以加上**@Disabled**注解,这样JUnit在跑测试时就会跳过它。
  • 尽量写有意义的断言 。使用Assertions提供的断言方法(比如assertEqualsassertTrue等),而不要仅仅依赖打印信息来判断测试结果。

4. 使用技巧

除了基本用法之外,还有一些小技巧可以帮助你写出更好、更高效的测试代码:

  • 参数化测试 :用@ParameterizedTest配合@ValueSource@CsvSource等可以让同一个测试方法跑多个数据组合。例如:

    java 复制代码
    @ParameterizedTest
    @ValueSource(ints = {2, 4, 6})
    void testEvenNumbers(int num) {
        Assertions.assertEquals(0, num % 2);
    }

    这样就不用写多个类似的方法啦。

    citeturn0search8

  • 重复测试 :如果需要重复执行某个测试方法,可以用@RepeatedTest。例如:

    java 复制代码
    @RepeatedTest(3)
    void repeatedTest() {
        System.out.println("这个测试会执行三次");
    }
  • 分组断言 :使用assertAll可以把多个断言放在一块执行,这样即使有个别断言失败,也能把所有失败信息都显示出来,方便调试。例如:

    java 复制代码
    @Test
    void groupAssertions() {
        int[] nums = {0, 1, 2, 3};
        Assertions.assertAll("检查数组各项",
            () -> Assertions.assertEquals(0, nums[0]),
            () -> Assertions.assertEquals(1, nums[1]),
            () -> Assertions.assertEquals(2, nums[2])
        );
    }
  • 动态测试 :JUnit 5还支持动态生成测试案例,通过@TestFactory返回一组DynamicTest,这对于测试一些运行时数据生成的场景非常有用。

  • 使用Lambda表达式 :在断言消息里使用Lambda表达式可以延迟构造消息,有助于性能优化,尤其是当构造断言信息比较耗时时。

    citeturn0search4


小结

简单来说,JUnit 5让单元测试变得更灵活、更现代化。咱们只需要:

  • 在项目中导入JUnit 5依赖(比如用Maven配置)。
  • 编写测试类,利用注解(@Test、@BeforeAll、@DisplayName等)来组织测试代码。
  • 注意测试方法的格式(无参、void、非public也OK)。
  • 掌握参数化测试、重复测试、分组断言等技巧,让测试代码更高效、更易读。

这样你就能写出既稳健又便于维护的单元测试啦!希望这些讲解对你有帮助~


参考资料:

citeturn0search0

citeturn0search8

citeturn0search9

相关推荐
慕容静漪2 小时前
如何本地安装Python Flask并结合内网穿透实现远程开发
开发语言·后端·golang
ErizJ3 小时前
Golang|锁相关
开发语言·后端·golang
烛阴3 小时前
手把手教你搭建 Express 日志系统,告别线上事故!
javascript·后端·express
良许Linux3 小时前
请问做嵌入式开发C语言应该学到什么水平?
后端
Pitayafruit3 小时前
SpringBoot整合Flowable【08】- 前后端如何交互
spring boot·后端·workflow
小丁爱养花4 小时前
驾驭 Linux 云: JavaWeb 项目安全部署
java·linux·运维·服务器·spring boot·后端·spring
uhakadotcom4 小时前
Amazon GameLift 入门指南:六大核心组件详解与实用示例
后端·面试·github
小杨4045 小时前
springboot框架项目实践应用十九(nacos配置中心)
spring boot·后端·spring cloud
终身学习基地6 小时前
第二篇:go包管理
开发语言·后端·golang