精准测试探索

一、背景

什么是精准测试?通常研发提测的需求有代码变更,针对研发的代码变更点以及关联点进行测试,我们称之为精准测试。

很多时候,对变更点、影响范围的评估并不是很准确,偶尔会出现影响范围评估不全或者影响范围评估过大的情况。对于影响范围不全,我们所执行的测试用例,就会出现覆盖不全的情况,导致部分功能漏测,进而产生线上问题。对于影响范围过大,我们所执行的用例会过多,占用大量时间来测试完全和本次提测无关的功能,浪费人力物力。因此在这里提出测试精准化。

对于精准化的测试,我们目前做了两部分探索,静态链路分析和增量代码覆盖率分析。

二、静态链路分析

1. 当前解决问题:

部分代码耦合度高,多业务之间存在方法依赖:由于代码框架问题,部分代码可扩展性不强,代码间耦合度高,随着接入的业务线增多,代码间的依赖关系越来越多。一个微小的改动,可能就会影响到其他不相干的业务线,而这种影响由于代码并不会报错,开发人员也无法及时评估到。

本次改动对其他业务线是否有影响,无法准确评估:测试人员一般是根据本次需求改动进行用例编写,无法评估代码的改动是否会影响到其他业务线。所以在用例评审阶段,产品、开发、测试人员均无法准确评估影响范围,这样就可能会导致本次需求上线完成后,等到其他业务发生调用错误,才发现业务被影响到了。

通过改动方法,生成对应上下游方法调用链,查看影响的上下游方法,帮助开发人员分析是否有未考虑到代码影响范围;帮助测试人员检查是否需要补充测试用例

2. 架构设计:

整体项目包括前端 UI 界面、codeDiff、maven 命令打包、静态链路生成、代码注释扫描、执行结果同步等几部分。提供界面化操作,使用者只需要提供应用名称以及提测分支,即可一键生成链路分析报告,包含改动方法数、改动方法关联上下游方法对应链路数,通过分析链路即可快速准确发现本次改动影响范围。

架构设计图如下:

图片

3. 使用效果:

截止到目前,风控业务线接入应用5个,评审需求7个,覆盖供应链金融,天盾,鉴权等业务线,后续会有更多业务接入。

三、增量代码覆盖率分析

提到覆盖率统计,我们最先想到的单元测试中的代码覆盖率,这也是通常我们最先接触的,但我们这里要做的是服务端的代码覆盖率,也是能够度量测试用例执行效果的一种统计。

做覆盖率度量的工具有很多,我们这里采用的是开源工具 jacoco,也是最常用的工具之一。

首先来看一下,我要做全量代码覆盖率统计,需要哪些步骤:

全量代码覆盖率统计

1. 启动服务

无论是 tomcat 启动,还是 springboot 启动,我们都需要修改启动脚本,将 JACOCO_AGENT 加入到 JAVA_OPTS 里,这样我们在启动应用服务的时候,自动加载 jacoco agent,并同时开始对我们所测试的服务进行监听,采集被测试类和方法的数据。

JACOCO_AGENT="-javaagent:/export/content/jacocoagent.jar=destfile=/export/content/jacoco/jacoco.exec,append=true,includes=com.*,output=tcpserver,address=0.0.0.0,port=8181"
  • 1

2. 执行测试用例

3. 生成 exec 文件

这里的 exec 文件,就是我们这次执行测试用例所覆盖类、方法的原始数据,通过 dump 指令来和服务端进行通信来进行采集。

java -jar org.jacoco.cli.jar dump --address 127.0.0.1 --port 8181 --destfile ./jacoco.exec
  • 1

4. 生成 report 文件

这里的 report 文件,就是我们全量的代码覆盖率的 jacoco 原始报告,通过 report 指令来生成。

java -jar org.jacoco.cli.jar report jacoco.exec --classfiles D:/workspace/git_code/code-domain/target/classes --sourcefiles D:/workspace/git_code/code-domain/src/main/java --html report --xml jacoco.xml --encoding utf8
  • 1

需要指定 class 文件和 source 文件,对于项目中有多个模块的情况,可以指定多个 classfiles 和 sourcefiles 路径。

这样我们就生成了 jacoco 原始的代码覆盖率报告,如下:

图片

增量代码覆盖率统计

那么对于增量代码覆盖率统计,我们还需要做哪些事情呢

启动服务、执行测试用例、生成 exec 文件,这些都不要做任何改变,但是在生成 report 报告之前,我们需要添加一些步骤:

a. 获取增量代码

通过 org.eclipse.jgit.api.Git 和 org.eclipse.jgit 来对我们所测试分支和 master 分支进行比对,生成 list,看看有哪些类、哪些方法有变更

b. 改造 org.jacoco.cli.jar 包

在 report 命令后扩展 --diffCode

@Option(name = "--diffCode", usage = "input String for diff", metaVar = "<file>")
String diffCode;
  • 1
  • 2

c. 执行 report,生成报告

java -jar org.jacoco.cli.jar report jacoco.exec --classfiles D:/workspace/git_code/code-domain/target/classes --sourcefiles D:/workspace/git_code/code-domain/src/main/java --html report --xml jacoco.xml --diffCode '[]' --encoding utf8
  • 1

图片

这样,我们就生成了只对增量代码进行染色的覆盖率报告。通过报告,我们就可以看出本次提测所修改的代码,是否被我们的测试用例覆盖到,以后我们可以有针对性的补充哪些用例,可以覆盖没有被覆盖的代码。

四、未来规划

目前只做到了静态链路分析以及增量代码覆盖率的统计,后面通过用例的执行生成出动态链路,可以更精准的匹配出用例和链路之间的关系,对于后面我们要做的用例推荐,有着更好的指导意义。

图片

相信精准测试的落地推广,可以更有效的保证我们的测试质量和提高我们的测试效率。希望各路大神留言讨论讨论。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保100%免费】
在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

《Docker 简易速速上手小册》第5章 Docker Compose 与服务编排(2024 最新版)

文章目录 5.1 理解 Docker Compose5.1.1 重点基础知识5.1.2 重点案例&#xff1a;部署 Flask 应用和 Redis5.1.3 拓展案例 1&#xff1a;多服务协作5.1.4 拓展案例 2&#xff1a;使用自定义网络 5.2 编排多容器应用5.2.1 重点基础知识5.2.2 重点案例&#xff1a;部署 Flask 应用…

【Vuforia+Unity】AR05-实物3D模型识别功能实现(ModelTarget )

不管是什么类型的识别Vuforia的步骤基本都是: 把被识别的物体转成图、立体图、柱形图,3D模型、环境模型,然后模型生成Vuforia数据库-导入Unity-参考模型位置开始摆放数字内容,然后参考模型自动隐藏-发布APP-识别生活中实物-数字内容叠加上去! 对于3D物体的识别,可以是虚…

跟着cherno手搓游戏引擎【26】Profile和Profile网页可视化

封装Profile&#xff1a; Sandbox2D.h:ProfileResult结构体和ProfileResult容器&#xff0c;存储相应的信息 #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void OnAttach()ove…

无线综合测试仪8960(E5515C)

无线综合测试仪8960&#xff08;E5515C&#xff09; 简述&#xff1a; 8960是美国安捷伦&#xff08;Agilent&#xff09;公司生产的手机综测仪&#xff0c;8960测试仪是一款E5515C主机&#xff0c;具有特定于技术的硬件选件和软件应用程序。有两个硬件选项&#xff0c;8960能…

当你使用ChatGPT时,选择合适的提示(prompt)是引导对话方向的关键

马斯克曾说&#xff0c;人生中最重要的事情&#xff0c;就是提出真正的好问题。 因此&#xff0c;我要开始接触某个新领域&#xff0c;并且开始要自主学习的时候&#xff0c;我首先要问自己这个问题&#xff1a; 我为什么要学这个&#xff0c;学这个的目的是为了创造什么&#…

x86使用execve执行一个elf文件并传递参数--代码思路分析

execve(const char *filename, char *const argv[ ], char *const envp[ ]) 视频教程以及实际代码可以看这一个教程 其他的需要的知识 GDT表 GDT表虚拟内存 页表 任务切换 fork实现 elf文件加载 这一个是一个Linux下面的标准接口 这一个的实际作用的是执行一个可执行文件 把当…

网络设备和网络软件

文章目录 网络设备和网络软件网卡交换机交换机的三个主要功能交换机的工作原理第二层交换和第三层交换交换机的堆叠和级联 路由器路由器工作原理 网关网关的分类 无线接入点(AP)调制解调器网络软件 网络设备和网络软件 网卡 网络接口卡又称网络适配器&#xff0c;简称网卡。网…

五种多目标优化算法(MOFA、NSWOA、MOJS、MOAHA、MOPSO)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤&#xff1a; 1. 定义问题&#xff1a;首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数&#xff0c;这些目标函数可能…

conda下tensorflow安装

conda create -n tf21 python3.7 conda activate tf21 conda install tensorflow-gpu2.1验证 import tensorflow as tf tf.test.is_built_with_cuda()

模版(初级)

一.泛型编程 当我们要写一个交换函数时&#xff0c;面对不同的类型&#xff0c;我们可能就需要向如下这么写&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double tem…

【随笔】固态硬盘数据删除无法恢复(开启TRIM),注意数据备份

文章目录 一、序二、机械硬盘和固态硬盘的物理结构与工作原理2.1 机械硬盘2.11 基本结构2.12 工作原理 2.2 固态硬盘2.21 基本结构2.22 工作原理 三、机械硬盘和固态硬盘的垃圾回收机制3.1 机械硬盘GC3.2 固态硬盘GC3.3 TRIM指令开启和关闭 四、做好数据备份 一、序 周末电脑突…

HQYJ 2024-2-26 作业

1.整理链表的代码 link.stack.h文件 #ifndef __LINK_STACK_H__ #define __LINK_STACK_H__ #include<stdio.h> #include<stdlib.h> typedef int datatype; typedef struct link_stack {datatype data;struct link_stack *next;}link_stack,*link_p; typedef struc…