测试覆盖率那些事
在测试过程中,会出现测试覆盖不全的情况,特别是工期紧张的情况下,测试的时间被项目的周期一压再压,测试覆盖概率不全就会伴随而来。
网上冲浪,了解一下覆盖率的文章,其中一篇感觉写的很不错,将测试的门派和武侠小说中的门派进行了比较,感觉很有意思;金庸武侠小说的门派大致分为【武当、华山、峨眉、少林、昆仑和崆峒派】,将测试覆盖率使用上分为了六大派【捷径,数据,专利,需求,代码,缺陷】,我比较看好数据派和代码派,嘻嘻;有兴趣的可以了解一下:聊聊测试覆盖率的六大门派
测试覆盖率是软件测试领域中用来量化测试活动对软件产品进行验证的程度的一个关键指标。它提供了关于测试用例集能否有效揭露潜在错误以及是否全面覆盖了软件不同方面的信息。
测试覆盖率有以下几个核心:
-
类型:
-
语句覆盖率:测试是否执行了所有代码行。
-
分支覆盖率(也称判定覆盖率):测试是否覆盖了所有决策点(如if语句)的所有分支。
-
条件覆盖率:不仅关注分支,还关注每个逻辑条件是否独立地取真和取假。
-
判定条件覆盖率(MCDC,Multiple Condition Decision Coverage):确保每个条件都能独立影响决策结果。
-
路径覆盖率:测试是否覆盖了所有可能的控制流路径。
-
代码覆盖率:衡量测试用例执行了多少源代码语句或指令。
-
-
需求覆盖率:评估测试用例是否覆盖了所有系统需求或规格说明文档中的功能点。确保每个需求都有对应的测试用例进行验证。
-
其他形式的覆盖率:除了上述基于代码和技术实现的覆盖率外,还有可能根据具体的业务需求和场景设定其他的覆盖率标准,比如功能模块覆盖率、接口覆盖率等。
-
局限性:虽然高的覆盖率意味着更多的代码或需求得到了测试,但并不能保证发现所有的bug。理论上,100%的覆盖率并不意味着软件完全没有问题,因为它无法检测到逻辑错误、边界条件错误或者未考虑到的异常情况。此外,过分追求高覆盖率会增加测试成本和时间开销。
-
应用:测试覆盖率主要用于指导测试策略优化,帮助识别哪些部分的测试还不够充分,进而有针对性地设计新的测试用例以提高整体的质量保障效果。同时,它也是评估软件质量控制过程的重要参考指标,在一些安全关键领域甚至可能是合规要求的一部分。
出现测试覆盖率不全的原因主要有客观和主观
客观因素主要有以下场景:
-
项目周期紧张:在快节奏的软件开发过程中,项目进度压力可能导致测试阶段的时间被压缩,测试人员没有足够的时间来详细设计和执行全面的测试计划,特别是对边缘案例和异常处理的测试。
-
资源有限:人力、物力和技术资源的限制可能使得测试团队无法对所有可能的场景进行全面测试,特别是在大型复杂的项目中,可能存在大量的交互组合和状态变化。
-
测试环境局限:受限于测试环境的搭建和配置,有些特定场景可能在现有环境下难以模拟或复现,造成这些场景得不到有效测试。
-
需求变更频繁:快速迭代的开发模式下,需求不稳定或频繁变更,测试人员疲于应对新的需求,可能会忽视对原有功能或新增功能的全面测试覆盖。
-
投放渠道众多:尤其是针对 C 端用户的拉新和促活活动,投放渠道非常多,涉及到不同在不同的环境运行,如 App 环境(iOS、安卓、鸿蒙)、H5 环境、小程序环境,同时涉及到不同设备、不同环境、不同操作系统版本、不同浏览器的打开、回流、引导下载等操作,兼容性测试覆盖不足可能导致在某些环境下出现问题。
-
流量情况悬殊:各个投放渠道流量差异较大,若上线前没有对各渠道的流量有充分的预估,没有进行压测,在高并发、大数据量或复杂业务场景下,性能问题可能无法被及时发现,从而导致线上问题。
主观因素主要以下场景:
-
粗心大意:测试人员可能对需求理解不够深入,误认为某些功能简单易懂,从而未能全面分析并设计出足够的测试场景,尤其是针对异常流程、分支流程和边界条件等。
-
侥幸心理:有时测试人员可能对潜在的风险估计不足,存在“应该不会有问题”的心理,不愿意花费更多的时间和精力去深入挖掘和验证那些不太常见或看似不太重要的测试场景。
-
需求理解不充分:测试用例只覆盖到了产品 PRD 里的显式功能,没有覆盖隐性需求,只进行了黑盒测试或者黑盒测试覆盖的场景不足。
-
经验主义:思维固化,认为老办法同样可以解决新问题,没有进一步思考对测试场景、测试数据、验证方式的不同之处。
-
开发知识欠缺:无法熟读代码,无法通过参加代码评审识别出研发代码改动之处及可能影响的范围,望码兴叹,无法熟练进行白盒测试,或者自动化测试代码健壮性较差,无法起到自动化回归的作用。
-
测试专业技能薄弱:测试专业技能、经验不足,力所不及,自然无法保证测试的充分性及验证场景的全面性。
-
用例颗粒度太大:编写用例的过程也是自己梳理信息的过程,用例颗粒度大,自然梳理的过程就不会太精细,自然遗漏验证场景的几率就会更大(虽然探索式测试的理念是不要求编写详细的测试用例,而是在测试过程中不断调整、优化或细化,但目前我们目前的环境不太适合探索式测试,因为绝大部分需求都要求快速上线,大部分需求都存在挤压排期的现场,在测试阶段很难有充足的时间进行探索式测试)。
-
信息互通不到位:与项目组其他成员沟通不到位,遗漏重要信息或没有对齐颗粒度,你以为的实际不是你以为,导致遗漏重要验证场景。
如何提升测试覆盖率?
-
详尽的需求理解和分析:确保对需求有全面准确的理解,包括正常流程、异常流程、边界条件等,并在此基础上设计详细的测试用例,尽量覆盖所有可能的操作路径和逻辑分支。
-
制定完善的测试策略:根据项目的特性和业务需求,制定包含单元测试、集成测试、系统测试、回归测试等在内的多层次测试策略,保证每个层次都能得到充分的测试覆盖。
-
使用自动化测试工具:利用自动化测试工具(如Selenium、JUnit、PyTest等)编写自动化测试脚本,尤其对于重复性高、复杂度大的测试场景,自动化测试能够大幅提升覆盖率和测试效率。
-
实施持续集成与持续测试:在代码提交后立即运行自动化测试,发现问题及时反馈,通过这种方式,可以实时保障代码改动后的测试覆盖率不下降。
-
探索式测试:鼓励测试人员采用探索式测试方法,即在测试过程中基于对系统的理解进行即时设计和执行测试,发现更多的隐藏问题和未被覆盖的场景。
-
静态代码分析和覆盖率工具:借助静态代码分析工具检查代码质量,同时结合动态测试覆盖率工具(如JaCoCo、Cobertura等),直观地了解当前测试覆盖情况,并针对性地补充遗漏的测试点。
-
定期审查和维护测试用例库:随着项目的发展和需求变更,应及时更新和优化测试用例库,确保测试用例的有效性和完整性。
-
引入缺陷预防机制:通过对历史缺陷的统计分析,找出缺陷高发区域,提前加强该部分的测试覆盖。
-
充足的测试资源投入:合理分配测试人力资源,确保有足够的时间和精力投入到测试设计和执行过程中,避免因为赶工而牺牲测试的质量和覆盖率。
-
明确测试目标:首先,需要明确测试的目标,即要测试哪些功能和模块。通过深入理解业务需求和产品特性,可以确保测试工作覆盖所有重要的功能点。
-
制定详细的测试计划:制定详细的测试计划,包括测试范围、测试方法、测试环境、测试数据等。确保测试计划覆盖所有需求点,并且针对每个需求点都有相应的测试用例。
-
编写全面的测试用例:根据测试计划,编写全面的测试用例,包括正常情况和异常情况的测试用例。考虑各种可能的输入和条件,确保测试用例的覆盖面广。
-
采用多种测试方法:结合使用黑盒测试、白盒测试、灰盒测试等多种测试方法,以便全面地检测软件的功能和性能。这有助于发现不同类型的问题和缺陷。
-
增加测试数据量:增加测试用例的数量和每个测试用例的输入数据量,以便更全面地覆盖软件的各种可能情况。这有助于发现一些与特定数据或数据组合相关的问题。
-
进行代码审查:代码审查可以发现代码中的潜在问题和缺陷,从而提高测试覆盖率和软件质量。通过团队协作,进行代码审查,可以确保代码的质量和可维护性。
-
持续反馈与改进:在测试过程中,及时收集和分析测试结果,根据反馈进行改进。不断调整测试策略和测试用例,以适应产品变化和新的需求。
-
团队协作与沟通:测试工作不是孤立的,需要与其他团队成员密切协作。通过定期沟通、分享经验和知识,可以共同提升测试覆盖率。
综上所述,提升测试覆盖率需要从多个方面入手,包括明确测试目标、制定详细的测试计划、编写全面的测试用例、采用多种测试方法、增加测试数据量、引入自动化测试、进行代码审查以及持续反馈与改进等。通过系统性的工作,可以逐步提升测试覆盖率,确保软件的质量和稳定性。
相关文章:
测试覆盖率那些事
在测试过程中,会出现测试覆盖不全的情况,特别是工期紧张的情况下,测试的时间被项目的周期一压再压,测试覆盖概率不全就会伴随而来。 网上冲浪,了解一下覆盖率的文章,其中一篇感觉写的很不错,将…...

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…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...