目录
[1 测试用例](#1 测试用例)
[九.JUnit 4 与 JUnit 5 的区别](#九.JUnit 4 与 JUnit 5 的区别)
一.概述
JUnit 是一个用于 Java 语言的单元测试框架,它在软件开发中被广泛用于编写和运行可重复的测试代码。
二.作用
JUnit 主要用于单元测试,即对程序中的最小可测试部分(通常是方法)进行测试。它有如下作用:
- **验证代码的正确性**: 通过编写测试用例,确保代码的功能符合预期。
- **提高代码质量**: 通过测试发现潜在的错误和漏洞。
- **支持敏捷开发**: 在持续集成和持续交付(CI/CD)中,JUnit 测试可以快速反馈代码问题,帮助团队快速迭代。
**- **降低维护成本**:**当代码修改后,通过运行测试用例可以快速发现是否引入了新的问题。
三.版本
JUnit 有多个版本,目前最常用的是 JUnit 4 和 JUnit 5:
- **JUnit 4**: 广泛使用注解(如`@Test`、`@Before`、`@After`等),是 Java 开发中常用的版本。
**- **JUnit 5**:**是 JUnit 的最新版本,引入了新的注解和扩展机制,提供了更好的模块化支持和更灵活的测试生命周期管理。
四.优势
- **简单易用**: 提供了丰富的注解和断言方法,易于上手。
- **集成性强**: 与大多数 Java IDE 和构建工具(如 Maven、Gradle)无缝集成。
**- **可扩展性**:**支持自定义扩展,可以满足复杂的测试需求。
五.局限性
- **仅支持单元测试**: 对于集成测试和端到端测试,需要结合其他工具(如 TestNG 或 Selenium)。
- **学习曲线**:虽然简单,但对于初学者来说,理解测试生命周期和断言机制可能需要一些时间。
六.发展方向
JUnit 5 是目前的主要发展方向,它将继续优化测试生命周期管理、扩展机制和模块化支持。同时,JUnit 也在不断与其他测试工具和框架(如 Mockito、Spring Test)进行更紧密的集成。并且, JUnit 是 Java 开发中不可或缺的工具之一,通过合理使用 JUnit,可以显著提高代码质量和开发效率。
七.核心组件
1.测试用例
测试用例是 JUnit 的基本单元,通常是一个 Java 类,继承自`TestCase`(JUnit 3)或使用注解(JUnit 4 和 JUnit 5)。
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calc = new Calculator();
assertEquals(5, calc.add(2, 3));
}
}
2.断言(Assertions)
断言用于验证测试结果是否符合预期。JUnit 提供了多种断言方法:
-
`assertEquals(expected, actual)`:验证实际值是否等于预期值。
-
`assertTrue(condition)`:验证条件是否为真。
-
`assertNotNull(object)`:验证对象是否不为`null`。
-
`assertThrows`(JUnit 5):验证是否抛出了预期的异常。
3.测试生命周期
JUnit 提供了测试生命周期的注解,用于在测试前后执行特定的代码:
- **JUnit 4**
-
`@Before`:在每个测试方法之前执行。
-
`@After`:在每个测试方法之后执行。
-
`@BeforeClass`:在所有测试方法之前执行一次。
-
`@AfterClass`:在所有测试方法之后执行一次。
- **JUnit 5** -
`@BeforeEach`:在每个测试方法之前执行。
-
`@AfterEach`:在每个测试方法之后执行。
-
`@BeforeAll`:在所有测试方法之前执行一次。
-
`@AfterAll`:在所有测试方法之后执行一次。
4.测试运行器
JUnit 使用测试运行器来执行测试用例。常用的运行器包括:
-
`JUnitCore`:用于命令行运行测试。
-
IDE 内置的测试运行器(如 IntelliJ IDEA 或 Eclipse):方便开发者在开发环境中直接运行测试。
八.简单示例
JUnit 4 示例:
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest {
private Calculator calc;
@Before
public void setUp() {
calc = new Calculator();
}
@Test
public void testAdd() {
assertEquals(5, calc.add(2, 3));
}
@Test
public void testSubtract() {
assertEquals(1, calc.subtract(3, 2));
}
}
JUnit 5 示例:
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
private Calculator calc;
@BeforeEach
public void setUp() {
calc = new Calculator();
}
@Test
public void testAdd() {
assertEquals(5, calc.add(2, 3));
}
@Test
public void testSubtract() {
assertEquals(1, calc.subtract(3, 2));
}
}
九.JUnit 4 与 JUnit 5 的区别
- **注解变化**: JUnit 5 引入了新的注解(如`@DisplayName`、`@Nested`等),提供了更灵活的测试组织方式。
- **扩展机制**: JUnit 5 提供了更强大的扩展机制,支持自定义扩展。
- **模块化支持**: JUnit 5 更好地支持 Java 9 的模块化特性。
**- **异常处理**:**JUnit 5 提供了更简洁的异常测试方法(如`assertThrows`)。
十.idea项目实战
1.在idea中创建Java项目,注意选择"Maven"

2.将"pom.xml"文件内容替换成下面内容
<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>com.example</groupId>
<artifactId>simple-junit-project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version>
</plugin>
</plugins>
</build>
</project>
3.重新加载Maven项目,直到不再报错
4.按下图创建对应项目和Java类文件

5.两个Java类文件代码内容如下,替换即可
java
package com.example;
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
java
package com.example;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void testAdd() {
assertEquals(5, calculator.add(2, 3), "2 + 3 should equal 5");
}
@Test
void testSubtract() {
assertEquals(1, calculator.subtract(3, 2), "3 - 2 should equal 1");
}
}
6.运行测试类,结果如下
7.代码解释如下
对于pom.xml
-
<modelVersion>
:定义了 POM 文件的版本,通常是4.0.0
。 -
<groupId>
:定义了项目的唯一标识,通常是反向域名形式,例如com.example
。 -
<artifactId>
:定义了项目的名称,例如simple-junit-project
。 -
<version>
:定义了项目的版本号,例如1.0-SNAPSHOT
。 -
<properties>
:定义了一些常用的属性,例如 Java 编译版本和字符编码。 -
<dependencies>
:定义了项目依赖的库。这里我们添加了 JUnit 5 的依赖,用于编写和运行单元测试。-
junit-jupiter-api
:JUnit 5 的核心 API,用于编写测试用例。 -
junit-jupiter-engine
:JUnit 5 的测试引擎,用于运行测试用例。
-
-
<build>
:定义了项目的构建配置。maven-surefire-plugin
:用于运行测试的 Maven 插件。
对于Calculator
类
-
add
方法 :接收两个整数参数a
和b
,返回它们的和。 -
subtract
方法 :接收两个整数参数a
和b
,返回它们的差。
对于CalculatorTest
类
-
@BeforeEach
注解 :setUp
方法会在每个测试方法运行之前被调用。这里用于初始化Calculator
对象。 -
@Test
注解:标记这是一个测试方法。 -
testAdd
方法:-
调用
calculator.add(2, 3)
,计算结果。 -
使用
assertEquals
断言方法,验证计算结果是否等于预期值5
。 -
第三个参数是断言失败时的错误信息。
-
-
testSubtract
方法:-
调用
calculator.subtract(3, 2)
,计算结果。 -
使用
assertEquals
断言方法,验证计算结果是否等于预期值1
。
-