“任何人的代码,不可能没有Bug!”
我们平常所写的代码,无论是在开发环境,还是在测试环境,亦或者是线上的生产环境,看似运行的毫无问题,也能满足公司的业务、客户的需求,但要我说,这样的代码依然会存在Bug!只不过没有达到触发条件罢了。
作为一名合格的类人猿(程序猿),我们有义务和责任在开发的过程中避免一些非常明显的低级Bug!于是乎,就有了单元测试的概念!
那么我们在使用SpringBoot的过程中,如何快速的进行单元测试呢?下面我会给大家演示一个实例。
1、老规矩,先在pom.xml文件中添加测试依赖,如下:
<dependencies>
<!-- web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
在这里需要特别说明一下,为了简化代码(如实体类中的getter/setter方法等),我引入了lombok插件,其具体的使用方法大家自行查阅,很简单。
2、创建用于测试的实体类对象User,如下:
@Data //lombok插件主键,简化实体类的getter/setter等方法
public class User {
private String userName;
private Integer age;
}
3、创建用于测试的UserService,里面只有一个方面,模拟通过用户名查询用户信息,如下:
@Service
public class UserService {
/**
* 模拟根据用户名获取User对象
* @param userName
* @return
*/
public User getUser(String userName){
if(userName != null && !userName.equals("")){
if("笑笑是一个码农".equals(userName)){
User user = new User();
user.setUserName("笑笑是一个码农");
user.setAge(18);
return user;
}else {
return null;
}
}
return null;
}
}
这个业务很简单,就是根据用户名查询用户信息,为了演示方便,在这里我就不去查询数据库了,假设已存在一个用户名为“笑笑是一个码农”的用户,如果传入的参数匹配,返回该用户信息,不匹配则返回null。
4、创建UserService的测试类,在IDEA中我们使用ctrl+shift+t快捷键,会跳出如下图所示页面:
我们点击Create New Test,进入如下页面:
点击ok,我们的工程最终目录如下:
可以看到,IDEA已经自动帮我创建好了测试类,并且测试类中也给我们创建好了要测试的方法,如下:
public class UserServiceTest {
@Test
public void getUser() {
}
}
但仅仅是这样,还不够我们开始测试,我们还需要添加一些必要的注解,以及注入我们需要测试的UserService,如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService; //注入我们要测试的类
@Test
public void getUser() {
//调用要测试的方法
User user = userService.getUser("aaa");
//由于我们非常确定不存在“aaa的用户,所以getUser的返回值一定为null”
//Assert为junit提供用于测试的类(断言),其里面有很多方法来判断被测方法实际的返回结果和预期的返回结果(正确的结果)是否一致
Assert.assertNull(user);
}
}
这样我们就可以运行我们的测试类,关注IDEA左下方,如图:
可以看到,我们的测试用例运行成功!
可是仅仅是这样,我们也看不出单元测试的意义何在。
我们回到getUser方法,假设由于我们在编码的时候疏忽大意,把所有的返回值都写成了null,如下:
我们并不知道我们写错了,单元测试时,当我们查询“笑笑是一个码农”的用户信息时,我们很确定一定会返回一个User对象,如下:
@Test
public void getUser() {
//调用要测试的方法
User user = userService.getUser("笑笑是一个码农");
//由于我们非常确定不存在“aaa的用户,所以getUser的返回值一定为null”
//Assert为junit提供用于测试的类(断言),其里面有很多方法来判断被测方法实际的返回结果和预期的返回结果(正确的结果)是否一致
//预期返回值user一定不null
Assert.assertNotNull(user);
}
显然,我们的测试用例运行肯定是不通过的,如下:
我们所预期的结果与实际的运行结果不一致,这时候,在我们开发过程中就可以去排查代码,避免这种非常低级的错误,提高我们编写的代码质量。