【测试基础】四、你的测试覆盖率是多少?

简介: 【测试基础】四、你的测试覆盖率是多少?

在面试过程中,遇到过面试官询问测试覆盖率的问题。


我说没统计过(完结撒花)。


1268169-20210710211933419-59658253.png


开个玩笑。


通常测试覆盖率是用来衡量测试的充分性和完整性


从广义的角度来讲,测试覆盖率主要分为两大类,一类是面向项目的需求覆盖率,另一类是更偏向技术的代码覆盖率


一、需求覆盖率


需求覆盖率,是指测试对需求的覆盖程度


通常的做法是将每一条分解后的软件需求和对应的测试建立一对多的映射关系,最终目标是保证测试可以覆盖每个需求,以保证软件产品的质量。


但是,在如今敏捷开发模式下,互联网项目中很少直接基于需求来衡量测试覆盖率了,而是将软件需求转换成测试需求,然后基于测试需求再来设计测试点。


所以,现在所说的测试覆盖率,通常默认指代码覆盖率,而不是需求覆盖率。


二、代码覆盖率


代码覆盖率,通常是指至少被执行了一次的条目数占整个条目数的百分比。


这里的“条目数”,可以是代码语句,也可以是函数,还可以是路径,来对应不同的代码覆盖率类型的定义。


1. 最常用的三种代码覆盖率指标


行覆盖率


又称为语句覆盖率。指已经被执行到的语句占总可执行语句(不包含类似 C++ 的头文件声明、代码注释、空行等等)的百分比。


这是最常用也是要求最低的覆盖率指标。实际项目中通常会结合判定覆盖率或者条件覆盖率一起使用


2. 判定覆盖


又称分支覆盖。用以度量代码中每个判断取真分支取假分支是否各被覆盖至少各一次


比如语句if(a>0 && b>0),需要覆盖a>0 && b>0TrueFalse各一次。


3. 条件覆盖


条件覆盖,是指判定中的每个条件的可能取值至少满足一次。度量判定中的每个条件的结果 TrueFalse 是否都被测试到了。


比如语句if(a>0 && b>0),这里有2个条件输入,分别是a>0b>0。那么就需要有a>0TrueFalse 各一次,同时要求b>0TrueFalse 各一次。


三、代码覆盖率的价值


  • 根本目的是找出潜在的遗漏测试用例,并有针对性的进行补充。


  • 还可以识别出代码中那些由于需求变更等原因造成的不可达的废弃代码


通常我们希望代码覆盖率越高越好,代码覆盖率越高越能说明你的测试用例设计是充分且完备的。


但是,也不能盲目追求过高的代码覆盖率,因为后面对于测试的投入成本会呈指数上升


目前,主要是在单元测试阶段对代码覆盖率有较高的要求。因为很多测试条件在集成或者页面测试的时候不方便模拟,远不如在单元测试的时候用mock、打桩来实现。


四、代码覆盖率的局限


那么 100% 的代码覆盖率,是否就说明项目质量一定没问题呢?


回答当然是:否。


因为代码覆盖率的计算是基于现有代码的,并不能发现那些未考虑某些输入以及未处理某些情况而引发的问题。


所以,它能反映的仅仅是已有代码的哪些逻辑被执行过了,哪些逻辑还没有被执行过

然后,我们依此为依据,可以补充测试用例,也可以去测试那些还没有覆盖到的执行路径等等。


总结:高的代码覆盖率不一定能保证软件的质量,但是低的代码覆盖率一定不能保证软件的质量


五、代码覆盖率工具


通常,对于不同的语言,会有对应的一些工具。最常见的java,就有一个工具叫 JaCoCo。


JaCoCo 是一款 Java 代码的主流开源覆盖率工具,可以很方便地嵌入到 Ant、Maven 中,并且和很多主流的持续集成工具以及代码静态检查工具,比如 Jekins 和 Sonar 等,都有很好的集成。


1. JaCoCo 代码覆盖率报告


1268169-20210710215807717-1554545644.png


2. JaCoCo 详细代码覆盖率实例


1268169-20210710215918746-1192194523.png


  • 绿色的行表示已经被覆盖。
  • 红色的行表示尚未被覆盖。
  • 黄色的行表示部分覆盖。
  • 左侧绿色菱形块表示该分支已经被完全覆盖。
  • 左侧黄色菱形块表示该分支仅被部分覆盖。


通过这个详尽的报告,你就可以知道代码真实的执行情况、哪些代码未被覆盖。以此为基础,再去设计测试用例就会更有针对性了。


这里对工具暂时仅做了解即可。

相关文章
|
1月前
|
安全 测试技术
北大李戈团队提出大模型单测生成新方法,显著提升代码测试覆盖率
【10月更文挑战第1天】北京大学李戈教授团队提出了一种名为“统一生成测试”的创新方法,有效提升了大模型如GPT-2和GPT-3在单一测试中的代码生成覆盖率,分别从56%提升至72%和从61%提升至78%。这种方法结合了模糊测试、变异测试和生成对抗网络等多种技术,克服了传统测试方法的局限性,在大模型测试领域实现了重要突破,有助于提高系统的可靠性和安全性。然而,该方法的实现复杂度较高且实际应用效果仍需进一步验证。论文可从此链接下载:【https://drive.weixin.qq.com/s?k=ACAAewd0AA48Z2kXrJ】
62 1
|
2月前
|
人工智能 测试技术 开发者
北大李戈团队提出大模型单测生成新方法,显著提升代码测试覆盖率
【9月更文挑战第27天】北京大学李戈团队在人工智能领域取得重要突破,提出HITS新方法,通过将待测方法分解为多个切片并利用大型语言模型逐个生成测试用例,显著提升代码测试覆盖率,尤其在处理复杂方法时效果显著,为软件开发和测试领域带来新希望。尽管存在一定局限性,HITS仍展示了巨大潜力,未来有望克服限制,推动软件测试领域的创新发展。论文详情见【https://www.arxiv.org/pdf/2408.11324】。
89 6
|
1月前
|
设计模式 关系型数据库 测试技术
进阶技巧:提高单元测试覆盖率与代码质量
【10月更文挑战第14天】随着软件复杂性的不断增加,确保代码质量的重要性日益凸显。单元测试作为软件开发过程中的一个重要环节,对于提高代码质量、减少bug以及加快开发速度都有着不可替代的作用。本文将探讨如何优化单元测试以达到更高的测试覆盖率,并确保代码质量。我们将从编写有效的测试用例策略入手,讨论如何避免常见的测试陷阱,使用mocking工具模拟依赖项,以及如何重构难以测试的代码。
56 4
|
4月前
|
测试技术
单元测试策略问题之行覆盖率和分支覆盖率之间的问题如何解决
单元测试策略问题之行覆盖率和分支覆盖率之间的问题如何解决
155 7
|
3月前
|
Java 测试技术 API
SpringBoot单元测试快速写法问题之计算测试用例的分支覆盖率如何解决
SpringBoot单元测试快速写法问题之计算测试用例的分支覆盖率如何解决
|
4月前
|
测试技术 开发者
单元测试问题之为什么单测覆盖率高的项目模块更易于迭代演进
单元测试问题之为什么单测覆盖率高的项目模块更易于迭代演进
|
4月前
|
测试技术
codereview开发问题之CodeReview关注代码的测试覆盖率问题如何解决
codereview开发问题之CodeReview关注代码的测试覆盖率问题如何解决
|
4月前
|
Java 测试技术 Maven
在Java项目中集成单元测试与覆盖率工具
在Java项目中集成单元测试与覆盖率工具
|
Java 测试技术 Maven
Spring Boot 中的测试覆盖率是什么,如何使用
Spring Boot 中的测试覆盖率是什么,如何使用
|
Java 测试技术 Maven
SpringCloud项目编译打包执行单元测试(修复单元测试数量为0)-流水线sonarqube扫描jacoco插件展示覆盖率
SpringCloud项目编译打包执行单元测试(修复单元测试数量为0)-流水线sonarqube扫描jacoco插件展示覆盖率