涨薪技术|JMeter异步接口测试实战

前言

异步接口是指在请求发送后,客户端并不会立即收到响应结果。与同步接口不同,异步接口需要等待一段时间后才能得到相应的结果。

通常情况下,异步接口可以通过消息队列或事件监听器来实现。当用户请求进入系统时,可以将任务提交给消费者或监听程序进行处理,并异步返回处理结果。

01同步调用

同步,就是调用某个东西时,调用方得等待这个调用返回结果才能继续往后执行。

它是一种阻塞型的调用方式,调用方总是要等到被调用方执行结束或者返回结果后才能继续往下执行;

它是一种单向的调用,只存在调用方调用被调用方的行为。

在同步调用模式下,接口的调用方会一直等待被调用方返回执行结果,除非调用超时。

同步调用模式是最常见的接口调用形式。

同步,就是实时处理,典型案例如打电话,我们在和一个人进行电话通信的时候,打电话是实时的,当你说话之后,对方立马就能收到,并对你做出回应。

02异步调用

和同步相反,调用方不会立刻得到结果,而是在调用发出后调用者可用继续执行后续操作,被调用者通过状态来通知调用者,或者通过回调函数来处理这个调用。

在异步调用模式下,接口调用方给被调用方发出指令,但不会等待结

果。

一般耗时比较长的处理工作会采用异步调用模式,调用方会给被调用方提供一个回调接口,意思是“你处理时间比较长,等你处理完以后,再调用这个回调接口,通知我结果吧!”

异步,就是分时处理,典型案例如收发短信,对方可能会稍等一会才会给你回信。一般我们只能跟一个人进行实时的通话,别人打进来会占线,而短信则没有这种情况,你可以同时接收多条短信,并逐步回信。

异步调用示例:

1. 下订单

举个简单的例子,在电商交易系统中,用户成单的时候,需要获取非常多的资源,除了要获取用户的基本信息、收货地址、商品信息、商品库存、卖家信息还要获取一些优惠、反垃圾信息,如果系统是同步调用的,那么我们只能够串行等待所有系统的返回,如果我们能改成异步通信,那么就能同时对多个系统发起查询。

2. 支付

常用的第三方支付,当用户支付完成之后,并不是立马接收到到用户的回调,而是先给用户返回成功,后续再由第三方支付进行回调。

图片

03异步单元测试方法

一般而言,对于那些实时性要求不高,但却计算密集或者需要处理大数据量的耗时较长的任务,或是有较慢 I/O 的任务,选择异步化是一个不错的选择。在系统层面,像引入消息中间件来解耦系统,将耗时长的任务放在中间件后异步执行。在方法层面,像把耗时较长的任务放到其他线程中去异步执行。

与测试同步系统或方法不同,当我们测试异步系统(端到端测试、集成测试)或异步方法的时候(单元测试),由于测试线程不会被异步任务线程阻塞而让测试变得不可控,概率性失败,以单元测试为例,这样写异步测试是不稳定的:

@Testpublic void testAsynchronousMethod() {callAsynchronousMethod();assertXXX(...); //异步任务可能仍未完成,这时assert可能会失败}

异步任务的两种类型:

  • 异步任务执行后对任务发起方或调用方有感知,比如发出一个事件或通知;

  • 异步任务执行后对任务发起方或调用方没有感知,只是改变了系统中的某些状态;

对异步任务的测试也分以上两种类型讨论。对于第一种,我们可以采用监听方式测试。​​​​​​​

import org.junit.Before;import org.junit.Test;public class ExampleTest {private final Object lock = new Object();@Beforepublic void init() {new Thread(new Runnable() {public void run() {synchronized (lock) { //获得锁monitorEvent(); //监听异步事件的到来lock.notifyAll(); //事件到达,释放锁}}}).start();}​​​​​​
@Testpublic void testAsynchronousMethod() {callAsynchronousMethod(); //调用异步方法,需要较长一段时间才能执行完,并触发事件通知/***事件未到达时由于init已经获得了锁而阻塞,事件到达后因init中的锁释放而获得锁,*此时异步任务已执行完成,可以放心的执行断言验证结果了*/synchronized (lock) {assertTestResult();}}}

这里的前提是事件通知会到来并被监听到,可要是不来呢(比如异常任务执行失败了)?我们就干等吗,其实我们还可以在测试中引入超时机制,这也引出了第二种类型的异常测试(可以称之为轮询方式),假设我们有如下一个异步系统,应用发消息到 NSQ 消息中间件,一个待测试的 Job 监听这个消息并在消息到达后处理消息:

图片

那我们怎么测试呢,站在端到端测试的角度,可以测试从应用Job 的链路,消息是应用直接构造的 NSQ (NSQ是一个基于Go语言的分布式实时消息平台)消息,也可以是 MySQL-binlog 经转化后构造的 NSQ 消息;站在集成测试的角度,我们可以缩小测试范围,直接在测试中构造 NSQ 消息,测试从消息中间件到 Job 的链路。长链路测试耗时长,且写测试前需要了解具体应用的消息触发逻辑,写测试也比较慢,无形中增加了很多测试成本。所以对于这样的系统,我们可以采用集成测试方法来测。​​​​​​​

@Testpublic void testAsynchronousJob() throws Exception {String msg = buildNsqMsg(); //构造NSQ消息nsqClient.send(TOPIC, msg, false); //发送Nsq消with().pollInterval(ONE_HUNDRED_MILLISECONDS).//100ms后开始检查and().with().pollDelay(10,MILLISECONDS). //此后每隔10ms检查一次await("description"). //描述信息atMost(1L, SECONDS). //1s超时时间until(() -> xxxService.getState() =="changed"); //业务相关的断言逻辑}

上述测试我们引入了 awaitility 工具类来做轮询操作,一个靠谱的轮询至少包含以下特性:

  • 超时机制,不可能一直轮询

  • 首次延迟轮询

  • 轮询频率

05异步接口测试实战

测试案例:提交视频异步检测任务

业务接口:/green/video/asyncscan

异步检测视频文件或视频流中是否包含违规内容。

支持检测的场景包括:视频智能鉴黄、视频暴恐涉政识别、视频图文违规识别、视频不良场景识别、视频logo识别、视频语音违规内容识别。

同时检测多个场景的情况下,将按照“每个场景的检测视频截帧数量×每个场景的单价”进行累加计费。如果您同时检测视频中的语音违规内容,则还将增加“视频时长×语音违规功能的单价”的费用。

异步检测结果需要通过调用结果查询接口进行查询(具体请参见查询视频异步检测结果)或者通过callback的方式进行接收,检测结果最多保留4个小时。具体的检测接口调用逻辑如下图所示。

图片

测试步骤:​​​​​​​

0. 在线程组下添加用户自定义变量,flag值为1;1. 构建提交视频异步检查任务的请求;2. 对该请求添加正则表达式后置处理器,提取服务器返回的taskId;3. 构建查询视频异步检测结果的请求,将提取的taskId作为参数发送;4. 对该请求添加正则表达式后置处理器,提取服务器返回的code;5. 对该请求添加JSR223后置处理器,代码如下:​​​​​​​
def code = vars.get('code')log.info('code is: ' + code)if( code == "280"){log.info('检测中...,请等30秒后继续查询')Thread.sleep(30000)}else if( code == "200"){log.info('检测完成,处理结束!')vars.put('flag',"0") // 停止继续查询}else if( code.startsWith('4')){log.info('参数错误,请重新提交检查任务!')vars.put('flag',"0")}else if( code.startsWith('5')){log.info('服务器错误,请线下联系技术人员处理!')vars.put('flag',"0")}​​​​​​​​​​​​​​
6. 添加while控制器,设置条件为:${__groovy("${flag}"=="1")}并将3.4.5步骤中的元素按顺序移到while控制器节点下。程序结构如下图所示:

图片

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

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

相关文章

SAP MDG —— MDG on S/4HANA 2023 FPS03 创新汇总

文章目录 MDG 基于SAP S/4HANA 2023 FPS03的创新BP/C/S:消息控制BP/C/S:手工分配数据控制者MDG-F:使用S/4扩展数据校验功能生成式AI可用于协助自定义对象的数据变更/同时可总结批量变更的内容 MDG 基于SAP S/4HANA 2023 FPS03的创新 由于从S…

数据库基础(MySQL)

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库 文件保存数据有以下几个缺点: 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质: 磁盘内存 为了…

第五天 Labview数据记录(5.2 Text文件读写)

5.2 Text文件读写 文本文件读写在程序中具有重要的作用,主要体现在以下几个方面: 1. 数据存储与持久化;2. 数据交换与共享;3. 日志记录;4. 配置管理;5. 数据备份与恢复;6. 用户输入与输出&…

校园快递助手小程序毕业系统设计

系统功能介绍 管理员端 1)登录:输入账号密码进行登录 2)用户管理:查看编辑添加删除 学生信息 3)寄件包裹管理:查看所有的包裹信息,及物流信息 4)待取件信息:查看已到达的…

Docker入门指南:Windows下docker配置镜像源加速下载

Windows下docker配置镜像源加速下载 docker的官方镜像是海外仓库,默认下载耗时较长,而且经常出现断站的现象,因此需要配置国内镜像源。 国内镜像源概述 国内现有如下镜像源可以使用 "http://hub-mirror.c.163.com", "http…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚前言📚页面效果📚指令…

数据结构:二叉树的链式结构及相关算法详解

目录 一.链式结构的实现 1.二叉树结点基本结构,初始化与销毁: 二.链式结构二叉树的几种遍历算法 1.几种算法的简单区分: 2.前序遍历: 3.中序遍历: 4.后序遍历: 5.层序遍历(广度优先遍历B…

动态规划/贪心算法

一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术,尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题,并保存这些子问题的解以避免重复计算,从而提高效率。 动态规划的核心思想 最优子结…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

软考中级-数据库-3.2 数据结构-数组和矩阵

数组 一维数组是长度固定的线性表,数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。 例如一维数组a[5][a1,a2,a3,a4,a5] 二维数组a[2][3]是一个2行2列的数组 第一行[a11,a12,a13] 第二行[a21,a22,a23…

android亮灭屏流程分析

前言 亮灭涉及的东西非常多,因此单独写一个文档,进行详细说明,亮灭屏包括的东西不只是亮灭屏,还包括亮度调节、屏幕状态变化等东西。本文仅作学习使用,不涉及商业,侵权请联系删除。 framework层的学习链接…

V4L2框架基础

一、V4L2视频设备驱动基础 1.V4L2是专门为Linux设备设计的整合视频框架(其主要核心在Linux内核,相当于Linux操作系统上层的视频源捕获驱动框架)。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2驱动框架能够支持多种类型&#x…

C# 多线程

概述 进程和线程 进程:指在系统中运行的一个应用程序。 线程:进程中的一个执行任务。一个进程至少有一个线程,一个进程可以有多个线程,多个线程可共享数据。 多线程 多线程:在一个程序中同时运行多个线程&#xff0…

突破光学成像局限:全视野光学血管造影技术新进展

全视野光学血管造影(FFOA)作为一种实时、无创的成像技术,能够提取生物血液微循环信息,为深入探究生物组织的功能和病理变化提供关键数据。然而,传统FFOA成像方法受到光学镜头景深(DOF)的限制&am…

Deepgram推出Nova-3 Medical,AI语音转录助力医疗行业

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

centOS 环境 安装redis方法

一、准备centOS环境 参考文章:Hyper-V 安装CentOS7_代码草率了的博客-CSDN博客 二、redis官网 地址:Download | Redis 演示版本为?redis-5.0.14.tar.gz 三、redis源码编译 登录后创建soft目录 进入目录使用wget下载所需资源包 命令:w…

[51 单片机] --串口编程

1,通讯方式基本概念 1,按照 --> 数据传送方式串行通讯:使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度,串行通信的特点:传输线少,长距离传送时成本…

Golang的微服务服务发现机制

## 1. Golang微服务服务发现机制 微服务架构已经成为当今软件开发的主流趋势,它能将复杂的单体应用拆分成小而独立的服务单元,实现更快的开发、部署和扩展。在微服务架构中,服务发现是非常重要的一环,它能够实现服务之间的自动发现…

Python 创建地形图

原始地 DEM。 火山口湖 (OR) 区域的起始 DEM。数据来自 NASA DEM 本身非常美丽,但我们先进行分层。 将自定义色彩图应用于 DEM 对于我在 ArcGIS Pro 版本中所做的初始高程样式着色,我使用了“高程 #7”。在 matplotlib 中可用的标准颜色图中&#xff…

《Operating System Concepts》阅读笔记:p180-p187

《Operating System Concepts》学习第 20 天,p180-p187 总结,总计 8 页。 一、技术总结 1.forke-join A strategy for thread creation in which the main parent thread creates (forks) one or more child threads and then waits for the children…