「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
SpringBoot提供的单元测试功能让测试更简单方便、无需关注整个业务流程。
- 单元测试的灵魂三问
1.1 是什么
单元测试就是对项目中最小单元进行功能可行测试,Java中的最小单元即一个类、方法、代码片段。
1.2 为什么
项目开发过程中想要验证开发的模块是否实现了相应功能,如果启动整个项目进行测试,不仅速度慢耗时久,并且验证流程需要从头开始,大大增加了验证成本。
而单元测试只需要关注代码中某个单元,输入参数后执行并返回结果,验证结果的正确性,以此来快速高效的测试代码功能。
使用JUnit单元测试时,可以使用其中提供的断言来验证期望值,便于查看测试结果。
1.3 怎么用
使用IDEA新建项目时如果使用spring initialize选项构建项目,则项目创建之后便会自动携带单元测试的相关依赖spring-boot-starter-test
,项目的最基本依赖有两个,另一个是spring-boot-starter
。
如果项目中没有引入单元测试依赖,还可以手动添加引入:
1 | xml复制代码 <dependency> |
依赖引入之后,使用单元测试的条件已经具备,就可以对代码单元进行测试了,在单元测试的使用过程中,需要注意:
- 单元测试要简单明了,专心于某一项功能进行验证
- 每个单元测试独立存在,需要单独进行验证
- 针对每个功能的单元测试要覆盖成功、失败等多种情况
- 单元测试的创建
2.1 单元测试约定
SpringBoot项目中的测试类默认放于项目的src/test包中,对比src/main包中项目实际结构来创建对应测试类,测试创建常用规则:
- 测试类的包结构和项目相同,且为项目中每个类提供一个对应测试类
- 测试类一般命名为xxTest的形式,保证直观可认,并使用
@SpringBootTest
注解标注 - 测试类中的方法命名以test开头,并使用
@Test
注解标注
2.2 常用注解
SpringBoot中使用注解来完成单元测试的相关功能
- @SpringBootTest:标注一个类作为测试类,为SpringApplication创建上下文名支持SpringBoot
- @BeforeEach:在测试方法执行之前需要执行的方法
- @Test:注解标注一个方法为测试方法,注解中可以设置时间参数,代表方法测试超时时间
- @Transactional:声明事务管理
- @Rollback:设置值为true/false,指定是否数据回滚来保证测试数据不污染数据库
- 不同层的单元测试
由于SpringBoot项目多是MVC分层结构,开发过程中对不同层结构都需要实现一定的功能,可以在完成当前层功能后进行单元测试
3.1 Mapper(Dao)层
Mapper层是直接操作数据库的层级,进行单元测试时,为避免测试数据污染数据库,可以对测试方法使用@Transactional和@Rollback(vaule=true)来开启事务并回滚测试数据。
1 | java复制代码//Junit5写法 |
3.2 Service层
Service作为Mapper的上层,在Service中调用了Mapper方法来操作数据库,使用时同样只需要注入Service层的bean,然后直接调用其中功能方法即可。
1 | java复制代码//JUnit5写法 |
注意,如果Service层测试时引用了Mapper层文件并操作了数据库,为避免污染数据,也需要使用@Transactional和@Rollback注解。
3.3 Controller层
Controller层作为网络接口层,需要进行web请求测试,这就需要使用Spring测试框架提供的MockMvc对象。
执行测试方法之前,需要创建mockMvc对象来执行网络请求,可以使用@Before注解实现初始化方法
1 | java复制代码//JUnit5 |
本文转载自: 掘金