测试覆盖率

1、概念

        覆盖率测试,也称为测试覆盖率分析,是软件测试中的一个重要概念,用来衡量测试用例执行时对代码的覆盖程度。它提供了一种量化的方法来评估测试集的充分性,即测试是否足够广泛地触及了应用程序的所有部分。覆盖率测试可以应用于不同的抽象层次,从源代码级别的细节到更高层次的功能需求。

2、测试覆盖率的主要类型

代码覆盖率

        这是最常用的测试覆盖率形式,通常在单元测试阶段进行计算。它关注的是代码结构的哪些部分被测试执行到了。常见的代码覆盖率指标包括:

  • 语句覆盖率(Statement Coverage):检查程序中的每个可执行语句是否至少被执行过一次。
  • 判定/分支覆盖率(Decision/Branch Coverage):确保每个判断条件的真假两个分支都被测试到。
  • 条件覆盖率(Condition Coverage):每个逻辑条件的可能结果都至少出现一次。
  • 路径覆盖率(Path Coverage):确保程序中所有可能的路径都被执行。

语句覆盖

  • 含义:语句覆盖要求设计的测试用例能够使得程序中的每一条可执行语句至少被执行一次。例如,对于下面一段简单的代码:
def add_numbers(a, b):result = a + bprint(result)return result

只要有一组测试数据(比如 a = 1,b = 2)能够使得这三行代码(result = a + b、print (result)、return result)都被执行,就达到了语句覆盖。 

  • 优点:简单直观,容易理解和实现。它能够快速发现未被执行的代码语句,有助于发现一些基本的代码逻辑错误,比如语法错误导致某些语句无法执行等。
  • 缺点:语句覆盖不能发现程序中逻辑判断的错误。例如,在一个包含 if - else 语句的程序中,只执行了 if 分支,即使 else 分支有错误,语句覆盖也无法发现。

判定/分支覆盖

  • 含义:分支覆盖要求设计的测试用例能够使得程序中的每个判定(如 if 语句、while 语句等条件判断)的所有可能结果(真和假)至少出现一次。例如:
def check_number(n):if n > 0:print("Positive")else:print("Non - positive")

测试用例需要包括 n 大于 0(使得 if 分支执行)和 n 小于等于 0(使得 else 分支执行)两种情况,这样才能达到分支覆盖。

  • 优点:相比语句覆盖,分支覆盖能够更好地测试程序中的逻辑判断部分,对于发现条件判断错误有很好的效果,如错误的比较运算符等。
  • 缺点:它可能会忽略一些内部的分支嵌套情况,并且对于多条件组合的复杂判定,可能无法完全覆盖所有的条件组合情况。

条件覆盖

  • 含义:条件覆盖是指设计测试用例,使得每个判定中的每个条件的所有可能结果至少出现一次。例如,对于判定 “if (a> 0 and b < 10)”,条件覆盖要求测试用例能够使得 “a > 0” 为真和假、“b < 10” 为真和假的情况都出现。
  • 优点:能够更细致地测试条件表达式,对于复杂的条件判断,可以发现条件本身的错误。
  • 缺点:条件覆盖可能会导致测试用例数量过多,而且不能保证覆盖所有的分支情况。有可能出现满足了条件覆盖,但没有满足分支覆盖的情况。

路径覆盖

  • 含义:路径覆盖要求设计的测试用例能够覆盖程序中所有可能的执行路径。对于一个包含多个分支和循环的程序,不同的分支选择和循环次数会形成多种执行路径。例如,一个包含两个嵌套的 if - else 语句的程序,可能会有 4 条不同的执行路径,路径覆盖就需要设计测试用例来覆盖这 4 条路径。
  • 优点:是最全面的覆盖标准,能够发现程序中各种复杂的逻辑错误,包括由于不同路径执行导致的错误,如变量在不同路径下初始化错误等。
  • 缺点:随着程序复杂度的增加,可能的执行路径数量会呈指数级增长,导致测试用例数量巨大,测试成本非常高。

需求覆盖率

        指的是测试用例对需求规格说明书的覆盖情况。这通常与功能测试相关联,目的是确保每个需求都被验证。

缺陷覆盖率

这个较少提及,但理论上它可以指代已知缺陷是否已经被修复或验证。

3、实施步骤

  1. 制定测试计划:明确测试的目标、范围、时间、资源等,并确定需要进行覆盖率测试的代码模块。
  2. 选择合适的覆盖率指标:根据需求和项目的特点,选择适当的覆盖率指标,如语句覆盖率、分支覆盖率、条件覆盖率等。
  3. 编写测试用例:根据选择的覆盖率指标,设计和编写相应的测试用例,覆盖尽可能多的代码路径,包括边界情况和异常情况。
  4. 执行测试:按照测试计划执行测试用例,记录相应的覆盖率数据。
  5. 分析覆盖率数据:使用工具可视化显示覆盖率结果,并深入分析未覆盖到的代码部分,识别潜在问题和改进空间。
  6. 优化测试用例:根据分析结果优化测试用例,增加覆盖率并提高测试效果。

4、测试覆盖率的价值和局限性

价值

        高覆盖率意味着更多的代码得到了测试,有助于发现潜在的问题,提高软件质量。同时,它也可以帮助识别未被测试的部分,从而指导开发人员添加新的测试用例。

局限性

        高的覆盖率并不保证软件没有错误。例如,如果一个重要的逻辑条件被遗漏或者实现有误,即使覆盖率很高也可能无法检测到问题。此外,追求过高的覆盖率可能会导致高昂的成本,因为需要额外的时间和资源来创建和维护复杂的测试用例。

5、实践建议

建议

  • 在实际项目中,应该根据项目的特性和资源限制设定合理的覆盖率目标,而不是盲目追求100%的覆盖率。
  • 结合静态代码分析和其他测试技术,以确保更全面的质量保障。

实践

  • 使用适当的工具来自动化覆盖率的收集和报告,如JaCoCo对于Java项目。

jacoco

        它是一个用于 Java 语言的代码覆盖率工具。可以集成到 Maven 或 Gradle 构建工具中,在测试执行过程中收集覆盖率数据。它能够提供详细的覆盖率报告,包括语句覆盖、分支覆盖等多种覆盖率指标。例如,在一个基于 Maven 的 Java 项目中,通过在 pom.xml 文件中配置 JaCoCo 插件,就可以在测试后生成覆盖率报告,帮助开发人员了解测试的覆盖程度。

报告

JaCoCo 可以实现多种覆盖率的报告,主要包括语句覆盖、分支覆盖。

  • 语句覆盖(Instruction/Line Coverage):这是最基础的覆盖率类型,JaCoCo会检查每个可执行语句是否至少被执行过一次。在JaCoCo的报告中,这通常以“指令”或“行”覆盖率的形式展示。
  • 分支覆盖(Branch Coverage):jaCoCo也支持判定覆盖或分支覆盖,这意味着它会确保每个判断条件的真假两个分支都被测试到。对于if-else、switch-case等结构,JaCoCo会计算不同路径的比例。

        JaCoCo确实提供了条件覆盖率的计算,但它不是默认显示的指标之一。条件覆盖率指的是布尔表达式中的每个子条件都被评估为真和假的情况。为了查看条件覆盖率,你可能需要调整JaCoCo的配置或者使用额外的插件来生成更详细的报告。

        至于路径覆盖,JaCoCo并不直接提供这个指标。路径覆盖要求所有可能的控制流路径都得到执行,这对于复杂逻辑来说可能会产生指数级增长的路径数,因此很少被工具直接支持。实现完全的路径覆盖通常是不切实际的,因为这可能导致过多的测试用例,并且一些路径可能是不可达的。

        综上所述,JaCoCo默认提供的覆盖率报告主要是语句覆盖率和分支覆盖率。如果你对条件覆盖率感兴趣,可以查阅文档或探索JaCoCo的高级配置选项。对于路径覆盖,你可能需要结合其他分析方法或手动设计测试用例来确保关键路径得到了充分的测试。

实现文档参考

jacoco功能测试-代码覆盖率_jacoco代码覆盖率测试代码-CSDN博客

6、总结

        测试覆盖率是一个有用的指标,但它应当与其他度量标准一起使用,以获得关于软件质量和测试效率的完整视图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升决策支持:五大报表软件功能全面评测

本文将为大家介绍五款功能强大的报表软件&#xff0c;包括山海鲸报表、JReport、Power BI、Zoho Analytics 和 SAP Crystal Reports。这些工具各具特色&#xff0c;能够帮助企业快速生成数据报表并进行深度分析。无论是数据可视化、报表定制、自动化生成还是与其他系统的集成&a…

Backend - C# EF Core 执行迁移 Migrate

目录 一、创建Postgre数据库 二、安装包 &#xff08;一&#xff09;查看是否存在该安装包 &#xff08;二&#xff09;安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行&#xff08;针对visual studio&#xff09; 查看迁移功能的常用命令&#xff1a; 查看…

GESP202312 四级【小杨的字典】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202312 四级] 小杨的字典 题目描述 在遥远的星球&#xff0c;有两个国家 A 国和 B 国&#xff0c;他们使用着不同的语言&#xff1a;A 语言和 B 语言。小杨是 B 国的翻译官&#xff0c;他的工作是将 A 语言的文章翻译成 B 语言的文章…

【软考网工笔记】计算机基础理论与安全——网络规划与设计

HFC 混合光纤同轴电缆网 HFC: Hybrid Fiber - Coaxial 的缩写&#xff0c;即混合光纤同轴电缆网。是一种经济实用的综合数字服务宽带网接入技术。 HFC 通常由光纤干线、同轴电缆支线和用户配线网络三部分组成&#xff0c;从有线电视台出来的节目信号先变成光信号在干线上传输…

KubeVirt 进阶:设置超卖比、CPU/MEM 升降配、在线磁盘扩容

前两篇文章&#xff0c;我们分别介绍 Kubevirt 的安装、基本使用 以及 将 oVirt 虚拟机迁移到 KubeVirt&#xff0c;我们留了两个ToDo&#xff0c;一个是本地磁盘的动态分配&#xff0c;一个是固定 IP 的需求&#xff0c;本期我们先解决第一个&#xff0c;本地磁盘的动态分配。…

自动化脚本本地可执行但是Jenkins上各种报错怎么解决

作者碎碎念&#xff1a; 测试环境 Jenkinsdockerpythonunittest&#xff0c; 测试问题&#xff1a;本人在写关于SAP4Me网站的自动化脚本时遇到一个问题 本地怎么都跑的通 但是一上Jenkins会出现各种各样的问题 因为在Jenkins里面脚本是放在docker环境里面跑的 所以环境的差异…

TaskBuilder前端组件简介

3.3.3.1前端组件的分类 前端页面是由众多组件层层嵌套构成的&#xff0c;这些组件是任讯信息自主研发的一套前端UI组件&#xff0c;称为tfp组件&#xff0c;这些组件根据其功能和特点又分为几大类&#xff0c;它们的继承关系如下图所示&#xff1a; 从图中可知&#xff0c;所…

linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决

前言 今天在使用linux的时候&#xff0c;使用上下键想翻出历史命令时&#xff0c;却出现[[A[[A[[A[[B^[[B这种东东&#xff0c;而tab键补全命令的功能也无法使用。最终发现是由于当前用户使用的shell是/bin/sh的原因。 解决方法 运行以下命令&#xff0c;将默认 shell 设置为…

Kafka优势剖析-幂等性和事务

目录 1. 幂等性&#xff08;Idempotence&#xff09; 1.1 什么是幂等性&#xff1f; 1.2 幂等性的实现 1.2.1 生产者 ID 和序列号 1.2.2 重复消息检测 1.2.3 幂等性的优势 1.3 幂等性的配置 2. 事务支持&#xff08;Transactions&#xff09; 2.1 什么是事务支持&…

FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )

以Xilinx 公司Virtex-II 系列FPGA 为例&#xff0c;其基本结构由下图所示。它是主要由两大部分组成&#xff1a;可编程输入/输出&#xff08;Programmable I/Os&#xff09;部分和内部可配置&#xff08;Configurable Logic&#xff09;部分。 可编程输入/输出&#xff08;I/Os…

《零基础Go语言算法实战》【题目 1-11】格式化字符串

《零基础Go语言算法实战》 【题目 1-11】格式化字符串 在 Go 语言中&#xff0c;找到使用变量格式化字符串而不打印值的简单方法。 【解答】 在 Go 语言中&#xff0c;在不打印值的情况下进行格式化的最简单方法是使用 fmt.Sprintf() 函数&#xff0c; 它返回一个格式化的…

Virtualbox7.1.4安装Proxmox

准备工作 有以下两个大步骤&#xff1a; 第一步、安装Virtualbox 最新版本安装过程遇到问题参考&#xff1a; VirtualBox新版本报错 Invalid installation directory解决方案_virtualbox invalid installation directory-CSDN博客 第二步、下载Proxmox 官网下载地址&…

Apache JMeter 压力测试使用说明

文章目录 一、 安装步骤步骤一 下载相关的包步骤二 安装 Jmeter步骤三 设置 Jmeter 工具语言类型为中文 二、使用工具2.1 创建测试任务步骤一 创建线程组步骤二 创建 HTTP 请求 2.2 配置 HTTP 默认参数添加 HTTP消息头管理器HTTP请求默认值 2.3 添加 查看结果监听器2.4 查看结果…

yum换源

背景描述 源&#xff1a;阿里云&#xff1a; 系统&#xff1a;centos7 https://developer.aliyun.com/mirror/其他参考地址&#xff1a; https://developer.aliyun.com/mirror/centos?spma2c6h.13651102.0.0.3e221b11UchtP5https://developer.aliyun.com/mirror/centos-vau…

vivado时序约束和优化

相关资料 参考视频 基础篇&#xff1a; 05如何科学设计FPGA:VIVADO中的时序约束和分析以及进阶技巧_哔哩哔哩_bilibili 升级篇&#xff1a; 05如何科学设计FPGA:VIVADO中的时序约束和分析以及进阶技巧_哔哩哔哩_bilibili 参考文章 csdn写的很好的文章目录&#xff1a; …

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot&#xff08;1&#xff09;基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot&#xff08;2&#xff09;解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot&#xff08;3&#xff09;教你手工搭建Spring Boot项目纯手工玩法…

从Linux本地软件存储库安装MySQL

许多Linux发行版在其本机软件存储库中包含MySQL服务器、客户端工具和开发组件的版本&#xff0c;并且可以与平台的标准包管理系统一起安装。本节提供使用这些包管理系统安装MySQL的基本说明。 本机软件包通常比当前可用的版本落后几个版本。您通常也无法安装开发里程碑版本&am…

[数据结构]倒排索引介绍

倒排索引详解 1. 原理 倒排索引&#xff08;Inverted Index&#xff09;是一种数据结构&#xff0c;用于存储在文档集合中出现的单词&#xff0c;以及这些单词出现的文档列表。这种索引方式常用于全文搜索引擎&#xff0c;如Elasticsearch和Solr&#xff0c;以快速进行文本搜…

AIDD-人工智能药物设计-人工智能破解酶稳定性定向进化中的多个突变位点高效重组问题

mLife | 人工智能破解酶稳定性定向进化中的多个突变位点高效重组问题 优化酶的热稳定性对于蛋白质科学和工业应用至关重要。目前&#xff0c;通过&#xff08;半&#xff09;理性设计和随机诱变方法可以较为准确地设计多个增强酶热稳定性的单点突变。但当组合多个突变时&#…

Qt仿音乐播放器:媒体类

一、铺垫 我暂时只会音频系列的操作&#xff0c;我只能演示音频部分&#xff1b;但是QMediaPlayer是一个可以播放视频、音频的类&#xff1b;请同学们细读官方文档&#xff1b; 二、头文件 #include<QMediaPlayer> 头文件 #include<QMediaPlaylist> 三、演…