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

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

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

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

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

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

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

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

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

相关文章

【数据结构篇】堆

文章目录 堆前言基本介绍认识堆堆的特点堆的分类堆的操作堆的常见应用 堆的实现JDK 自带的堆手动实现堆 堆 前言 本文主要是对堆的一个简单介绍,如果你是刚学数据结构的话,十分推荐看这篇文章,通过本文你将对堆这个数据结构有一个大致的了解…

职业规划,什么是职业兴趣 - 我喜欢做什么?

能够在工作岗位上面做出成绩的人,都是结合自身兴趣,对职业进行合理规划的那一类。尤其是步入中年以后,能够创造出巨大价值的人,无一例外都是喜欢自己职业的人。没有将兴趣融入工作的人,只能够忍受默默无闻地活着&#…

Unity 内存性能分析器 (Memory Profiler)

一、 安装 安装有两种方式一: add package : com.unity.memoryprofiler方式二: From Packages : Unity Registry 搜索 Memory Profiler 二、 使用 打开:Windows - > Analysis - > Memory Profiler 打开MemoryProfiler界面&#xff0…

蓝桥杯每日一题2023.9.30

蓝桥杯大赛历届真题 - C&C 大学 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于此题,首先想到了dfs进行一一找寻,注意每次不要将重复的算进去,故我们每次循环可以记录一个开始的位置,下一次到这个位置时,…

细胞机器人系统的概念

摘要 本文讨论了一种新型机器人系统的理论和工程的概念基础。该系统由协作完成任务的自主机器人单元组成。本文在描述了该系统与细胞自动机和神经网络的相关性和差异后,建立了该系统的基础属性及其对机器人单元结构的影响、它们操作的空间以及它们完成全局任务的算法…

深入理解操作系统- - 进程篇(1)

目录 进程解释: process in memory(进程在内存中包含什么) : 并发的进程: 进程定义: 个人定义: 书本定义: 进程状态: 进程何时离开CPU: 内部事件: 外部事件: 进…

C++ -- 学习系列 std::deque 的原理与使用

一 deque 是什么? std::deque 是 c 一种序列式容器,其与 vector 类似,其底层内存都是连续的,不同的地方在于, vector 是一端开口,在一端放入数据与扩充空间,而 deque 是双端均开口,都可以放…

pip version 更新

最近报了一个错: 解决办法: 在cmd输入“conda install pip” conda install pip 完了之后再输入: python -m pip install --upgrade pip ok.

C++ AB组辅导课

C AB组辅导课 蓝桥杯C AB组辅导课 第一讲 递归与递推 Acwing1、整数划分(递归)2、acwing92. 递归实现指数型枚举10凑算式(全排列)11李白打酒(全排列)12、棋牌总数(递归)13、剪邮票(递归)14、1050. 鸣人的影分身 (递归或动态规划(记忆化搜索))15、方格分割 (dfs思维&…

Win10自带输入法怎么删除-Win10卸载微软输入法的方法

Win10自带输入法怎么删除?Win10系统自带输入法就是微软输入法,这个输入法满足了很多用户的输入需求。但是,有些用户想要使用其它的输入法,这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软…

Oracle物化视图(Materialized View)

与Oracle普通视图仅存储查询定义不同,物化视图(Materialized View)会将查询结果"物化"并保存下来,这意味着物化视图会消耗存储空间,物化的数据需要一定的刷新策略才能和基表同步,在使用和管理上比…

【网络安全】网络安全之信息收集和信息收集工具讲解,告诉你黑客是如何信息收集的

一,域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集,比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具,汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境

参考的博客: Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter,并创建虚拟环境 理解和创建:Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址,可…

7.网络原理之TCP_IP(上)

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器:转发所有端口1.6.2交换机:MAC地址转换表转发对应端口1.6.3主机:网络分层从上到下封装1.6.4主…

django 实现:闭包表—树状结构

闭包表—树状结构数据的数据库表设计 闭包表模型 闭包表(Closure Table)是一种通过空间换时间的模型,它是用一个专门的关系表(其实这也是我们推荐的归一化方式)来记录树上节点之间的层级关系以及距离。 场景 我们 …

网页采集工具-免费的网页采集工具

在当今数字化时代,网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作,网页采集工具都扮演着不可或缺的角色。对于许多用户来说,寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

Spring Mvc的相关知识

一、初识MVC 1.Spring Mvc 是控制层的Spring框架,替换Servlet,除了它以外,还有 struct1和 struct2 区别: 1.struct1被struct2 取代 2.struct2:采用 prototype多例模式,内存消耗快,经常会出现内存…

C++ 类构造函数 析构函数

类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…

MySQL架构 InnoDB存储引擎

1. 什么是Mysql? 我们在开发的时候,我们都需要对业务数据进行存储,这个时候,你们就会用到MySQL、Oracal等数据库。 MySQL它是一个关系型数据库,这种关系型数据库就有Oracal、 MySQL,以及最近很火的PgSQL等。…

JSP学习笔记【三】——JQuery

前言 在写项目的时候需要动态对某组件的属性进行调整,我看网上的教程都是使用document.getElementById等,但我在eclipse编写.jsp文件的时候,却提示document cannot be resolved。由于我对jsp没有系统的了解以及无人可咨询,网上也…