测试覆盖率那些事

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

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

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

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

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

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

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

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

相关文章

Linux基础 想学好Linux请看这篇文章 Linux操作指令大全

当涉及学习 Linux 时,了解其基本原理和核心概念是至关重要的。Linux 是一种开源操作系统,广泛应用于服务器、嵌入式系统以及个人计算机中。它的灵活性、稳定性和安全性使得它成为许多 IT 专业人士和开发人员的首选。 第一步:了解基本概念和特…

CC连接过程

1、CC线连接过程 DFP和UFP会实时监控CC1和CC2引脚的电压,来评估DFP和UFP是否都已经在位。同时DFP可以根据电压确定自己所能提供的电流的大小 2、连接过程 Source端使用一个MOS管去控制Vbus,初始状态下,FET为关闭状态,Vbus不通。S…

苍穹外卖问题记录(持续更新)

Day01_3.2.4前后端联调 1. 前端无法登录 (1)确保nginx服务器已经启动 (2)查看自己数据库的用户名和密码是否和老师的一样,不一样的话需要在application-dev.yml文件中把老师的用户名密码修改成自己的 老师的用户名…

单⽬相机成像过程_看这一篇就够了

单⽬相机成像过程:看这一篇就够了 附赠宝贵的全套自动驾驶学习资料: 资料链接 附赠宝贵的全套自动驾驶学习资料: 资料链接

开发反应式API

开发反应式API 开发反应式API1 使用SpringWebFlux1.1 Spring WebFlux 简介1.2 编写反应式控制器 2 定义函数式请求处理器3 测试反应式控制器3.1 测试 GET 请求3.2 测试 POST 请求3.3 使用实时服务器进行测试 4 反应式消费RESTAPI4.1 获取资源4.2 发送资源4.3 删除资源4.4 处理错…

107. 如何使用Docker以及Docker Compose部署Go Web应用

文章目录 一、为什么需要Docker?二、Docker部署示例1. 准备代码2. 创建Docker镜像3. 编写Dockerfile4. Dockerfile解析5. 构建镜像6. 通过镜像创建容器运行 三、分阶段构建示例四、附带其他文件的部署示例五、关联其他容器六、Docker Compose模式七、总结 本文将介绍…

49、东北大学、阿尔伯塔大学:MVS-GCN多视角脑区、具有先验脑结构学习的图模型[GCN六元理论识别所有EEG!]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2022年1.19日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑功能网络(FBN)已被用于神经系统疾病的分类&#xff0c;如自…

力扣题目训练(21)

2024年2月14日力扣题目训练 2024年2月14日力扣题目训练605. 种花问题617. 合并二叉树628. 三个数的最大乘积289. 生命游戏299. 猜数字游戏149. 直线上最多的点数 2024年2月14日力扣题目训练 2024年2月14日第二十一天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;…

DNS 技巧与窍门

简介 在本文中&#xff0c;您将学习三种可以使用 DNS 完成的技巧。如果您曾经进行过任何与 DNS 配置相关的工作&#xff0c;这些小技巧可能会帮助您更快地完成工作流程。您将学习一些在终端中使用的命令和处理 DNS 数据的方法&#xff0c;比如如何检查当前的域名服务器。完成后…

【智能算法】人工水母搜索算法(JS)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2020年&#xff0c;Chou 等人受到水母运动行为启发&#xff0c;提出了人工水母搜索算法(Artificial Jellyfish Search Optimizer, JS)。 2.算法原理 2.1算法思想 JS模拟了水母的搜索行为&#xf…

洛谷题解 - P1125 [NOIP2008 提高组] 笨小猴

目录 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示代码 题目描述 笨小猴的词汇量很小&#xff0c;所以每次做英语选择题的时候都很头疼。但是他找到了一种方法&#xff0c;经试验证明&#xff0c;用这种方法去选择选项的时候选…

关于OPC-UA客户端调用服务端方法CallMethod节点的问题

在OpcUaClient中可以通过CallMethodByNodeId调用方法节点 //// 摘要:// call a server method//// 参数:// tagParent:// 方法的父节点tag//// tag:// 方法的节点tag//// args:// 传递的参数//// 返回结果:// 输出的结果值public object[] CallMetho…

栈与队列|232.用栈实现队列

力扣题目链接 class MyQueue { public:stack<int> stIn;stack<int> stOut;/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stIn.push(x);}/** Removes the element from in front of que…

在 Ubuntu 14.04 上使用 Capistrano、Nginx 和 Puma 部署 Rails 应用

简介 Rails 是一个用 Ruby 编写的开源 Web 应用程序框架。它遵循“约定优于配置”的理念&#xff0c;通过假设有一种“最佳”做事方式&#xff0c;让你在不必浏览无尽的配置文件的情况下编写更少的代码&#xff0c;同时实现更多功能。 Nginx 是一个高性能的 HTTP 服务器、反向…

Elasticsearch(13) match_phrase的使用

elasticsearch version&#xff1a; 7.10.1 match_phrase 语法 POST <index>/_search {"query": {"match_phrase": {"<field_name>": {"query": "<your_search_phrase>","slop": <max_dis…

第二十五节 Java 继承

继承是所有 OOP 语言和 Java 语言不可缺少的组成部分。 继承是 Java 面向对象编程技术的一块基石&#xff0c;是面向对象的三大特征之一&#xff0c;也是实现软件复用的重要手段&#xff0c;继承可以理解为一个对象从另一个对象获取属性的过程。 如果类 A 是类 B 的父类&…

数据结构--线性表

1.线性表的定义&#xff1a; 存在唯一的一个被称为“第一个”的数据元素&#xff1b; 存在唯一的一个被称为“最后一个”的数据元素&#xff1b; 除第一个之外&#xff0c;集合中的每一个数据元素都只有一个前驱&#xff1b; 除最后一个之外&#xff0c;集合中的每一个数据…

大话设计模式——7.抽象工厂模式(Abstract Factory Pattern)

1.介绍 抽象工厂模式是工厂模式的进一步优化&#xff0c;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。属于创建型模式。 UML图&#xff1a; 2.示例 车辆制造工厂&#xff0c;不仅可以制造轿车也可以用来生产自行车。 1&#xff09;Abs…

算法——异或运算

理解&#xff1a; 1、相同为0&#xff0c;不同为1 2、可以理解为2进制的无进位相加 性质&#xff1a; 1、0 ^ N N N ^ N 0 2、交换律 结合律 a ^ b b ^ a a ^ b ^ c a ^ ( b ^ c ) 用异或实现两个数交换 #include"iostream" using namespace std; int ma…

vivado 逻辑优化约束、功率优化、Vivado Tools电源优化

逻辑优化约束 逻辑保护 Vivado设计套件在逻辑优化过程中尊重DONT_TOUCH属性。确实如此不优化具有这些特性的离开网或单元。为了加快网络选择过程&#xff0c;网络具有DONT_TOUCH的属性被预过滤并且不被考虑用于物理优化。对于有关详细信息&#xff0c;请参阅《Vivado Design …