Maven 单元测试笔记

1. 单元测试概述

  • 定义:针对最小的功能单元(方法),编写测试代码对其正确性进行测试。
  • 目的:检验软件基本组成单位的正确性。
  • 测试人员:开发人员。
  • 测试类型:白盒测试(清楚软件内部结构、代码逻辑,用于验证代码、逻辑正确性)。

2. JUnit 单元测试框架

2.1 JUnit 简介

  • 最流行的 Java 测试框架之一。
  • 提供功能方便程序进行单元测试(由第三方公司提供)。

2.2 JUnit vs main 方法测试

对比项main 方法测试JUnit 单元测试
代码维护测试代码与源代码未分开,难维护测试代码与源代码分开,便于维护
测试影响一个方法测试失败,影响后面方法一个测试方法执行失败,不会影响其它测试方法
自动化无法自动化测试,无法得到测试报告可根据需要进行自动化测试,可自动生成测试报告

2.3 使用步骤

  1. pom.xml 中引入 JUnit 依赖:
    1<dependency>
    2    <groupId>org.junit.jupiter</groupId>
    3    <artifactId>junit-jupiter</artifactId>
    4    <version>5.9.1</version>
    5</dependency>
    
  2. test/java 目录下创建测试类,并编写对应的测试方法。
  3. 在测试方法上声明 @Test 注解。
  4. 运行单元测试(测试通过:绿色;测试失败:红色)。

2.4 命名规范

  • 测试类命名XxxxxTest(规范)。
  • 测试方法声明:必须为 public void(规定)。

3. 断言(Assertions)

3.1 断言的作用

  • 辅助方法,用来确定被测试的方法是否按照预期效果正常工作。
  • 单元测试方法运行不报错不代表业务方法没问题,需通过断言检测结果是否符合预期。

3.2 常见断言方法

断言方法描述
Assertions.assertEquals(Object exp, Object act, String msg)检查两个值是否相等,不相等就报错。
Assertions.assertNotEquals(Object unexp, Object act, String msg)检查两个值是否不相等,相等就报错。
Assertions.assertNull(Object act, String msg)检查对象是否为 null,不为 null 就报错。
Assertions.assertNotNull(Object act, String msg)检查对象是否不为 null,为 null 就报错。
Assertions.assertTrue(boolean condition, String msg)检查条件是否为 true,不为 true 就报错。
Assertions.assertFalse(boolean condition, String msg)检查条件是否为 false,不为 false 就报错。
Assertions.assertThrows(Class expType, Executable exec, String msg)检查程序运行抛出的异常是否符合预期。

提示:最后一个参数 msg 表示错误提示信息,可以不指定(有对应的重载方法)。

4. JUnit 常见注解

注解说明备注
@Test修饰测试方法,使其成为可执行的测试方法单元测试
@ParameterizedTest参数化测试注解(单个测试运行多次,每次仅参数不同)使用后无需 @Test
@ValueSource参数化测试的参数来源,赋予测试方法参数需配合 @ParameterizedTest
@DisplayName指定测试类或方法显示的名称(默认为类名、方法名)-
@BeforeEach修饰实例方法,在每个测试方法执行前运行一次初始化资源(准备工作)
@AfterEach修饰实例方法,在每个测试方法执行后运行一次释放资源(清理工作)
@BeforeAll修饰静态方法,在所有测试方法前只执行一次初始化资源(准备工作)
@AfterAll修饰静态方法,在所有测试方法后只执行一次释放资源(清理工作)

4.1 常见问题解答

  • JUnit 测试方法能否声明形参?
    • 可以,使用参数化测试(@ParameterizedTest + @ValueSource)。
  • 如何在测试前做初始化操作?
    • 使用 @BeforeEach@BeforeAll
  • 如何在测试后释放资源?
    • 使用 @AfterEach@AfterAll
  • 是否可以在 main 目录中编写单元测试?
    • 可以,但不规范(应放在 test 目录)。

5. 依赖范围(Scope)

5.1 作用

  • 默认情况下,依赖的 jar 包可在任何地方使用。
  • 通过 <scope>...</scope> 设置其作用范围。

5.2 常见取值

scope 值主程序测试程序打包(运行)范例
compile(默认)YYYlog4j
test-Y-junit
providedYY-servlet-api
runtime-YYjdbc 驱动

5.3 示例

1<dependency>
2    <groupId>org.junit.jupiter</groupId>
3    <artifactId>junit-jupiter</artifactId>
4    <version>5.9.3</version>
5    <scope>test</scope>
6</dependency>

提示:JUnit 通常设置为 test 范围,因为仅在测试时需要。