单元测试
什么是单元测试 ?
单元测试通常是指对一个函数或方法测试。单元测试的目的是验证每个单元的行为是否符合预期,并且在修改代码时能够快速检测到任何潜在的问题。通过编写测试用例,我们可以验证这些模块在特定输入下是否产生正确的输出。单元测试的目的是确保每个模块在各种情况下都能正常运行。
写单元测试的好处
可以带来以下几个好处:
- 提高代码质量:单元测试可以我们提前的发现代码中的潜在问题,例如边界条件、异常情况等,从而减少出错的概率。
- 提高代码可维护性:单元测试可以帮助开发人员理解代码的功能和实现细节,从而更容易维护和修改代码。
- 提高代码可靠性:修改代码后,可以通过单元测试可以帮助开发人员验证代码的正确性,从而提高代码的可靠性。
写单元测试是一种良好的软件开发实践,可以提高代码质量、可维护性和可靠性,同时也可以提高开发效率和支持持续集成和持续交付。
单元测试入门
上手单元测试,通常同时从静态测试(Static Test)开始,因为它简单,好理解,静态测试(Static Test)是指在编写测试用例时,我们提前定义好所有的测试方法和测试数据。这些测试方法和数据在编译时就已经确定,不会在运行时发生变化。Junit 中的静态测试通常的常规注解,如 @Test、@Before、@After 等。先来看看一组简单的静态测试示例。
首先,确保你的 pom.xml
文件包含 JUnit 的依赖:
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.0</version>
<scope>test</scope>
</dependency>
</dependencies>
然后,创建一个简单的计算器类,通常这里替换为你实际要测试的业务类:
public class SimpleCalculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
然后在 /test
的相同目录下创建对应的测试类
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class SimpleCalculatorTest {
// 在所有测试方法执行前,仅执行一次。这个方法需要是静态的。
@BeforeAll
static void setup() {
System.out.println("BeforeAll - 初始化共享资源,例如数据库连接");
}
// 在所有测试方法执行后,仅执行一次。这个方法需要是静态的。
@AfterAll
static void tearDown() {
System.out.println("AfterAll - 清理共享资源,例如关闭数据库连接");
}
// 在每个测试方法执行前,都会执行一次。用于设置测试方法所需的初始状态。
@BeforeEach
void init() {
System.out.println("BeforeEach - 初始化测试实例所需的数据");
}
// 在每个测试方法执行后,都会执行一次。用于清理测试方法使用的资源。
@AfterEach
void cleanup() {
System.out.println("AfterEach - 清理测试实例所用到的资源");
}
// 标注一个测试方法,用于测试某个功能。
@Test
void testAddition() {
System.out.println("Test - 测试加法功能");
SimpleCalculator calculator = new SimpleCalculator();
assertEquals(5, calculator.add(2, 3), "2 + 3 应该等于 5");
}
// 再添加一个测试方法
@Test
void testSubtraction() {
System.out.println("Test - 测试减法功能");
SimpleCalculator calculator = new SimpleCalculator();
assertEquals(1, calculator.subtract(3, 2), "3 - 2 应该等于 1");
}
}
以上程序,可以看到 Junit 常用注解使用说明:
- @BeforeAll:在所有测试方法执行前,仅执行一次。这个方法需要是静态的
- @AfterAll:在所有测试方法执行后,仅执行一次。这个方法需要是静态的
- @BeforeEach:在每个测试方法执行前,都会执行一次。用于设置测试方法所需的初始状态
- &