Maven 单元测试笔记#
1. 单元测试概述#
- 定义:针对最小的功能单元(方法),编写测试代码对其正确性进行测试。
- 目的:检验软件基本组成单位的正确性。
- 测试人员:开发人员。
- 测试类型:白盒测试(清楚软件内部结构、代码逻辑,用于验证代码、逻辑正确性)。
2. JUnit 单元测试框架#
2.1 JUnit 简介#
- 最流行的 Java 测试框架之一。
- 提供功能方便程序进行单元测试(由第三方公司提供)。
2.2 JUnit vs main 方法测试#
| 对比项 | main 方法测试 | JUnit 单元测试 |
|---|
| 代码维护 | 测试代码与源代码未分开,难维护 | 测试代码与源代码分开,便于维护 |
| 测试影响 | 一个方法测试失败,影响后面方法 | 一个测试方法执行失败,不会影响其它测试方法 |
| 自动化 | 无法自动化测试,无法得到测试报告 | 可根据需要进行自动化测试,可自动生成测试报告 |
2.3 使用步骤#
- 在
pom.xml 中引入 JUnit 依赖:1<dependency>
2 <groupId>org.junit.jupiter</groupId>
3 <artifactId>junit-jupiter</artifactId>
4 <version>5.9.1</version>
5</dependency>
- 在
test/java 目录下创建测试类,并编写对应的测试方法。 - 在测试方法上声明
@Test 注解。 - 运行单元测试(测试通过:绿色;测试失败:红色)。
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 目录中编写单元测试?
5. 依赖范围(Scope)#
5.1 作用#
- 默认情况下,依赖的 jar 包可在任何地方使用。
- 通过
<scope>...</scope> 设置其作用范围。
5.2 常见取值#
| scope 值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
|---|
compile(默认) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc 驱动 |
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 范围,因为仅在测试时需要。