背景介绍
我们在实际项目开发过程中,不同level的童鞋由于专业技能的层次不同,导致在参与实际开发的业务代码中经常会出现各种bug,项目管理中好的pm或许会给充足的时间来让开发童鞋们定位修复这些bug,也有各种客观原因的PM不会在项目中预留这些时间,往往就需要开发自己通过加班来修复赶上项目整体的进度
基于以上背景,那我们有没有一种更有效的方式来保证业务代码的质量呢?
本人推荐的是通过严格的一套单元测试体系来保证我们的代码质量,当然除此之外的手段比如code review、开发规范等等不在本文介绍。
单元测试体系搭建
编写单元测试代码
针对我们的所有业务代码的类进行一对一时的单元测试覆盖,如下图所示:
- 业务代码:
@RestController
@RequestMapping("/hello")
public class HelloWorldController {
@Autowired
private IHelloWorldService helloWorldService;
@GetMapping("/say")
public Result<String> sayHello(@RequestParam(value = "msg",required = false) String msg){
Result result = new Result();
result.setCode(200);
result.setData(helloWorldService.sayHello(msg));
result.setMsg("OK");
return result;
}
}
- 对应的单元测试代码如下:
@SpringBootTest
@RunWith(SpringRunner.class)
public class HelloWorldControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private IHelloWorldService helloWorldService;
@Test
public void test()throws Exception{
RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/hello/say").accept(
MediaType.APPLICATION_JSON);
MvcResult result= mockMvc.perform(requestBuilder).andReturn();
Assert.assertEquals(HttpStatus.OK.value(),result.getResponse().getStatus());
}
}
选用单元测试框架
本人推荐用Jacoco即 Code Coverage for Java的缩写或Emma,本人在idea中安装Jacoco插件按照如下图所示:
执行单元测试
修改单元测试的框架:
执行单元测试:
按照如上图所示的操作可以看到单元测试覆盖率如下图:
按照如上图所示的两步操作完毕之后,会生成如下图所示的site目录:
打开如上图所示的index.html文件可以查看网页版的单元测试覆盖率,如下图所示:
查看具体某一个类的单元测试覆盖率
如上图所示:
单元测试覆盖率主要分为如下几类:
1、代码覆盖率 (Instructions Cov.)
2、逻辑分支覆盖率(Branches Cov.)
3、判断行数覆盖率(Cxty Cov.)
4、代码行数覆盖率(Lines Cov.)
5、方法个数覆盖率(Methods Cov.)
6、类覆盖率(Classes Cov.)
Missed 所在列表示当前类型缺失的数量
总结
其实在具体项目实操过程中发现做整项目所有类的单测工作量是巨大无比的,毫不夸张的说编写单元测试的代码的工作量远远超出了实际编写业务代码的工作量,所以本人介绍的初衷只是告诉诸位技术层面如何有效保证代码质量,具体落地时因地制宜吧,根据实际项目情况技术负责人和PM综合评估而定。