精准测试(针对人工执行的测试用例和自动化测试脚本)

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

  • 很难保障无漏测:我们做了大量测试,但不清楚测得怎样,对软件上线后会不会出问题,没有信心;
  • 选择待执行的测试用例:面对大量的回归测试用例时,我们没有足够的时间完成测试,如何选择出有效的测试用例呢?虽然我们会有一些策略,如基于风险的测试策略、基于操作剖面的测试策略 或组合测试策略,但主要还是靠测试人员的经验,比较主观。

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

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

2. 精准测试实现方法

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

  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.hqwc.cn/news/520118.html

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

相关文章

[网络安全] PKI

一、PKI 概述 名称; 公钥基础设施 (Public Key Facility) 作用: 通过加密技术和数字签名保证信息安全 组成: 公钥机密技术、数字证书、CA、RA 二、信息安全三要素 机密性:确保仅信息发收双方 能看懂信息 完整性: 确保信息发收完整,不被破坏 …

深入浅出(二)MVVM

MVVM 1. 简介2. 示例 1. 简介 2. 示例 示例下载地址:https://download.csdn.net/download/qq_43572400/88925141 创建C# WPF应用(.NET Framework)工程,WpfApp1 添加程序集 GalaSoft.MvvmLight 创建ViewModel文件夹,并创建MainWindowV…

一款非常适合老中医用的《书剑中医电子处方软件简明版》

上了年纪的老中医,虽然经验丰富,但是电脑的基础都比较差,而开处方的软件通常又设计的太复杂,想用电脑开处方就非常困难,所以只好坚持手写开处方。最近,小编找到了一款非常简单的《书剑中医电子处方软件简明…

第五十一回 李逵打死殷天赐 柴进失陷高唐州-AI发展历程和常用框架

朱仝说只要杀了李逵就上梁山,柴进就劝李逵先在庄上住一段时间,先让朱仝、雷横和吴用回了梁山。 李逵在柴进庄上住了一个月,碰到柴进的叔叔柴皇城病重来信叫他去一趟,于是李逵就随着柴进去了高唐州。 柴皇城被殷天锡气死&#xf…

【语法】C++学习

注意 使用devc对vector初始化使用vector v1 {1, 2, 3, 4, 5}; 报错 解决 在编译器选项中加入以下代码 -static-libgcc -stdc11

3500/20 框架接口模块 本特利内华达机械状态监控

3500/20 框架接口模块 本特利内华达机械状态监控 描述 框架接口模块(RIM)是的主要接口 3500架。它支持专有协议,用于 配置机架并检索机器信息。这 RIM必须位于机架的插槽1中(靠近电源 用品)。 轮辋支持兼容的本特利内华…

chrome插件webRequest拦截请求并获取post请求体requestBody数据raw内容,解决中文乱码问题

详细使用说明可以看官方文档:https://developer.chrome.com/docs/extensions/reference/api/webRequest?hlzh-cn 拦截操作 想要通过浏览器插件拦截请求的话,需要在manifest.json里面添加webRequet权限: 拦截请求代码放在background.js里面…

Transformer中的FeedForward

Transformer中的FeedForward flyfish class PoswiseFeedForwardNet(nn.Module):def __init__(self, d_ff2048):super(PoswiseFeedForwardNet, self).__init__()# 定义一维卷积层 1,用于将输入映射到更高维度self.conv1 nn.Conv1d(in_channelsd_embedding, out_ch…

List之ArrayList、LinkedList深入分析

集合 Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口&…

Spring揭秘:ApplicationContextAware应用场景及实现原理!

内容概要 ApplicationContextAware接口能够轻松感知并在Spring中获取应用上下文,进而访问容器中的其他Bean和资源,这增强了组件间的解耦,了代码的灵活性和可扩展性,是Spring框架中实现高级功能的关键接口之一。 核心概念 它能用…

【深度学习笔记】优化算法——梯度下降

梯度下降 🏷sec_gd 尽管梯度下降(gradient descent)很少直接用于深度学习, 但了解它是理解下一节随机梯度下降算法的关键。 例如,由于学习率过大,优化问题可能会发散,这种现象早已在梯度下降中…

遥感与ChatGPT:科研中的强强联合

随着科技的飞速发展,人工智能(AI)已逐渐渗透到各个领域,为传统行业带来了前所未有的变革。其中,遥感技术作为观测和解析地球的重要手段,正逐渐与AI技术相结合,为地球科学研究与应用提供了全新的…