dubbo接口自动化用例性能优化

news2024/12/27 14:16:52

 dubbo接口自动化用例性能优化

目录:导读

前言

优化本地调试时间

单用例执行时间的优化

提高并发

最后


前言

去年换了一个新部门,看了下当前的自动化用例的情况,发现存在三类性能问题:

  • 本地调试运行时等待时间较长,就算是一个简单的case,执行时间都需要1分钟以上
  • 单用例执行时间比较长,部分用例执行时间超过2分钟
  • 集成到CI中运行时,执行时间较长

对于上述三个问题花时间进行了一定程度的优化,总结如下

优化本地调试时间

通过调试可以发现,一个需要执行660ms的case,在执行前的初始化工作就需要消耗约1分半钟,那么就需要思考下能否减少这部分初始化时间了。

公司用的自动化框架是基于AbstractTestNGSpringContextTests的框架。AbstractTestNGSpringContextTests是一个spring集成testNg的工具,可以通过ApplicationContext加载bean。ApplicationContext实现的默认行为就是在启动服务器时将所有bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,applicationContext实例会创建并配置所有的bean。

如果是作为一个spring服务,在启动时将bean提前进行实例化,然后可以处理所有的请求,这样的做法是很合理的。但是作为本地调试,更关注是自己case运行时所需要的bean是否实例化,而不需要将所有bean进行实例化。

查阅了下spring相关文档,发现可以引入lazy-init来告诉ApplicationContext按需加载bean。
配置方式有两种:

  1. default-lazy-init参数,其配置形式如下:
    <beans default-lazy-init="true" > </beans>

  2. lazy-init参数,其配置形式如下:
    <bean id="stu" lazy-init=“true”></bean>

配置完成后,运行了一下,发现并没有速度上的提升,原因是之前编写时将大部分的bean的初始化放在了测试用例里的基类里面,导致启动时认为这些bean都需要初始化。

这说明要让lazy-init生效,提高单用例的启动速度,那就要尽可能少的使用不需要的bean,需要做一定改造:

  1. 将service/DAO初始化挪到测试用例里面。
  2. 去除不需要的多余的service/DAO。

按照上面的思路对用例进行了优化,可以将用例的初始化时间精简到30秒左右。

单用例执行时间的优化

为什么会出现很多的用例执行时间超过2分钟呢?做了一些分析和调试后,主要有几个原因:

  • 业务决定了服务之间很多是通过消息的方式进行传递,存在异步调用,所以需要等待再进行后续执行,为了用例的稳定性往往设置了过大的sleep time。
  • 一些数据准备和初始化操作不合理,无谓的耗时。

下面来看几个案例:

  1. 在beforeclass里面都会有一段初始化数据的操作,先调接口查询数据是否存在,不存在则进行初始化,导致每运行一个测试用例类都需要做一次对应操作。


    实际上这些数据初始化完后可以一直被使用,不需要多次检查,可以优化的地方是用个静态变量判断数据已初始化的话就不检查,或者将该操作设置为跑一次用例集只运行一次。

  2. 大量使用了sleep做等待,如果操作需要等待1s左右才生效,那么用sleep往往需要sleep2秒,所以sleep一般会造成50%左右的性能浪费。
    引入异步校验工具Awaitility对原有代码进行改写。

Awaitility的基本的语法为:

  • pollInterval:执行间隔
  • pollDelay:等待多久开始执行
  • atMoast:执行的超时时间
  • until()-> 执行其中的语句直到返回true或超时

这样的写法比较优雅简介,如果判断执行完成可以提前结束等待,避免时间浪费。

提高并发

当优化了单用例的运行时间后,虽然对总体自动化集成测试的运行速度有一定帮助,但当用例越来越多的时候,时间也会变得无法忍受,能想到的一个办法是增加用例的并发。

用例能够并发执行的前提是用例之间具有隔离性,一个用例的执行不会影响另一个用例的执行,比如我在店铺A下单和在店铺B下单这两个用例就不会有干扰,又比如我在店铺A创建商品和我在店铺A下单也不会有影响。
所以考虑用例并发的时候,需要先针对自己的业务特性进行一定程度的分组隔离。

在我们的案例中,考虑对店铺进行分组,用例并发用到的并发基本机制是testNG parallel="tests"/"class" thread-count=“N"
在实际执行中,分组的实施也会有两种模式,按case的纬度还是按照类的纬度:
1.使用店铺id分组进行并发,使用group=店铺id 维度
优点:任意维度扩展
缺点:每个case需要加@group
2.把不同测试类按店铺id分组,使用package/class维度
优点:改动简单
缺点:需要每个测试类只使用一个店铺id,缺乏扩展性,需要频繁改动配置文件

最后选择了按case纬度,因为现存的用例并未很好的按店铺id进行组织,比较散乱,使用类的纬度改动较大。

使用了两个并发以后,性能提升明显,时间从547s->270s。

最后

解决了一部分性能问题后,尤其是提高了用例并发以后,对用例稳定性也更高了。

和开发写代码需要考虑异常和容错处理一样,测试人员在自动化设计、实施等各阶段都需要考虑用例的稳定性问题:

  • 减少外部依赖。如果执行过程需要依赖其他系统的接口,那么其他系统发生了变更或故障就会影响自身用例的进行。可以考虑通过预先生成的数据来替代调用外部接口生成数据在用例中使用。第三方接口的调用可以考虑mock
。
  • 预置数据代替创建过程。由于操作越多稳定性越低,使用预置数据而不是实时生成它,速度更快,稳定性更高。
  • 使用不同维度进行隔离。通过隔离,用例执行失败的脏数据就不会影响其他用例。
  • 调优:超时、等待时间。线上超时时间设置的比较短,测试环境的机器配置不如线上,需要适时调大超时和等待时间来保证接口调用不会超时。
  • 防御式编程。编写测试代码时不能假设数据已存在或者没有脏数据残留,所以预先的判断和清理很重要,比如检查到数据缺失就实时修复、用例运行之前考虑清除临时数据等。
  • 定位并解决不稳定的问题。有时候偶现用例失败,可以考虑给被测应用增加日志,同时持续多次运行用例多次(如 testNg 里增加threadPoolSize=1, invocationCount=50)来复现问题,最终解决问题。

写在最后

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

看到这篇文章的人有觉得我的理解有误的地方,也欢迎评论和探讨~

你也可以加入下方的的群聊去和同行大神交流切磋

 

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

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

相关文章

C++学习记录——팔 内存管理

文章目录1、动态内存管理2、内存管理方式operator new operator delete3、new和delete的实现原理1、动态内存管理 C兼容C语言关于内存分配的语法&#xff0c;而添加了C独有的东西。 //int* p1 (int*)malloc(sizeof(int));int* p1 new int;new是一个操作符&#xff0c;C不再需…

【工具】图片和PDF批量区域OCR识别图片文字并重命名,如何批量图片识别文字并将识别的文字改名该图片

前段时间接到一个棘手的难题&#xff08;识别图片文字&#xff0c;将图片文件名改成该文字&#xff09; 因为不解决就得手动挨个挨个输入然后把文件命名好 今天又一个文件需求是这样的 图上有姓名文字&#xff0c;要识别出来改成每一张图跟这个一样&#xff0c;有的人说了缩…

学习笔记——吴恩达《神经网络与深度学习》

神经网络与深度学习1. 基础知识神经网络用神经网络进行监督学习2. 神经网络基础知识二分分类logistic回归logistic回归损失函数梯度下降法导数计算图logistic回归中的梯度下降法m个样本的梯度下降向量化Python中的广播3. 浅层神经网络神经网络概述神经网络表示计算神经网络的输…

Android自动化测试——Monkey

本来是做Web后端的&#xff0c;来公司实习变成微信小程序前端了&#xff0c;到这周变成Android APP测试人员了&#xff0c;也是微醺啊。 由于对手工测试终究是有些抵触&#xff0c;所有昨天小试了一下不用写代码的自动化压力测试&#xff0c;在此记下我的心得。 一、Monkey与…

TOOM互联网舆情监测中心,互联网舆情监测系统为何出现以及由来?

互联网舆情监测中心是指负责收集、分析和评估互联网上的舆情信息的组织或机构&#xff0c;旨在帮助政府、企业、媒体和其他相关组织了解公众对特定话题的看法、情感和态度&#xff0c;并采取相应的措施应对和管理舆情事件&#xff0c;TOOM互联网舆情监测中心&#xff0c;互联网…

Hudi-集成Spark之spark-shell 方式

Hudi集成Spark之spark-shell 方式 启动 spark-shell &#xff08;1&#xff09;启动命令 #针对Spark 3.2 spark-shell \--conf spark.serializerorg.apache.spark.serializer.KryoSerializer \--conf spark.sql.catalog.spark_catalogorg.apache.spark.sql.hudi.catalog.Hoo…

leaflet 本地上传shp文件,在map上解析显示图形(058)

第058个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传shp文件,利用shapefile读取shp数据,并在地图上显示图形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果加载shapefile.js方式配置方式示例源代码(共126…

GBDT+LR

为什么需要GBDTLR 协同过滤和矩阵分解存在问题: 仅利用了用户与物品相互行为信息进行推荐&#xff0c; 忽视了用户自身特征&#xff0c; 物品自身特征以及上下文信息等&#xff0c;导致生成的结果往往会比较片面。 FFM 存在问题 FFM特征交叉能力有限&#xff1a;虽然 FFM 模型…

Excel里数字太长显示为科学计数法如何显示完整数字

Excel里数字太长显示为科学计数法如何显示完整数字 注意&#xff1a;以下测试都是在macos的Microsoft Excel for Mac的16.53版本中实际测试的&#xff0c;在windows中应该也是一样的。 一、问题描述 数字太长在Excel中会显示为E形式 有些值&#xff0c;比如身份证号、银行卡…

编译原理(第3版-王生原)课后习题答案-第三章

1.构造下列正规式相应的 DFA。(1)1(0|1) *101(2)1(1010* |1(010)*1) *0(3)a((a|b)* |ab*a)*b(4)b((ab)* bb)*ab答案&#xff1a;(2)(3)(4)略。 写1个(1)体现解题思路。2.已知 NFA ((x,yz),{0,1}M,{x},{z})&#xff0c;其中:M(x,0){z}, M(y,0){x,y}, M(z,0){x,z}, M(x,1){x}, M(…

Linux文件默认权限:umask

umask就是指定目前用户在建立文件或目录时候的权限默认值 查看方式有两种&#xff1a;一种可以直接输入umask&#xff0c;就可以看到数字类型的权限设置值&#xff0c;一种则是加入umask后加入-S&#xff08;Symbolic&#xff09;选项&#xff0c;就会以符号类型的方式来显示出…

HJY-E1A/4D AC220V数字式交流【电压继电器】

系列型号 HJY-2B-2H2D DC220V欠电压继电器 HJY-1A-2H2D DC220V过压继电器 一、用途 本系列电压继电器为瞬时动作特性&#xff0c;用于发电机&#xff0c;变压器&#xff0c;输电线路的继电保护装置中作为过压或欠压的闭锁启动元件。 二、特点 (1).采用拨盘设定;或数码管显…

Spring Batch ItemReader组件-读数据库

目录 引言 数据准备 游标方式 分页方式 转视频版 引言 接着上篇&#xff1a;Spring Batch ItemReader组件-Json文件&#xff0c;了解Spring Batch 读取Json文件后&#xff0c;接下来一起学习一下Spring Batch 如何读数据库中的数据 数据准备 下面是一张用户表user&…

UnityShader35:光晕光效

一、光晕逻辑 光晕的逻辑很简单&#xff0c;就是在屏幕上画上一个一个方形的 Mesh&#xff0c;然后采样带 Alpha 通道的光晕贴图&#xff0c;效果就出来了&#xff0c;其中方形 Mesh 的大小、位置、纹理表现全部都由美术配置&#xff0c;因此效果好坏主要取决于光晕贴图以及是…

ESP8266点亮 0.96 英寸 OLED 显示屏,基于Arduino IDE

本指南介绍如何使用 Arduino IDE 将 0.96 英寸 SSD1306 OLED 显示屏与 ESP8266 结合使用。我们将向您展示如何编写文本、设置不同的字体、绘制形状和显示位图图像。安装 SSD1306 OLED 库 – ESP8266有几个库可用于使用 ESP8266 控制 OLED 显示屏。在本教程中&#xff0c;我们将…

IP地址与用户行为

IP地址能够解决网络风险和提高网络安全的原因是&#xff1a;所有的网络请求都会带有IP信息&#xff0c;是访问者的独立标识&#xff0c;另外ip地址的分配和管理比较严格&#xff0c;难以造假。另外ip属于网络层&#xff0c;可以轻松的对其进行阻断。现有的各种网络安全、负载均…

操作系统开发:BIOS/MBR基础与调试

这里在实验之前需要下载 Bochs-win32-2.6.11 作者使用的是Linux版本的&#xff0c;在Linux写代码不太舒服&#xff0c;所以最好在Windows上做实验&#xff0c;下载好虚拟机以后还需要下载Nasm汇编器&#xff0c;以及GCC编译器&#xff0c;为了能够使用DD命令实现磁盘拷贝&#…

树莓派 安装 宝塔linux面板5.9. 2023-2-14

一.环境 1.硬件环境: 树莓派3b , 8GB tf卡 ,micro usb电源 2.网络环境: 网线直连路由器 , 可访问互联网 3.软件环境: 树莓派操作系统 CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-2009-sda(linux) 系统刻录工具 Win32DiskImager (win) ip扫描工具 Advanced IP Scanne…

公司招聘:33岁以上的和两年一跳的不要,开出工资我还以为看错了...

导读&#xff1a;对于公司来说&#xff0c;肯定是希望花最少的钱招到最优秀的员工&#xff0c;但事实上这个想法是不太现实的&#xff0c;虽然如今互联网不太好找工作&#xff0c;但要员工降薪去入职&#xff0c;相信还是有很大难度的&#xff0c;很多人宁可在家休息&#xff0…

【Linux】进程的虚拟地址空间

文章目录现象引入进程地址空间进程地址空间的描述进程地址空间是怎么产生的进程地址空间的好处对开篇问题的解释现象引入 我们运行下面一段代码&#xff1a; #include <stdio.h> #include <unistd.h>int global_val 100;int main() {pid_t id fork();int count…