1. 接口测试过程中的痛点

  1. 接口的内容都是在yapi上,接口的内容都是以表格的形式呈现。在接口测试过程中,需要将表格形式的入参,手动敲成JSON格式,并且需要跟进字段类型,编辑字段值的形式。过程较为麻烦。

  2. 使用postman进行接口测试时,使用一个参数测试后,需要重新编辑参数进行下一个用例的执行,不能批量进行接口的调用。

  3. 自动化脚本每次都是需要人一行行写,有时有些脚本还不太熟练

2. 解决的方法

在大模型日渐流行的时代,就考虑是否可以使用大模型来简化上边的痛点,提高工作中的效率。于是,进行了以下的实践过程。

3. 开启探索之旅:

3.1 文本 API

与deepseek交互--提示词信息

URL:https://xxxx

请求方法:post

请求头:{

"Content-Type": "application/json"

”Authorization“:”xxxxx“

}

请求体:{

"storeCode": "",

"storeName": "",

"mdCode": "",

"mdName": "",

"queryKey": "",

"regionCode": [370212,370214],

"pageNum": 1,

"pageSize": 10

}

响应格式: JSON

响应状态码: 200

示例响应:

测试场景:

正常场景:入参有"regionCode": [370212,370214],pageNum": 1, "pageSize": 10。

异常场景:入参都为空。

断言要求:状态码为 200

生成的脚本

import requests
import pytest# 基础 URL
BASE_URL = "https://xxxxx"# 请求头
HEADERS = {"Content-Type": "application/json","Authorization": "xxxxx"# 正常场景测试
def test_query_for_design_success():# 请求体payload = {"storeCode": "","storeName": "","mdCode": "","mdName": "","queryKey": "","regionCode": [370212, 370214],"pageNum": 1,"pageSize": 10}# 发送 POST 请求response = requests.post(BASE_URL, json=payload, headers=HEADERS)# 断言assert response.status_code == 200, f"预期状态码为 200,实际为 {response.status_code}"assert isinstance(response.json(), dict), "响应体应为 JSON 格式"# 异常场景测试
def test_query_for_design_failure():# 请求体(所有参数为空)payload = {"storeCode": "","storeName": "","mdCode": "","mdName": "","queryKey": "","regionCode": [],"pageNum": 1,"pageSize": 10}# 发送 POST 请求response = requests.post(BASE_URL, json=payload, headers=HEADERS)# 断言assert response.status_code == 200, f"预期状态码为 200,实际为 {response.status_code}"assert isinstance(response.json(), dict), "响应体应为 JSON 格式"# 运行测试
if __name__ == "__main__":pytest.main()

输出结果

总结

1.使用大模型进行脚本生成时,尽可能的描述清晰接口的组成部分的内容。描述的越详细可以输出的更精准

2.测试场景,可以根据实际的测试需要,进行入参的赋值。生成固定参数的测试脚本

3.断言形式可以多种形式,选择自己需要的形式。比如返回值,返回code等

单接口、固定参数的接口自动化脚本的生成属于比较简单,并且最容易上手操作的一个场景。

不理想的方面:很多接口信息在YAPI上,每次整理上面格式都需要手动操作,比较耗时耗力。

3.2 deepseek--快速生成入参格式

背景

在用postman或者其他工具进行接口测试,或者利用大模型进行接口自动化脚本生成时, 都需要手动去编写入参格式,在有大量入参的情况下,需要耗费较多的时间去编写入参,就思考能不能用大模型来做这个枯燥又麻烦的工作。

示例接口

yapi:https://xxxxxx

入参:

学习历程

1.从yapi上进行数据的摘抄,比较繁琐,所以我直接截图下来。将图片扔给了deepseek。

提示词:“根据名称,类型,生成入参格式”,输出了符合条件的入参格式。并且会根据字段的类型,给了每个字段一个实例。------此次为成功得到自己想要的结果的提示词

{"uclUserInfo": {"ucld": 12345,"memberId": 67890,"email": "user@example.com","mobile": "1234567890","userName": "DesignerName","status": 1},"roleList": [{"roleCategory": "Category1","roleCode": "RoleCode1","roleName": "RoleName1"}],"mdlList": [{"mdCode": "MD001","mdName": "MDName1"}],"childAccountList": [{"storeCode": "Store001","accountId": 111,"nickName": "Nick1","accountName": "Account1","accountStatus": 1}]
}

总结

本次文章里提到的接口,属于比较典型的一种接口,拥有繁琐的入参,在进行手工编写入参的时候,经常性的出现类似于字段拼错,类型输错,格式不对等人为失误的情况。通过这种方式的尝试,能够快速和准确的生成,接口需要的入参格式。极大的缩减了自己手动编写的时间,以及准确性。是一种较为简便快捷的应用方案。

3.3 一步生成测试脚本

yapi接口

让deepseek进行输出:提示词:

根据入参的body,生成python自动化测试脚本

import requests
import json# 定义 API 的 URL
url = "https://xxxxxx"# 定义请求头
headers = {"Content-Type": "application/json"
}# 定义请求体
body = {"pageNum": 1,"pageSize": 10,"storeCode": "STORE123","mdCode": "MD123","mobile": "13800138000","accountId": 12345,"roleType": "0","roleStatus": "0"
}# 发送 POST 请求
response = requests.post(url, headers=headers, data=json.dumps(body))# 打印响应状态码和响应内容
print(f"响应状态码: {response.status_code}")
print(f"响应内容: {response.json()}")# 断言响应状态码是否为 200
assert response.status_code == 200, f"预期状态码为 200,实际为 {response.status_code}"print("测试通过!响应状态码为 200。")

入参的值,需要进行手动的修改。改为自己需要的入参值。后续可以针对入参进行参数化处理

扩展

  • 如果需要测试多个场景,可以将 body 参数化,使用循环或数据驱动的方式测试不同的输入组合。

  • 可以将响应内容进一步解析,验证具体的字段值是否符合预期。

3.4 参数化

方法 1:使用列表或字典存储多组参数

将多组 body 参数存储在一个列表或字典中,然后通过循环遍历每组参数发送请求。

import requests
import json# 定义 API 的 URL
url = "https://xxxxx"# 定义请求头
headers = {"Content-Type": "application/json"
}# 定义多组 body 参数
test_cases = [req:{ "pageNum": 1,"pageSize": 10,"storeCode": "STORE123","mdCode": "MD123","mobile": "13800138000","accountId": 12345,"roleType": "0","roleStatus": "0"},rsp:{"asas":123123}{"pageNum": 1,"pageSize": 10,"storeCode": "STORE123","mdCode": "MD123","mobile": "13800138000","accountId": 12345,"roleType": "0","roleStatus": "0"},{"pageNum": 2,"pageSize": 20,"storeCode": "STORE456","mdCode": "MD456","mobile": "13900139000","accountId": 67890,"roleType": "1","roleStatus": "1"},{"pageNum": 3,"pageSize": 30,"storeCode": "STORE789","mdCode": "MD789","mobile": "13700137000","accountId": 54321,"roleType": "0","roleStatus": "0"}
]# 遍历每组参数并发送请求
for index, body.res in enumerate(test_cases, start=1):print(f"正在测试第 {index} 组参数: {body}")# 发送 POST 请求response = requests.post(url, headers=headers, data=json.dumps(body))# 打印响应状态码和响应内容print(f"响应状态码: {response.status_code}")print(f"响应内容: {response.json()}")# 断言响应状态码是否为 200assert response.status_code == 200, f"第 {index} 组参数测试失败,预期状态码为 200,实际为 {response.status_code}"print(f"第 {index} 组参数测试通过!\n")print("所有测试用例执行完毕!")
方法 2:从外部文件读取参数

将测试参数存储在外部文件(如 JSON 文件、CSV 文件或 Excel 文件)中,然后在脚本中读取文件内容并参数化。

示例:从 JSON 文件读取参数

1. 创建一个 JSON 文件 test_data.json,内容如下:

[{"pageNum": 1,"pageSize": 10,"storeCode": "STORE123","mdCode": "MD123","mobile": "13800138000","accountId": 12345,"roleType": "0","roleStatus": "0"},{"pageNum": 2,"pageSize": 20,"storeCode": "STORE456","mdCode": "MD456","mobile": "13900139000","accountId": 67890,"roleType": "1","roleStatus": "1"}
]

2.修改脚本,从 JSON 文件中读取参数:

import requests
import json# 定义 API 的 URL
url = "https://xxxxx"# 定义请求头
headers = {"Content-Type": "application/json"
}# 从 JSON 文件中读取测试数据
with open("test_data.json", "r", encoding="utf-8") as file:test_cases = json.load(file)# 遍历每组参数并发送请求
for index, body in enumerate(test_cases, start=1):print(f"正在测试第 {index} 组参数: {body}")# 发送 POST 请求response = requests.post(url, headers=headers, data=json.dumps(body))# 打印响应状态码和响应内容print(f"响应状态码: {response.status_code}")print(f"响应内容: {response.json()}")# 断言响应状态码是否为 200assert response.status_code == 200, f"第 {index} 组参数测试失败,预期状态码为 200,实际为 {response.status_code}"print(f"第 {index} 组参数测试通过!\n")print("所有测试用例执行完毕!")
方法 3:动态生成参数

如果需要动态生成参数,可以使用 Python 的 faker 库或随机生成数据。

示例代码

import requests
import json
from faker import Faker# 初始化 Faker
fake = Faker()# 定义 API 的 URL
url = "https://xxxxxx"# 定义请求头
headers = {"Content-Type": "application/json"
}# 动态生成测试数据
def generate_test_data(num_cases):test_cases = []for _ in range(num_cases):body = {"pageNum": fake.random_int(min=1, max=10),"pageSize": fake.random_int(min=10, max=50),"storeCode": fake.bothify(text="STORE###"),"mdCode": fake.bothify(text="MD###"),"mobile": fake.phone_number(),"accountId": fake.random_int(min=10000, max=99999),"roleType": fake.random_element(elements=("0", "1")),"roleStatus": fake.random_element(elements=("0", "1"))}test_cases.append(body)return test_cases# 生成 5 组测试数据
test_cases = generate_test_data(5)# 遍历每组参数并发送请求
for index, body in enumerate(test_cases, start=1):print(f"正在测试第 {index} 组参数: {body}")# 发送 POST 请求response = requests.post(url, headers=headers, data=json.dumps(body))# 打印响应状态码和响应内容print(f"响应状态码: {response.status_code}")print(f"响应内容: {response.json()}")# 断言响应状态码是否为 200assert response.status_code == 200, f"第 {index} 组参数测试失败,预期状态码为 200,实际为 {response.status_code}"print(f"第 {index} 组参数测试通过!\n")print("所有测试用例执行完毕!")

4. 总结成功使用的方案

  1. 找到目标接口的yapi地址

  2. 截取含有header和body内容的截图

  3. 在deepseek上传截图,以及输入提示词

      url: https://xxxxxxx

      请求方法:post

      响应格式:JSON

      响应状态码:200

      测试场景:根据名称,类型生成入参格式

      断言:状态码为200

    1. 得到需要的目标脚本

    5. 后续研究的方向

    1.接口入参的自动生成(自动化场景生成)

    2.根据不同的CASE,生成不同的断言

    3.API-Agent搭建

    6. 团队介绍

    三翼鸟数字化技术平台-质量保障与测试团队」负责为各业务团队的产品交付提供质量保障。制定软件测试流程规范及准入准出标准保障业务正确性;开发自动化测试工具支撑性能测试、兼容性测试、异常测试等测试活动保障产品稳定性;通过代码扫描,权限合规检查等专项测试保障产品符合安全标准;搭建Tone测试一体化平台实现Mock服务,流量录制及回放等提效关键能力,并与Z·ONE平台协同实现软件交付全流程提效。

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

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

    相关文章

    Boris FX Samplitude Suite 2025.0.0 音频录制/编辑和母带处理

    描述 Samplitude是一款专业的DAW,用于录音、编辑、混音和母带制作。通过基于对象的编辑和多轨录音,可以更快地进行创作。 原生杜比全景声 (Dolby Atmos) 支持 体验音频制作的新维度。由于集成了杜比全景声 (Dolby Atm…

    龙虎榜——20250827

    上证指数今天放量下跌,收大阴线跌破5天均线,形成强势顶分型,日线转回调的概率很大。目前均线依然是多头排列,但是离60天均线较远,有回归均线的需求。深证指数今天放量收长上影的大阴线,日内高点12665.36&am…

    项目智能家居---OrangePi全志H616

    1 需求及项目准备 语音接入控制各类家电,如客厅灯、卧室灯、风扇。 Socket编程,实现Sockect发送指令远程控制各类家电。 烟雾警报监测, 实时检查是否存在煤气泄漏或者火灾警情,当存在警情时及时触发蜂鸣器报警及语音播报。 控制人脸识别打开房门功能,并语音播报识别成功或…

    项目概要设计说明文档

    一、 引言 (一) 编写目的 (二) 范围 (三) 文档约定 (四) 术语 二、 项目概要 (一) 建设背景 (二) 建设目标 (三&a…

    解决mac brew4.0安装速度慢的问题

    Homebrew 4.0 版本的重大变化自 Homebrew 4.0 版本起,官方弃用了传统的 homebrew-core Git 仓库模式,改为通过 API(formulae.brew.sh) 获取软件包元数据。因此,手动替换 homebrew-core 仓库的目录可能不再存在。目录结…

    AI需求优先级:数据价值密度×算法成熟度

    3.3 需求优先级模型:ROI(数据价值密度算法成熟度) 核心公式: AI需求ROI = 数据价值密度 算法成熟度 总优先级 = ROI 伦理合规系数 (系数范围:合规=1.0,高风险=0~0.5) 一、数据价值密度:从数据垃圾到石油精炼 量化评估模型(融合3.1节数据可行性) 维度 评估指标…

    手写MyBatis第37弹: 深入MyBatis MapperProxy:揭秘SQL命令类型与动态方法调用的完美适配

    🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

    GD32VW553-IOT 测评和vscode开发环境搭建

    GD32VW553-IOT 测评和vscode开发环境搭建 1. 背景介绍 iCEasy商城的产品, Firefly Workshop 萤火工厂的样片, 是一款基于GD32VW553 MCU的开源硬件, 这款MCU内置了32bit的RISC-V内核, 支持双模无线WIFI-6和BLE-5.2, 最高主频可达160Mhz. 本人曾在公司参与开发了一款基于RISC-V内…

    斯塔克工业技术日志:用基础模型打造 “战甲级” 结构化 AI 功能

    引子 在斯塔克工业的地下研发实验室里,弧光反应堆的蓝光映照着布满代码的显示屏,工程师詹姆斯・“罗迪”・罗德斯正对着一堆 AI 生成的杂乱食谱皱眉。 上周他刚搞定基础模型(Foundation Models)的文本生成,让 AI 能像…

    如何解决pip安装报错ModuleNotFoundError: No module named ‘click’问题

    【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘click’问题 摘要 在日常Python开发中,pip install 报错 ModuleNotFoundError: No module named click 是一个非常常见的问题,尤其是在…

    PLC_博图系列☞基本指令”S_PULSE:分配脉冲定时器参数并启动“

    PLC_博图系列☞基本指令”S_PULSE:分配脉冲定时器参数并启动“ 文章目录PLC_博图系列☞基本指令”S_PULSE:分配脉冲定时器参数并启动“背景介绍S_PULSE: 分配脉冲定时器参数并启动说明参数脉冲时序图示例关键字: PLC、 西门子、 …

    【大模型】Qwen2.5-VL-3B模型量化以及运行测试,保留多模态能力(实践版)

    目录 ■获取原始模型 ■构建llama.cpp ■转换模型到GGUF ▲视觉模块转换 ▲llm模块转换 ▲llm模块量化 ▲推理测试 ■报错处理 以下是几种多模态模型量化方案的简要对比: 特性 llama.cpp GGUF 量化

    C语言 | 高级C语言面试题

    侧重于内存管理、指针、编译器行为、底层原理和编程实践。 C语言面试 一、核心概念与深度指针题 1. `const` 关键字的深度理解 2. volatile 关键字的作用 3. 复杂声明解析 二、内存管理 4. `malloc(0)` 的行为 5. 结构体内存对齐与大小计算 三、高级技巧与底层原理 6. setjmp()…

    【deepseek问答记录】:chatGPT的参数数量和上下文长度有关系吗?

    这是一个非常好的问题,它触及了大型语言模型设计的核心。 简单来说:参数数量和上下文长度在技术上是两个独立的概念,但在模型的设计、训练和实际应用中,它们存在着深刻且重要的联系。 我们可以从以下几个层面来理解它们的关系&…

    5GNR CSI反馈 TypeI码本

    5GNR CSI反馈 TypeI码本 前言 最近孬孬在学习5gnr中的CSI反馈内容,对于目前的5GNR主要是基于码本的隐式反馈机制,在NR中主要是分为 TypeI 和 TypeII,对于TypeI是用于常规精度的,对于TypeII更为复杂,更多的适用于多用户…

    使用appium对安卓(使用夜神模拟器)运行自动化测试

    环境安装 基本环境安装 安装node.js 下载地址:Node.js — Run JavaScript Everywhere 安装Java JDK 下载地址:JDK Builds from Oracle 安装夜神模拟器 360上找下就能装,安装好后将夜神的bin目录,添加到系统变量的path中。 …

    用wp_trim_words函数实现WordPress截断部分内容并保持英文单词完整性

    在WordPress中,wp_trim_words函数用于截断字符串并限制单词数量。如果你希望在截断时保持单词的完整性(让单词显示全),可以通过自定义函数来实现。 以下是一个示例代码,展示如何修改你的代码以确保截断时显示完整的单…

    Codeforces Round 1042 (Div. 3) G Wafu! 题解

    Codeforces Round 1042 (Div. 3) G Wafu! 题解 题意:每一次操作删除集合中最小的元素 x,并产生新的 x - 1 个元素值分别为 1 2 3 … x - 1 放入集合之中。 每次操作一个数 x 可以使得最终答案乘上 x,问我们操作 k 次在模 1e9 7 的基础上最终…

    APP与WEB测试的区别?

    web与app核心区别:一个基于浏览器 ,一个基于操作系统这是所有区别的根源:Web测试:测试对象是网站,通过浏览器(Chrome,Firefox等)访问,运行环境核心是浏览器引擎;App测试:测试对象是应…

    2.渗透-.WEB运行原理-ZBlog安装(进一步理解数据库)

    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:微尘网校 上一个内容:1.渗透-.WEB运行原理(搭建一个WEB程序) 首先把服务运行起来 然后访问下图红框…