单元测试
- 单元测试是针对最小功能单元编写的测试代码
- Java程序最小的功能单元是方法
- 单元测试就是针对单个Java方法的测试
为什么需要单元测试
首先了解一下测试驱动开发:测试驱动开发(Test Driven Development)简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。
传统测试:
假如我们现在需要测试一个计算类Calculate,那么就需要写一个这样的测试代码。
Calculate
public class Calculate {
public int plus(int a, int b){
return a+b;
}
}
CalculateTest
public class CalculateTest {
public static void main(String[] args) {
Calculate calculate = new Calculate();
if(calculate.plus(1,2)==3){
System.out.println("success");
}else {
System.out.println("error");
}
}
}
运行结果:success
虽然可以测试出结果,但是不难看出,当类方法多的时候,编写测试类的就会很麻烦,工作量很大,并且要测试多个类的时候,由于只有一个main方法,此时测试类的逻辑就会很混乱,在开发时不能专注于测试的编写。单元测试应运而生。其中运用最广泛的就是JUnit。
单元测试的优势:
- 确保单个方法运行正常
- 如果修改了方法代码,只需要确保对应的单元测试通过
- 测试代码本身就是示例代码
- 可以自动化运行所有测试并获得报告
JUnit
JUnit是一个开源的Java语言的单元测试框架
特点:
- 可以使用断言测试期望结果
- 方便组织和运行测试
- 方便查看结果
- 可以集成到IDE或Maven
组成
项目 | 解释 |
---|---|
TestCase | 表示一个测试 |
TestSuite | 表示一组测试,包含一组TestCase |
TestFixture | 表示测试环境 |
TestResult | 测试结果 |
TestRunner | 运行测试 |
TestListener | 监听测试过程,收集数据 |
Assert | 断言,用于判断结果是否正确 |
实践
一般来说,建立两个文件夹,一个为main文件夹,一个是test文件夹,main文件夹中用来写业务代码,test中写测试代码,建立好两个文件夹后,默认是普通文件夹,此时需要右键文件夹将他修改为源码或是测试文件夹
之后可以使用jar包导入Junit或者在项目文件夹中添加pom.xml文件使用maven导入
<?xml version="1.0" encoding="UTF-8"?>
<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>JUnit_test</groupId>
<artifactId>JUnit_test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
将之前的测试类改写
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class CalculateTest {
@Test
public void testPlus(){
assertEquals(3,new Calculate().plus(1,2));
assertEquals(4,new Calculate().plus(1,2));
}
}
我们写了一组正确的断言和错误的断言,运行结果如下:
常见断言: