异步接口如何做接口自动化测试?

news/2025/2/20 19:47:58/文章来源:https://www.cnblogs.com/uncleyong/p/18717470

异步接口的自动化测试与同步接口有所不同,因为异步接口在发起请求后不会立即返回最终结果,通常需要额外的机制来等待和验证结果。

以下为你详细介绍异步接口自动化测试的实现步骤和方法:

1. 理解异步接口的工作模式

在进行测试之前,需要了解异步接口的工作原理。常见的异步接口实现方式有以下几种:

消息队列:请求被放入消息队列,后台服务从队列中取出消息进行处理。

回调机制:接口返回一个任务 ID,处理完成后通过回调通知客户端。

轮询机制:接口立即返回一个中间状态,客户端需要定期轮询接口获取最终结果。

2. 选择合适的测试框架

可以根据使用的编程语言选择合适的测试框架,例如:

Python:pytest、unittest。

Java:JUnit、TestNG。

3. 异步接口自动化测试的实现步骤

消息队列方式

发送请求:将请求数据发送到消息队列。

监听队列:启动一个消费者来监听队列中的处理结果。

验证结果:当接收到处理结果后,对结果进行验证。

Python 示例代码:

import pytest
import pika# 连接消息队列
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 定义队列
channel.queue_declare(queue='async_queue')def send_request(data):channel.basic_publish(exchange='',routing_key='async_queue',body=json.dumps(data))def receive_result():def callback(ch, method, properties, body):result = json.loads(body)# 在这里进行结果验证assert result['status'] == 'success'ch.stop_consuming()channel.basic_consume(queue='async_queue',on_message_callback=callback,auto_ack=True)channel.start_consuming()@pytest.mark.asyncio
def test_async_api():request_data = {'key': 'value'}send_request(request_data)receive_result()

 

回调机制方式

发送请求:调用异步接口,获取任务 ID。

设置回调:在回调函数中进行结果验证。

模拟回调:如果没有实际的回调服务,可以模拟回调来验证结果。

Python 示例代码:

import pytest
import requestsdef test_async_api_with_callback():# 发送异步请求,获取任务 IDresponse = requests.post('http://qzcsbj.com/async_api', json={'data': 'test'})task_id = response.json().get('task_id')# 模拟回调处理def callback(result):assert result['status'] == 'completed'# 假设这里有一个轮询机制来检查任务状态while True:status_response = requests.get(f'http://qzcsbj.com/check_status/{task_id}')status = status_response.json()if status['status'] == 'completed':callback(status)break

  

轮询机制方式

发送请求:调用异步接口,记录初始状态。

轮询接口:定期调用接口获取任务状态,直到任务完成。

验证结果:任务完成后,对结果进行验证。

Python 示例代码:

import pytest
import requests
import timedef test_async_api_with_polling():# 发送异步请求response = requests.post('http://qzcsbj.com/async_api', json={'data': 'test'})task_id = response.json().get('task_id')max_retries = 10retry_interval = 2for i in range(max_retries):status_response = requests.get(f'http://qzcsbj.com/check_status/{task_id}')status = status_response.json()if status['status'] == 'completed':assert status['result'] == 'expected_result'breaktime.sleep(retry_interval)else:pytest.fail("Task did not complete within the expected time.")

 

4. 错误处理和超时设置

在异步接口测试中,需要考虑错误处理和超时设置,避免测试无限期等待。例如,在轮询机制中,可以设置最大重试次数和重试间隔,当超过最大重试次数仍未获取到结果时,判定测试失败。

5. 并发测试

如果异步接口支持并发处理,可以进行并发测试,模拟多个请求同时发送,验证接口在高并发场景下的性能和稳定性。可以使用多线程或异步编程库来实现并发测试。

通过以上步骤和方法,可以有效地进行异步接口的自动化测试。

 

补充:异步接口回调机制

我们可以通过生活中的例子来通俗易懂地理解异步接口回调机制,就以去餐厅吃饭的场景为例。
常规同步接口情况(非异步)
在普通的餐厅里,你向服务员点了一道菜。点完菜之后,你啥都不能干,就只能坐在那儿眼巴巴地等着这道菜做好端上来,在这个菜没上之前,你没办法去做其他事情,比如去上个厕所或者和朋友聊聊天,直到菜上桌你才能接着做别的,这就类似于同步接口。程序发起一个请求后,必须等这个请求处理完返回结果,才能接着执行后续的代码。
异步接口回调机制情况
现在换一种场景,你去了一家比较高级的餐厅。当你点完菜后,服务员给了你一个带编号的小牌子,然后跟你说:“您先去休息区坐着,等菜做好了,我们会通过这个牌子上的编号通知您过来取菜。”
发起请求:在这里,你点菜的这个动作就相当于程序向异步接口发起请求。
获取任务标识:服务员给你的那个带编号的小牌子,就好比是异步接口返回给程序的任务 ID ,这个 ID 可以用来唯一标识你这次点菜的任务。
继续其他操作:拿到小牌子后,你不用一直干等着,而是可以去休息区坐着,和朋友聊聊天、看看手机,做其他你想做的事情。这就相当于程序在发起异步请求后,不用等待请求处理结果,而是可以继续执行后续的其他代码。
回调通知:过了一会儿,餐厅做好了你的菜,他们根据小牌子上的编号通过广播或者震动小牌子等方式通知你去取菜。这个通知的过程就类似于异步接口处理完任务后,通过回调机制通知程序结果已经处理好了。
处理结果:你听到通知后,就去取菜,然后享受美食。对应到程序里,就是程序收到回调通知后,去获取处理结果并进行相应的处理,比如显示结果、保存数据等。
代码层面简单示例(Python)
# 模拟异步接口
def async_api(task_id, callback):import timeimport threading# 模拟耗时操作def process():time.sleep(3)  # 模拟处理 3 秒钟result = f"Task {task_id} completed"callback(result)# 开启一个新线程来执行处理函数threading.Thread(target=process).start()# 回调函数
def handle_result(result):print(f"Received result: {result}")# 发起异步请求
task_id = 1
async_api(task_id, handle_result)# 程序可以继续执行其他代码
print("Continuing to do other things...")

  

在这个代码示例中,async_api 函数模拟了一个异步接口,它接收一个任务 ID 和一个回调函数作为参数。当调用 async_api 时,它会开启一个新线程来模拟耗时的处理操作,处理完成后会调用传入的回调函数 handle_result 来处理结果。在调用 async_api 之后,程序可以继续执行后续的代码,就像你在餐厅拿到小牌子后可以去做其他事情一样。

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

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

相关文章

【草原之歌】:守护绿色的律动与《草原法》的力量

在广袤的地球上,有一种风景以其独有的辽阔与壮美占据着人们的心灵,那就是——草原。它不仅是大自然赋予的生态宝库,也是许多民族文化的摇篮。然而,草原的保护与管理面临着诸多挑战,因此,《草原法》应运而生,成为了守护这片绿色律动的重要法律保障。今天,让我们一同探索…

清华大学最新力作:DeepSeek从入门到精通

清华大学最新力作:DeepSeek从入门到精通,文章中提到了微博、小红书、抖音、微信公众号等平台的提示语设计方案写文案、做策划、创作各平台内容都能用它找灵感、提效率。文章还讲了选模型和设计提示语的技巧真心建议大家读一读,学会用 DeepSeek,搞创作、做运营都能更上一层楼…

【每日一题】20250215

我只懂得一种活法,那就是找一件事坚持下去,以战胜生命的虚无。【每日一题】(多选)实验表明,可见光通过三棱镜时各色光的折射率 \(n\) 随着波长 \(\lambda\) 的变化符合科西经验公式,\(n=A+\frac{B}{\lambda^2}+\frac{C}{\lambda^4}\),其中 \(A\)、\(B\)、\(C\) 是正的常…

用IRFZ44N MOS管制作一个开关电路并测试其导通电压

用IRFZ44N NMOS管当开关管,设计一个开关电路,控制小灯泡的亮灭 下面是电路图,小灯泡大小为24V 10W图中R1是泄放电阻,因为GS间有结电容,如果没有加R1,在V2关断时,小灯泡不会立即熄灭,还会维持很长一段时间,明显不合理。 相比于三极管,MOS管能够承载的电流更大,更适用…

撑起计算机视觉半边天的ResNet【论文精读】

ResNet论文精读:深度残差学习如何重塑深度学习一、技术演进背景:深度网络的困境与突破 消失的梯度与退化问题 在ResNet提出之前,深度学习领域已通过VGGNet、GoogLeNet等模型验证了网络深度的重要性。然而,当网络深度超过20层时,研究者发现了一个反直觉现象:更深的网络反而…

2025多校冲刺省选模拟赛13

2025多校冲刺省选模拟赛13\(T1\) A. 逆序对 \(56pts\)原题: luogu P5972 [PA 2019] Desant部分分\(56pts\) :爆搜。点击查看代码 int a[50]; pair<int,ll>ans[50]; struct BIT {int c[50];int lowbit(int x){return x&(-x);}void add(int x,int val){for(int i=x;i…

使用 Git 命令和 Github 前须了解的知识

本文不包括 Git 命令的介绍与使用,只分享 Git 的关键概念与 Github 项目的基本工作流程。作者相信先了解它们对后续的学习和工作大有裨益。(如有错误和建议请大家评论告知)版本控制系统 VCS → Version Control System,版本控制系统 → 一个跟踪文件变化、记录修订情况、协…

leetcode hot 02

解题思路:找祖先从底向上递归后序遍历查找,遇到p,q或者空节点就直接返回对应值,当某个节点的左子树、右子树都返回了值,那么就说明该节点就是最近祖先节点,然后把该节点的值继续往上传,直到根节点返回结果。 /*** Definition for a binary tree node.* public class Tre…

Linux介绍及使用

一、linux介绍 1、Linux是一个免费、开源的操作系统,能多用户、多任务、支持多线程和多CPU的操作系统,相对windows更加稳定,在unix系统的基础上开发的系统; 注解:(1)免费:不要钱 (2)源代码公开 (3)多用户 :可以在不同用户操作 (4)多任务:同时执行多个任务 …

Maven 生命周期 Test 阶段遇到的一些问题

Q:无法使用@Test注解,报错 A:最初pom.xml中使用的Junit版本为3,Java 5于 2004 年发布,引入了注解作为语言的一部分。而Junit 3 是在这之前发布的,因此它无法使用注解,将pom.xml中的版本号改为<version>4.13.2</version>后问题解决,可使用@TestQ:在Maven启…

18. 信号

一、什么是信号在 Linux 中,信号是一种用于通知进程发生了某种事件的机制。信号可以由内核、其它进程或者命令行工具发送给目标进程。Linux 系统中由多种信号,每种信号都用一个唯一的数值表示。例如,常见的信号如下:SIGINT (2):这是当用户在终端按下 Ctrl+C 时发送给前台进…