• 如何有效保证Java代码单元测试覆盖率


    背景介绍

    我们在实际项目开发过程中,不同level的童鞋由于专业技能的层次不同,导致在参与实际开发的业务代码中经常会出现各种bug,项目管理中好的pm或许会给充足的时间来让开发童鞋们定位修复这些bug,也有各种客观原因的PM不会在项目中预留这些时间,往往就需要开发自己通过加班来修复赶上项目整体的进度
    基于以上背景,那我们有没有一种更有效的方式来保证业务代码的质量呢?
    本人推荐的是通过严格的一套单元测试体系来保证我们的代码质量,当然除此之外的手段比如code review、开发规范等等不在本文介绍。

    单元测试体系搭建

    编写单元测试代码

    针对我们的所有业务代码的类进行一对一时的单元测试覆盖,如下图所示:

    1. 业务代码:
    @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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 对应的单元测试代码如下:
    
    @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());
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    选用单元测试框架

    本人推荐用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综合评估而定。

  • 相关阅读:
    day01
    【每日一题】744. 寻找比目标字母大的最小字母
    【单调栈】503. 下一个更大元素 II
    基于问题驱动法的计算机组成原理教学研究
    低开开发笔记(八): 低代码编辑器实现撤销回退(命令模式,防抖处理)
    【C++】map&set利用红黑树进行简单封装
    error: reference to ‘byte‘ is ambiguous使用QtCharts报的错误
    哈希(Hash) - 开散列/闭散列
    SSCI及SCI撰写|立足于审稿进行论文修改
    学习-Java输入输出之OutputStream类之字节数据输出
  • 原文地址:https://blog.csdn.net/AiMaiShanHuHai/article/details/126483614