试图一文彻底讲清 “精准测试”

news2024/11/18 9:43:14

在软件测试中,我们常常碰到两个基本问题(困难):

很难保障无漏测:我们做了大量测试,但不清楚测得怎样,对软件上线后会不会出问题,没有信心;

选择待执行的测试用例:面对大量的回归测试用例时,我们没有足够的时间完成测试,如何选择出有效的测试用例呢?虽然我们会有一些策略,如基于风险的测试策略、基于操作剖面的测试策略 或组合测试策略,但主要还是靠测试人员的经验,比较主观。

人们试图解决这样的基本问题,由此产生了“精准测试”。在敏捷开发模式下,开发节奏加快,测试资源反而比之前少了,这样的问题更突出了,因此我们更加关注 “精准测试”。

1. 什么是精准测试呢?
精准测试就是通过数据回答了两个基本问题:测得这样、要测什么,即精准测试是借助特定的算法、技术手段和工具,分析代码、程序运行过程、测试用例等及其之间关系,从而获取相关信息和知识,精准定位和优化测试范围(如精简测试用例),以精准的数据评估测试结果和产品质量,使整个测试过程更加高效、准确和可信,同时能有效地减少漏测风险,将测试成本降到最低。

精准测试是质量工程智能化建设的重要趋势,也是软件测试数字化的体现,让我们能够清楚地了解测试过程,达到我们所需要的、量化的测试目标(如测试覆盖率)。

2. 精准测试实现方法
实现精准测试,从原理看比较简单,关键要实现两项基本的工作:

能完成有效的代码依赖性分析,甚至扩展到业务依赖性分析,从而正确、精确识别每次代码修改所影响的代码范围,代码影响范围可以精确到类的方法、函数级或代码块;

建立代码和测试用例的映射关系,这样就可以根据识别对影响范围而推荐需要执行的测试用例。

如果要建立代码和测试用例的映射关系、或评测精准测试带来的效果,一般会借助代码的覆盖率分析来更好地了解测试用例执行了哪些代码,进一步明确哪些代码在测试执行中被覆盖、哪些代码在测试执行中没有被覆盖等。

3. 精准测试实践
在精准测试实施实践中,需要借助一些开源工具或自己开发一些平台来实现上述的两项基本工作。例如,可以借助代码覆盖率监测平台,收集程序运行时的动态代码覆盖率数据,以此为基础来构建用例知识库;用开源的JVM-sandbox(https://github.com/alibaba/jvm-sandbox)可以录制真实的系统运行情况(即流量录制)。

针对人工执行的测试用例和自动化测试脚本,也会有不同的处理。例如,人工执行的测试用例录制会利用内嵌到客户端的SDK,提供UI界面供用户进行录制操作并完成数据清理、采集、上报,然后在服务端实时解析。自动化测试脚本就比较简单,可以一个一个用例执行,收集覆盖率数据,很容易建立代码和用例的关联关系。

从代码层次的依赖性分析还可以扩展到调用链的分析,因为是在程序运行时所采集到的信息,更能真实反映代码的调用关系(依赖性),正像我们做代码依赖性分析时,从源代码上升到编译后的Binary字节码,更能真实反映方法/代码块调用关系。

还有,我们要为用例ID建立索引,提高用例推荐的效率。基于用例的关联方法(或代码块)、上下游调用链路以及对应覆盖率等信息,建设不同粒度不同版本的调用信息,提供测试用例索引服务、用例召回服务等。

在今天AI盛行的时代,我们自然可以引入知识图谱和机器学习算法进一步优化精准测试的效果。例如:

代码依赖关系结构可以通过图谱来存储,如“ (代码所属包)-[包含]->(文件)-[包含]->(函数)-[调用]->(函数)”这样的结构,在获取项目调用链原数据后,再深度遍历每一条调用链路采集每个包、文件、函数的对应关系,以及路径、所处位置、出参入参、注释、代码行等信息;

可以进一步采集“用例-函数调用链”权重,从而根据权重来推荐用例;

根据用例相似度可以排除一些相似度高的用例,如对所有用例进行分词、建立词库,使用tf-idf的方式计算用例与用例间的文本相似度,借助GCN(图卷积神经网络)计算用例相似性。

4. 常见问答
Q1:如何从0到1建设精准测试体系?

A1:可以基于Java的技术栈和相应的工具开始做、各个击破。先从开始先从覆盖率分析开发,了解测试用例的有效性,提升测试用例的质量和测试效率;然后再做代码依赖性分析,结合Code diff了解代码影响范围,慢慢建立代码和测试用例的依赖性关系,能做到比较精准、有效的测试;最后,向全自动化方式迈进,构建出高效的精准测试体系,即完成代码知识库、用例知识库的建设,完成流量录制、调用链自动分析、用例自动推荐和召回等工具平台的建设。

Q2:能否给出一套完整、详实、可复用的精准测试方案?想要了解更多的是可以用哪些开源的工具来构建这个精准测试的平台?如何形成工具链能够支持精准测试的快速实施?

A2::前面介绍的字节跳动、优酷度已实现完整的落地方案,这得力于流量采集和代码分析这两个基础能力,流量采集可以基于开源的JVM-sandbox来做,虽然需要二次开发。代码分析,一方面可以借助code diff工具了解代码的变更,另方面可以借助AST类工具(Babel、jscodeshift以及esprima、recast、acorn、estraverse等)、覆盖率分析工具(如JaCoCo)、Java Dependence Analysis(JDA)+ Java自带的jdeps等方案进行代码依赖性分析。

Q3:精准化测试从1到N如何实现的,实现从一个团队到规模化复制?

A3:一旦建成精准测试体系(平台),从使用团队的收益出发,推广是比较容易的,因为收益是明显的,特别是当全自动化方式来运行精准测试,也可以配合一些统一的规则和流程,更重要的是精准测试平台和公司的研发平台要实现无缝对接,理想的情况下,和CI/CD流水线实现灵活的集成,让团队无感地使用起来。

Q4:精准测试只能用于回归,如何赋能新功能测试呢?

A4:因为回归测试用例是不断增加的,会达到一个巨量的水平,全量回归成本很大;同时新增/修改的代码量比较小,影响范围是有限的,没有必要运行所有的回归测试用例,凭经验去选用例会导致漏测,所以非常有必要做精准测试。而新功能比较有限,而为新功能写的测试用例都需要执行,所以一般无需“精准测试”策略。但是,借助精准测试平台,可以更好地完成测试覆盖率,提高测试用例的质量和测试结果的充分性。 而且新功能在下一个迭代就是旧功能,为其写的测试用例也变成了回归测试用例,所以新功能也需要在精准测试平台运行,获取代码、测试用例相关信息,完善代码知识库、用例知识库。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

文档获取方式:

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

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

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

相关文章

百胜中国,全面进击

“未来三年,每年净增约1800家新店。” 美股研究社关注到,2023年投资者日活动上,百胜中国根据2024至2026年的发展规划,启动了集团RGM2.0战略。 三年时间,门店数要达到20000家,平均每年新增门店约1800家&am…

【【萌新的SOC大学习之hello_world】】

萌新的SOC大学习之hello_world zynq本次hello world 实验需要 PS-PL Configuration 页面能够配置 PS-PL 接口,包括 AXI、HP 和 ACP 总线接口。 Peripheral IO Pins 页面可以为不同的 I/O 外设选择 MIO/EMIO 配置。 MIO Configuration 页面可以为不同的 I/O 外设具…

蓝牙核心规范(V5.4)11.2-LE Audio 笔记之LE Auido架构

专栏汇总网址:蓝牙篇之蓝牙核心规范学习笔记(V5.4)汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德,任何非CSDN看到的这篇文章都是盗版网站,你也看不全。认准原始网址。!!&#x…

event.stopPropagation()

现在有如下 当点击子按钮的时候会触发子事件,同时也会触发父事件, 如何阻止呢 handleDownload(event) { event.stopPropagation(); 。。。。。。。。。。 },

积跬步致千里 || 可视化动图展示

可视化动图展示 目前只能在 jupyter notebook 中测试成功 %matplotlib notebook import numpy as np import matplotlib.pyplot as plt import timen 500 data np.random.normal(0,1,n)fig plt.figure() ax fig.add_subplot(111)fig.show() fig.canvas.draw()for i in ra…

【新版】系统架构设计师 - 案例分析 - 信息安全

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 信息安全安全架构安全模型分类BLP模型Biba模型Chinese Wall模型 信息安全整体架构设计WPDRRC模型各模型安全防范功能 网络安全体系架构设计开放系统互联安全体系结构安全服务与安全机制…

LRU、LFU 内存淘汰算法的设计与实现

1、背景介绍 LRU、LFU都是内存管理淘汰算法,内存管理是计算机技术中重要的一环,也是多数操作系统中必备的模块。应用场景:假设 给定你一定内存空间,需要你维护一些缓存数据,LRU、LFU就是在内存已经满了的情况下&#…

go语言 rune 类型

ASCII 码只需要 7 bit 就能完整地表示,但只能表示英文字母在内的 128 个字符,为了表示世界上大部分的文字系统,发明了 Unicode ,它是 ASCII 的超集,包含世界上书写系统中存在的所有字符,并且为每个代码分配…

排队工会模式:电商营销的新趋势,让你的平台月流水过亿

排队工会模式是一种新型的电商营销模式,它利用产品利润分红的方式来吸引用户购买和推广,从而实现平台的流量和销量的增长。这种模式的核心是建立一个分红池,平台从每个产品的利润中拿出一定比例来充值分红池,然后按照用户的购买顺…

【yolov5】原理

Focus操作 anchors 先验框 其它 Yolov5的模型主要由Backbone、Neck和Head三部分组成。 Backbone:负责提取输入图像的特征。在Yolov5中,常见的Backbone网络包括CSPDarknet53或ResNet。这些网络都是相对轻量级的,能够在保证较高检测精度的同…

前端项目练习(练习-005-webpack-03)

学习前,首先,创建一个web-005项目,内容和web-004一样。(注意将package.json中的name改为web-005) 前面的代码中,打包工作已经基本完成了,下面开始在本地启动项目。这里需要用到webpack-dev-serv…

如何通过Gunicorn和Niginx部署Django

本文主要介绍如何配置Niginx加载Django的静态资源文件,也就是Static 1、首先需要将Django项目中的Settings.py 文件中的两个参数做以下设置: STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, static) 然后在宝塔面板中执行python manage.…

Simulink仿真模块 - Digital Clock

Digital Clock:以指定的采样间隔输出仿真时间 在仿真库中的位置为:Simulink / Sources 模型为: 说明 Digital Clock 模块仅以指定的采样间隔输出仿真时间。在其他时间,此模块保留输出的上一个值。要控制此模块的精度,请使用模块对话框中的 Sample time 参数。 当需要离散系…

S09-录入的数据快速分列

选中某一列数据,数据-》分列 确定分隔符

孜然单授权系统V1.0[免费使用]

您还在为授权系统用哪家而发愁?孜然单授权系统为您解决苦恼,本系统永久免费。 是的,还是那个孜然,消失了一年不是跑路了是没有空,但是这些都是无关紧要的,为大家带来的孜然单授权系统至上我最高的诚意&…

论文研究有哪些方法?

在写论文的的时候,选择合适的研究方法至关重要。好的研究方法会增加你论文的可信度和更具有科学性,为你的研究成果增添色彩。下面将介绍几种常用的研究方法,供大家参考学习。 1.文献综述法 多用于理论研究类论文写作。文献综述法是对某一领域…

微信小程序:uniapp解决上传小程序体积过大的问题

概述 在昨天的工作中遇到了一个微信小程序上传代码过大的情况,在这里总结一下具体的解决步骤,首先介绍一下,技术栈是使用uniapp框架HBuilderX的开发环境。 错误提示 真机调试,提示包提交过大,不能正常生成二维码&…

为什么PDF打开没有密码,但是不能编辑?

PDF文件在PDF编辑器中打开之后应该是可以直接编辑了的,打开PDF文件的时候没有提出要输入密码,可是进入文件后,不能编辑,比如下图: 提示文件受到限制,无法编辑。这就是因为设置了限制编辑。我们将限制取消就…

web前端项目案例实战

之前也有使用vite2vue3electronc创建桌面端项目,不过 vue-cli-plugin-electron-builder 脚手架插件构建的项目electron版本只有13.x。如今electron版本都到了24,显然不能再用之前的方法创建项目了。于是闲暇时间就捣鼓了electron24vite4搭建桌面程序&…

第5讲:v-if与v-show的使用方法及区别

v-if条件判断 v-if是条件渲染指令,它根据表达式的真假来删除和插入元素,它的基本语法如下: v-if “expression” expression是一个返回bool值的表达式,表达式可以是一个bool属性,也可以是一个返回bool的运算式 &#…