目录
一.了解单元测试
所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。
我们想想,咱们之前是怎么进行测试的呢?
比如说我们写了一个学生管理系统,有添加学生、修改学生、删除学生、查询学生等这些功能。要对这些功能这几个功能进行测试,我们是在main方法中编写代码来测试的。
1.1mian方法测试中的缺点
但是在main方法中写测试代码有如下的几个问题,如下图所示:
1.2使用Junit测试框架的优点
为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,给开发者使用。
Junit是第三方公司开源出来的,用于对代码进行单元测试的工具(IDEA已经集成了junit框架)。相比于在main方法中测试有如下几个优点。
二.Junit单元测试快速入门
2.1测试代码演示
接下来,写一个测试类,测试StringUtil工具类中的方法能否正常使用。
public class TestJunit {
@Test
public void info(){
System.out.println("info");
}
}
2.2 Junit单元测试注意事项
-
独立性:每个测试方法都应该是相互独立的,彼此之间不会互相影响。避免在一个测试方法中依赖另一个测试方法的状态。
-
命名规范:好的命名习惯可以提高测试用例的可读性。使用清晰、描述性的命名来表示测试方法的意图和所测试的功能。
-
覆盖率:尽量覆盖被测试代码的各个分支和边界情况,以确保测试的全面性。检查测试覆盖率报告,确保每个方法和语句都得到了正确的测试。
-
断言选择:选择适当的断言方式来验证代码的行为。使用合适的断言方法(如
assertEquals()
、assertTrue()
等)比较实际输出和预期输出,以确保测试的准确性。 -
测试异常:对于可能抛出异常的代码,确保编写异常测试用例,以验证异常的捕获和处理逻辑是否正确。
-
测试数据管理:使用不同的测试数据,包括边界情况和特殊情况,以验证代码在不同输入条件下的正确性和可靠性。
-
测试性能:虽然 JUnit 主要针对功能测试,但有时也可以在单元测试中关注代码的性能。确保代码在一定压力下仍能正常工作,不会出现性能问题。
-
测试顺序:不要依赖于测试方法的执行顺序。每个测试方法应该是独立执行并产生一致的结果。避免在测试方法之间建立依赖关系。
-
测试资源管理:如果测试方法需要使用到特定的资源(如文件、数据库连接等),在测试前后进行资源的正确初始化和清理操作,以保证独立性和可重复性。
三.深入学习Junit单元测试
3.1单元测试断言
所谓断言:意思是程序员可以预测程序的运行结果,检查程序的运行结果是否与预期一致。
先准备一个类,假设写了一个StringUtil工具类,代码如下
public static int getMaxIndex(String data){
if(data == null){
return -1;
}
return data.length();
}
接下来,我们在StringUtilTest类中写一个测试方法
```java
public class StringUtilTest{
@Test
public void testGetMaxIndex(){
int index1 = StringUtil.getMaxIndex(null);
System.out.println(index1);
int index2 = StringUtil.getMaxIndex("admin");
System.out.println(index2);
//断言机制:预测index2的结果
Assert.assertEquals("方法内部有Bug",4,index2);
}
}
```
运行测试方
运行测试方法,结果如下图所示,表示我们预期值与实际值不一致
3.2Junit框架的常用注解
除了@Test注解,还有一些其他的注解,我们要知道其他注解标记的方法什么时候执行,以及其他注解在什么场景下可以使用。
代码演示:
@Test
public void info1(){
System.out.println("info");
}
@After
public void a(){
System.out.println("4.affter");
}
@Before
public void b(){
System.out.println("5.beffer");
}
@BeforeClass
public static void ac(){
System.out.println("acccc");
}
@AfterClass
public static void op(){
System.out.println("dddddddddd");
}
执行上面的测试类,结果如下图所示,观察执行结果特点如下
1.被@BeforeClass标记的方法,执行在所有方法之前
2.被@AfterCalss标记的方法,执行在所有方法之后
3.被@Before标记的方法,执行在每一个@Test方法之前
4.被@After标记的方法,执行在每一个@Test方法之后
最后,我们再补充一点。前面的注解是基于Junit4版本的,再Junit5版本中对注解作了更新,但是作用是一样的。