当前位置: 首页 > news >正文

测试覆盖率那些事

在测试过程中,会出现测试覆盖不全的情况,特别是工期紧张的情况下,测试的时间被项目的周期一压再压,测试覆盖概率不全就会伴随而来。

网上冲浪,了解一下覆盖率的文章,其中一篇感觉写的很不错,将测试的门派和武侠小说中的门派进行了比较,感觉很有意思;金庸武侠小说的门派大致分为【武当、华山、峨眉、少林、昆仑和崆峒派】,将测试覆盖率使用上分为了六大派【捷径,数据,专利,需求,代码,缺陷】,我比较看好数据派和代码派,嘻嘻;有兴趣的可以了解一下:聊聊测试覆盖率的六大门派

测试覆盖率是软件测试领域中用来量化测试活动对软件产品进行验证的程度的一个关键指标。它提供了关于测试用例集能否有效揭露潜在错误以及是否全面覆盖了软件不同方面的信息。

测试覆盖率有以下几个核心:

  1. 类型:

    • 语句覆盖率:测试是否执行了所有代码行。

    • 分支覆盖率(也称判定覆盖率):测试是否覆盖了所有决策点(如if语句)的所有分支。

    • 条件覆盖率:不仅关注分支,还关注每个逻辑条件是否独立地取真和取假。

    • 判定条件覆盖率(MCDC,Multiple Condition Decision Coverage):确保每个条件都能独立影响决策结果。

    • 路径覆盖率:测试是否覆盖了所有可能的控制流路径。

    • 代码覆盖率:衡量测试用例执行了多少源代码语句或指令。

  2. 需求覆盖率:评估测试用例是否覆盖了所有系统需求或规格说明文档中的功能点。确保每个需求都有对应的测试用例进行验证。

  3. 其他形式的覆盖率:除了上述基于代码和技术实现的覆盖率外,还有可能根据具体的业务需求和场景设定其他的覆盖率标准,比如功能模块覆盖率、接口覆盖率等。

  4. 局限性:虽然高的覆盖率意味着更多的代码或需求得到了测试,但并不能保证发现所有的bug。理论上,100%的覆盖率并不意味着软件完全没有问题,因为它无法检测到逻辑错误、边界条件错误或者未考虑到的异常情况。此外,过分追求高覆盖率会增加测试成本和时间开销。

  5. 应用:测试覆盖率主要用于指导测试策略优化,帮助识别哪些部分的测试还不够充分,进而有针对性地设计新的测试用例以提高整体的质量保障效果。同时,它也是评估软件质量控制过程的重要参考指标,在一些安全关键领域甚至可能是合规要求的一部分。

出现测试覆盖率不全的原因主要有客观和主观

客观因素主要有以下场景:

  1. 项目周期紧张:在快节奏的软件开发过程中,项目进度压力可能导致测试阶段的时间被压缩,测试人员没有足够的时间来详细设计和执行全面的测试计划,特别是对边缘案例和异常处理的测试。

  2. 资源有限:人力、物力和技术资源的限制可能使得测试团队无法对所有可能的场景进行全面测试,特别是在大型复杂的项目中,可能存在大量的交互组合和状态变化。

  3. 测试环境局限:受限于测试环境的搭建和配置,有些特定场景可能在现有环境下难以模拟或复现,造成这些场景得不到有效测试。

  4. 需求变更频繁:快速迭代的开发模式下,需求不稳定或频繁变更,测试人员疲于应对新的需求,可能会忽视对原有功能或新增功能的全面测试覆盖。

  5. 投放渠道众多:尤其是针对 C 端用户的拉新和促活活动,投放渠道非常多,涉及到不同在不同的环境运行,如 App 环境(iOS、安卓、鸿蒙)、H5 环境、小程序环境,同时涉及到不同设备、不同环境、不同操作系统版本、不同浏览器的打开、回流、引导下载等操作,兼容性测试覆盖不足可能导致在某些环境下出现问题。

  6. 流量情况悬殊:各个投放渠道流量差异较大,若上线前没有对各渠道的流量有充分的预估,没有进行压测,在高并发、大数据量或复杂业务场景下,性能问题可能无法被及时发现,从而导致线上问题。

主观因素主要以下场景:

  1. 粗心大意:测试人员可能对需求理解不够深入,误认为某些功能简单易懂,从而未能全面分析并设计出足够的测试场景,尤其是针对异常流程、分支流程和边界条件等。

  2. 侥幸心理:有时测试人员可能对潜在的风险估计不足,存在“应该不会有问题”的心理,不愿意花费更多的时间和精力去深入挖掘和验证那些不太常见或看似不太重要的测试场景。

  3. 需求理解不充分:测试用例只覆盖到了产品 PRD 里的显式功能,没有覆盖隐性需求,只进行了黑盒测试或者黑盒测试覆盖的场景不足。

  4. 经验主义:思维固化,认为老办法同样可以解决新问题,没有进一步思考对测试场景、测试数据、验证方式的不同之处。

  5. 开发知识欠缺:无法熟读代码,无法通过参加代码评审识别出研发代码改动之处及可能影响的范围,望码兴叹,无法熟练进行白盒测试,或者自动化测试代码健壮性较差,无法起到自动化回归的作用。

  6. 测试专业技能薄弱:测试专业技能、经验不足,力所不及,自然无法保证测试的充分性及验证场景的全面性。

  7. 用例颗粒度太大:编写用例的过程也是自己梳理信息的过程,用例颗粒度大,自然梳理的过程就不会太精细,自然遗漏验证场景的几率就会更大(虽然探索式测试的理念是不要求编写详细的测试用例,而是在测试过程中不断调整、优化或细化,但目前我们目前的环境不太适合探索式测试,因为绝大部分需求都要求快速上线,大部分需求都存在挤压排期的现场,在测试阶段很难有充足的时间进行探索式测试)。

  8. 信息互通不到位:与项目组其他成员沟通不到位,遗漏重要信息或没有对齐颗粒度,你以为的实际不是你以为,导致遗漏重要验证场景。

如何提升测试覆盖率?

  1. 详尽的需求理解和分析:确保对需求有全面准确的理解,包括正常流程、异常流程、边界条件等,并在此基础上设计详细的测试用例,尽量覆盖所有可能的操作路径和逻辑分支。

  2. 制定完善的测试策略:根据项目的特性和业务需求,制定包含单元测试、集成测试、系统测试、回归测试等在内的多层次测试策略,保证每个层次都能得到充分的测试覆盖。

  3. 使用自动化测试工具:利用自动化测试工具(如Selenium、JUnit、PyTest等)编写自动化测试脚本,尤其对于重复性高、复杂度大的测试场景,自动化测试能够大幅提升覆盖率和测试效率。

  4. 实施持续集成与持续测试:在代码提交后立即运行自动化测试,发现问题及时反馈,通过这种方式,可以实时保障代码改动后的测试覆盖率不下降。

  5. 探索式测试:鼓励测试人员采用探索式测试方法,即在测试过程中基于对系统的理解进行即时设计和执行测试,发现更多的隐藏问题和未被覆盖的场景。

  6. 静态代码分析和覆盖率工具:借助静态代码分析工具检查代码质量,同时结合动态测试覆盖率工具(如JaCoCo、Cobertura等),直观地了解当前测试覆盖情况,并针对性地补充遗漏的测试点。

  7. 定期审查和维护测试用例库:随着项目的发展和需求变更,应及时更新和优化测试用例库,确保测试用例的有效性和完整性。

  8. 引入缺陷预防机制:通过对历史缺陷的统计分析,找出缺陷高发区域,提前加强该部分的测试覆盖。

  9. 充足的测试资源投入:合理分配测试人力资源,确保有足够的时间和精力投入到测试设计和执行过程中,避免因为赶工而牺牲测试的质量和覆盖率。

  10. 明确测试目标:首先,需要明确测试的目标,即要测试哪些功能和模块。通过深入理解业务需求和产品特性,可以确保测试工作覆盖所有重要的功能点。

  11. 制定详细的测试计划:制定详细的测试计划,包括测试范围、测试方法、测试环境、测试数据等。确保测试计划覆盖所有需求点,并且针对每个需求点都有相应的测试用例。

  12. 编写全面的测试用例:根据测试计划,编写全面的测试用例,包括正常情况和异常情况的测试用例。考虑各种可能的输入和条件,确保测试用例的覆盖面广。

  13. 采用多种测试方法:结合使用黑盒测试、白盒测试、灰盒测试等多种测试方法,以便全面地检测软件的功能和性能。这有助于发现不同类型的问题和缺陷。

  14. 增加测试数据量:增加测试用例的数量和每个测试用例的输入数据量,以便更全面地覆盖软件的各种可能情况。这有助于发现一些与特定数据或数据组合相关的问题。

  15. 进行代码审查:代码审查可以发现代码中的潜在问题和缺陷,从而提高测试覆盖率和软件质量。通过团队协作,进行代码审查,可以确保代码的质量和可维护性。

  16. 持续反馈与改进:在测试过程中,及时收集和分析测试结果,根据反馈进行改进。不断调整测试策略和测试用例,以适应产品变化和新的需求。

  17. 团队协作与沟通:测试工作不是孤立的,需要与其他团队成员密切协作。通过定期沟通、分享经验和知识,可以共同提升测试覆盖率。

综上所述,提升测试覆盖率需要从多个方面入手,包括明确测试目标、制定详细的测试计划、编写全面的测试用例、采用多种测试方法、增加测试数据量、引入自动化测试、进行代码审查以及持续反馈与改进等。通过系统性的工作,可以逐步提升测试覆盖率,确保软件的质量和稳定性。

相关文章:

测试覆盖率那些事

在测试过程中,会出现测试覆盖不全的情况,特别是工期紧张的情况下,测试的时间被项目的周期一压再压,测试覆盖概率不全就会伴随而来。 网上冲浪,了解一下覆盖率的文章,其中一篇感觉写的很不错,将…...

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc (基于 Go 语言实现)在 Linux 系统中是配置文件目录名;etcd 就是配置服务; etcd 诞生于 CoreOS 公司,最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。基…...

Docker 安装 LogStash

关于LogStash Logstash,作为Elastic Stack家族中的核心成员之一,是一个功能强大的开源数据收集引擎。它专长于从各种来源动态地获取、解析、转换和丰富数据,并将这些结构化或非结构化的数据高效地传输到诸如Elasticsearch等存储系统中进行集…...

Selenium笔记

Selenium笔记 Selenium笔记 Selenium笔记element not interactable页面刷新 element not interactable "element not interactable"是Selenium在执行与网页元素交互操作(如点击、输入等)时抛出的一个常见错误。这个错误意味着虽然找到了对应的…...

ChatGPT :确定性AI源自于确定性数据

ChatGPT 幻觉 大模型实际应用落地过程中,会遇到幻觉(Hallucination)问题。对于语言模型而言,当生成的文本语法正确流畅,但不遵循原文(Faithfulness),或不符合事实(Factua…...

linux驱动开发面试题

1.linux中内核空间及用户空间的区别? 记住“22”,两级分段两级权限。 例如是32位的机器,从内存空间看:顶层1G是内核的,底3G是应用的;从权限看:内核是0级特权,应用是3级特权。 2.用…...

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz,可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端,输入以下命令更新软件包列表:sudo apt update。之后,使用命令sudo apt install graphviz来安装Graphviz软件包。为…...

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.03.05-2024.03.10—(2)

论文目录~ 1.Debiasing Large Visual Language Models2.Harnessing Multi-Role Capabilities of Large Language Models for Open-Domain Question Answering3.Towards a Psychology of Machines: Large Language Models Predict Human Memory4.Can we obtain significant succ…...

AI解答——DNS、DHCP、SNMP、TFTP、IKE、RIP协议

使用豆包帮助我解答计算机网络通讯问题—— 1、DHCP 服务器是什么? DHCP 服务器可是网络世界中的“慷慨房东”哦🤣 它的全称是 Dynamic Host Configuration Protocol(动态主机配置协议)服务器。 DHCP 服务器的主要任务是为网络中的…...

【TypeScript系列】声明合并

声明合并 介绍 TypeScript中有些独特的概念可以在类型层面上描述JavaScript对象的模型。 这其中尤其独特的一个例子是“声明合并”的概念。 理解了这个概念,将有助于操作现有的JavaScript代码。 同时,也会有助于理解更多高级抽象的概念。 对本文件来讲,“声明合并”是指编…...

zookeeper基础学习之六: zookeeper java客户端curator

简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java…...

MySQL数据库操作学习(2)表查询

文章目录 一、表查询1.表字段的操作①查看表结构②字段的增加③字段长度/数据类型的修改④字段名的修改⑤删除字符段⑥清空表数据⑦修改表名⑧删除表 2、表数据查询3、where 字段4、聚合函数 一、表查询 1.表字段的操作 ①查看表结构 desc 表名; # 查看表中的字段类型&#…...

Java学习

目录 treeSet StringBuilder treeSet TreeSet 是 Java 中实现了 Set 接口的一种集合类,它使用红黑树数据结构来存储元素,放到TreeSet集合中的元素: 无序不可重复,但是可以按照元素的大小顺序自动排序。 TreeSet一般会和Iterator迭代器一起使…...

C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法

目录 1.八皇后算法(Eight Queens Puzzle) 2.常见的八皇后算法解决方案 (1)列优先法(Column-First Method): (2)行优先法(Row-First Method)&a…...

springboot整合swagger,postman,接口规范

一、postman介绍 1.1概述 工具下载 Postman(发送 http 请求的工具) 官网(下载速度比较慢):Download Postman | Get Started for Free 网盘下载:百度网盘 请输入提取码 1.2Http 请求格式 请求地址请求方法状…...

029—pandas 遍历行非向量化修改数据

前言 在 pandas 中,向量化计算是指利用 pandas 对象的内置方法和函数,将操作应用到整个数据结构的每个元素,从而在单个操作中完成大量的计算。 但在一些需求中,我们无法使用向量化计算,就需要迭代操作,本例…...

相机安装位置固定后开始调试设备供电公司推荐使用方法

摄像头安装位置固定后开始调试 设备供电:无电源设备需要连接12V/2A电源并连接到摄像机的DC端口,而有电源的摄像机可以直接连接到220V电源。 连接设备:如果是有线连接,请使用网线将设备连接到电脑(建议直接连接&#…...

AI视频批量混剪系统|罐头鱼AI视频矩阵获客

AI视频批量混剪系统助您轻松管理和编辑视频素材 如今,视频营销已成为企业推广的重要方式。为了满足用户对视频管理、发布和编辑的需求,《罐头鱼AI视频批量混剪系统》应运而生。这款智能化系统集成了多种功能,助您轻松管理和发布精彩视频内容…...

线程池学习-了解,自定义线程池

什么是线程池,这个池字是什么 线程池,主要利用池化思想,线程池,字符串常量池等 为什么要有一个线程池? 正常线程的创建:1,手动创建一个线程 2.给该线程分配任务,线程执行任务 3…...

CentOS7.9 安装SIPp3.6

epel里面的SIPp版本比较旧,先不要epel yum remove -y epel-release okay有很多CentOS软件,可以这样安装: 编辑 /etc/yum.repos.d/okay.repo,内容为: [okay] nameExtra OKay Packages for Enterprise Linux - $basearc…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

PH热榜 | 2025-06-08

1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...