SpringBoot实战:整合jUnit测试框架
一、前言
开发项目单元测试必不可少,而 jUnit 也是 java 中非常优秀的测试框架,现在简单实战总结一下 SpringBoot 如何整合 jUnit 测试框架。
二、添加依赖
在 SpringBoot 中使用 jUnit 单元测试前,需要先添加如下 maven 依赖,其中 <scope>test</scope> 表示该依赖仅用于测试阶段。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
三、简单业务代码
为了测试需要,我们先创建一个简单的业务代码,方便我们后续测试使用。
服务接口类:
public interface UpmsUserService {
String getName(Long userId);
int count();
}
服务实现类:
@Service("upmsUserService")
public class UpmsUserServiceImpl implements UpmsUserService {
@Override
public String getName(Long userId) {
return "test"
}
@Override
public int count() {
return 1;
}
}
按照以上的逻辑,getName 方法返回的结果是“test”,count 方法返回的是 1,我们现在需要测试一下是否正确。
四、创建测试类
创建一个测试类很简单,测试类只需要在 src 地下的 test 中编写,一般来说,test 的目录结果应该和 main 的结果保持一致,这样便于以后做测试管理。
这里我们使用 IDEA 来快速创建一个单元测试。
-
打开需要测试的业务类,单击右键选择 Go To -> Test,或者使用快捷键 Ctrl+Shift+T.
-
没有创建测试类时,点击 Create New Test。如果已经创建,直接点击跳转就可以了。
-
填写测试类信息,这里简单说明一下
- Testing libray: 选择测试依赖包。这里我们选择 jUnit 的版本。
- Class name: 测试类名,测试类类名规则一般为:业务类类名+Test。
- Superclass:继承的父类。
- Destination package:类的包路径,这个包在 test 目录下,包路径一般与业务类目录结构相似(接口类无需,因为接口无需测试)
- Generate:添加@Before 和@After 方法。
- Member:勾选需要测试的方法。
4.确认后,业务类的测试类就创建好了。需要在类名上添加两行注解。并在需要测试的方法中添加@Test 注解。
/**
* SpringJUnit4ClassRunner.class:让 junit 与 spring 环境进行整合
*
* SpringBootTest(classes={App.class}) 的作用
* 1,当前类为 springBoot 的测试类
* 2,加载 SpringBoot 启动类。
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {App.class})
public class UpmsUserServiceTest {
//spring注入需要测试的类,无需我们自己创建
@Autowired
public UpmsUserService upmsUserService;
@Test
public String getName() {
String name = upmsUserService.getName(1L);
Assert.assertEquals("abc", name);
}
@Test
public int count() {
int resule = upmsUserService.count();
Assert.assertEquals(1, resule);
}
}
五、运行测试类
1.单个方法或类的测试
单个测试只需光标选中需要运行的方法,单击右键“Run xxxMember()”即可,运行测试类也是类似的方法:
当然,IDEA 做的更只能话,在测试类或方法的前面添加了一个运行图标,这个运行起来就更加方便了。
2.运行整个项目的测试方法
如果项目上线了,需要对真个项目运行一下所有的单元测试,那该怎么处理呢。这个提供两种方式。
2.1.使用 IDEA 运行整个项目的测试类
选择左边整个项目的根目录,单击右键运行“Run All Test”
运行结果如下:
2.2.使用 maven 命令运行整个项目的测试类
也可以直接使用 maven 命令来运行整个项目(前提是你已经安装了 maven),其实 IDEA 的本质也是如此,开发 cmd 窗口,调整到项目根目录下,执行如下指令:
mvn test
通过运行后,我们可以看到 maven 会提供一份测试报告。包含总测试方法数,失败总数,错误总数和跳过总数。
以上两种方法都很实用,IDEA 更方便、更快捷,适用于开发阶段,Maven 可以在不同平台运行,适用于测试阶段和项目预演阶段。
3. 数据库测试
在测试数据时,我们常常需要对数据库进行操作,特别是在做增删改操作的时候,但是我们有不希望这些数据污染数据,有没有办法能让操作数据的测试不提交事务呢?
可以实现的,只需要添加给测试类上添加 @Transactional
即可:
@Test
@Transaction
public int update() {
UpmsUserDo uesr = new UpmsUserDo();
user.setUserId(1L);
user.setUserName("abc");
user.setAge(20);
int resule = upmsUserService.update(user);
Assert.assertEquals(1, resule);
}
执行后我们发现,执行没有显示方法是测试通过的,但是数据库的数据不会被更新。
六、注意事项与规范
SpringBoot 中整合 jUnit 还是非常容易的,这里简单说一下测试时遇到的一些问题。
- 测试类和测试方法的访问权限必须是 public。不然运行时会报错。
- 测试类类名命名规范:测试类类名=被测试类类名+“Test”
- 测试方法名命名规范:测试方法名=被测试方法名 或 测试方法名=被测试方法名+ “Test”
- 测试方法中不建议用人肉测试方法,即打印日志的方式来人眼观察是否结果正确,正确方式应该使用 Assert 等测试类专用方法。
- 测试案例不是一成不变的,会随着项目的进行不断更新。
好了,以上是个人的一些小小的经验总结,如果你觉的对你有帮助的话,可以关注我查看更多 SpringBoot 相关文章!