利用OpenAI通过自然语言生成请求和解析响应进行API接口测试

API(应用程序编程接口)是现代软件开发的重要组成部分,它在客户端和服务器端之间传递数据。在测试中,如何快速生成不同的API请求,并验证响应数据,通常是测试工程师需要解决的难题。本文将探讨如何利用OpenAI,生成API请求,解析响应,并将其集成到测试框架中。

我们以一个简单的电商网站为例,假设该网站提供一个查询商品的API接口,测试工程师需要验证接口的行为。


场景背景

被测试的API接口
GET /api/products

接口功能:返回商品列表,支持按类别(category)、排序(sort)、数量限制(limit)进行查询。

请求示例

GET /api/products?category=electronics&sort=price_asc&limit=5

响应示例

{
  "products": [
    {"id": 1, "name": "Smartphone", "price": 199},
    {"id": 2, "name": "Laptop", "price": 999}
  ],
  "total_count": 2
}

目标是:

  1. 自动生成API请求参数。
  2. 验证响应内容是否符合预期。

步骤1:安装依赖

首先,我们需要安装OpenAI的Python库以调用GPT-3.5-Turbo模型:

pip install openai

步骤2:生成API请求

利用自然语言描述测试场景,GPT-3.5-Turbo可以生成符合测试需求的API请求。以下是一个代码示例,生成API请求的查询参数:

import openai

# 配置OpenAI API密钥
openai.api_key = "your_openai_api_key"

# 使用自然语言生成API请求参数
def generate_api_request(category, sort, limit):
    # 自然语言描述请求需求
    prompt = (
        f"Generate query parameters for an API request to fetch products. "
        f"The category is '{category}', sorted by '{sort}', and the limit is {limit} products."
    )
    
    # 调用GPT模型生成结果
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    
    # 返回生成的查询参数
    return response['choices'][0]['message']['content']

# 示例调用
category = "electronics"
sort = "price_asc"
limit = 5
api_request = generate_api_request(category, sort, limit)
print("Generated API Request:", api_request)

运行结果

Generated API Request: category=electronics&sort=price_asc&limit=5

GPT模型根据输入需求生成了查询参数,我们可以直接将其用于API测试。


步骤3:解析API响应

假设服务器返回以下响应:

{
  "products": [
    {"id": 1, "name": "Smartphone", "price": 199},
    {"id": 2, "name": "Laptop", "price": 999}
  ],
  "total_count": 2
}

我们可以利用GPT模型分析响应内容,并提取关键信息:

# 使用自然语言解析API响应
def parse_api_response(response):
    # 将响应数据作为上下文
    prompt = (
        f"Analyze the following JSON response from an API. Extract the total product count "
        f"and list the product names with their prices. Response: {response}"
    )
    
    # 调用GPT模型
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    
    # 返回解析结果
    return response['choices'][0]['message']['content']

# 示例响应数据
response_data = {
    "products": [
        {"id": 1, "name": "Smartphone", "price": 199},
        {"id": 2, "name": "Laptop", "price": 999}
    ],
    "total_count": 2
}

# 调用解析函数
parsed_response = parse_api_response(response_data)
print("Parsed Response:", parsed_response)

运行结果

Parsed Response: Total product count: 2

Product names with their prices:
1. Smartphone - $199
2. Laptop - $999

GPT模型成功提取了响应中的关键信息,这有助于验证API返回的数据是否正确。


步骤4:集成到测试框架

为了让测试自动化,我们可以将上述逻辑集成到pytest框架中。以下是一个完整的测试示例:

import pytest

# 模拟一个发送API请求的函数
def send_request(query_params):
    # 模拟API响应(实际中需要通过requests库发送请求)
    return {
        "products": [
            {"id": 1, "name": "Smartphone", "price": 199},
            {"id": 2, "name": "Laptop", "price": 999}
        ],
        "total_count": 2
    }

# 测试案例:验证API响应
@pytest.mark.parametrize("category, sort, limit, expected_count", [
    ("electronics", "price_asc", 5, 2),
    ("furniture", "price_desc", 3, 0)
])
def test_api(category, sort, limit, expected_count):
    # Step 1: 生成API请求参数
    query_params = generate_api_request(category, sort, limit)
    print(f"Generated Query Params: {query_params}")
    
    # Step 2: 发送请求并获取响应
    response = send_request(query_params)
    print(f"API Response: {response}")
    
    # Step 3: 解析响应
    parsed_response = parse_api_response(response)
    print(f"Parsed Response: {parsed_response}")
    
    # Step 4: 验证响应内容
    assert response["total_count"] == expected_count, "Product count mismatch"
    for product in response["products"]:
        assert "id" in product
        assert "name" in product
        assert "price" in product

执行测试

运行测试命令:

pytest test_api.py

测试框架将自动完成以下流程:

  1. 调用GPT生成请求参数。
  2. 模拟发送请求,获取响应。
  3. 使用GPT解析响应内容。
  4. 验证响应与预期是否匹配。

Pytest测试结果报告示例:

============================= test session starts =============================
collecting ... collected 2 items

apidemo2.py::test_api[electronics-price_asc-5-2] 
apidemo2.py::test_api[furniture-price_desc-3-0] 

========================= 1 failed, 1 passed in 4.82s =========================
PASSED                  [ 50%]Generated Query Params: API request query parameters:
- category: electronics
- sort: price_asc
- limit: 5
API Response: {'products': [{'id': 1, 'name': 'Smartphone', 'price': 199}, {'id': 2, 'name': 'Laptop', 'price': 999}], 'total_count': 2}
Parsed Response: Total product count: 2

Product Names with Prices:
1. Smartphone - $199
2. Laptop - $999
FAILED                   [100%]Generated Query Params: category=furniture&sort=price_desc&limit=3
API Response: {'products': [{'id': 1, 'name': 'Smartphone', 'price': 199}, {'id': 2, 'name': 'Laptop', 'price': 999}], 'total_count': 2}
Parsed Response: Total product count: 2

Product name: Smartphone, Price: $199
Product name: Laptop, Price: $999

apidemo2.py:59 (test_api[furniture-price_desc-3-0])
2 != 0

Expected :0
Actual   :2
<Click to see difference>

category = 'furniture', sort = 'price_desc', limit = 3, expected_count = 0

    @pytest.mark.parametrize("category, sort, limit, expected_count", [
        ("electronics", "price_asc", 5, 2),
        ("furniture", "price_desc", 3, 0)
    ])
    def test_api(category, sort, limit, expected_count):
        # Step 1: 生成API请求参数
        query_params = generate_api_request(category, sort, limit)
        print(f"Generated Query Params: {query_params}")
    
        # Step 2: 发送请求并获取响应
        response = send_request(query_params)
        print(f"API Response: {response}")
    
        # Step 3: 解析响应
        parsed_response = parse_api_response(response)
        print(f"Parsed Response: {parsed_response}")
    
        # Step 4: 验证响应内容
>       assert response["total_count"] == expected_count, "Product count mismatch"
E       AssertionError: Product count mismatch
E       assert 2 == 0

apidemo2.py:78: AssertionError

Process finished with exit code 1

总结

通过GPT-3.5-Turbo的自然语言能力,测试工程师可以:

  1. 快速生成不同场景的API请求参数。
  2. 自动解析复杂的API响应,提取关键信息。
  3. 提升效率,将生成与解析逻辑集成到自动化测试框架中。

这种方法不仅提高了接口测试的效率,还能覆盖更多的测试场景,为测试工程师提供了强有力的支持。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【生物服务器】数据分析//论文润色/组学技术服务 、表观组分析、互作组分析、遗传转化实验、生物医学

DNA亲和纯化测序&#xff08;DAP-seq&#xff09;和组蛋白甲基化修饰是表观遗传学研究中两个重要的技术手段&#xff0c;它们在揭示基因表达调控机制和染色质结构动态变化中发挥着关键作用。然而&#xff0c;在实践过程中&#xff0c;这两种技术也存在一些痛点和挑战。 DNA亲和…

丹摩征文活动| 摩智云端深度解析:Faster R-CNN模型的训练与测试实战指南

目录 丹摩简介 文章前言Faster R-CNN的简介Faster RCNN的训练与测试提前准备1.1 mobaxterm&#xff08;远程连接服务器&#xff09;1.2 本文的源码下载 目标检测模型 Faster-Rcnn2.1云服务器平台 数据上传内置JupyterLab的使用本地连接使用DAMODEL实例获取实例的SSH访问信息通过…

二叉搜索树介绍

⼆叉搜索树 二叉搜索树的概念二叉搜索树的性能分析查找性能插入性能删除性能 二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除⼆叉搜索树的实现代码测试代码 二叉搜索树key和key/value使⽤场景key搜索场景key/value搜索场景key/value⼆叉搜索树代码实现测试代码 二叉搜索树的…

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS&#xff0c;包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务&#xff0c;成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践&#xff0c;如检查文件存在性以避免重复创建&#xff0c;以及处理HDFS安全…

RabbitMQ教程:路由(Routing)(四)

文章目录 RabbitMQ教程&#xff1a;路由&#xff08;Routing&#xff09;&#xff08;四&#xff09;一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…

智云-一个抓取web流量的轻量级蜜罐v1.5

智云-一个抓取web流量的轻量级蜜罐v1.5 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 新增功能-自定义漏洞信息 可通过正则来添加相关路由以及响应来伪造 nacos的版本响应如下 日流量态势 月流量态势 抓取流量效果

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档&#xff1a; 3.加载游戏&#xff0c;保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂&#xff0c;中间没有运行程序进行阶段性成果的验…

实验5:网络设备发现、管理和维护

实验5&#xff1a;网络设备发现、管理和维护 实验目的及要求&#xff1a; 通过实验&#xff0c;掌握Cisco 路由器和交换机的IOS配置管理。自动从NTP服务器获取时间信息。能够利用TFTP服务器实现路由器和交换机配置文件的备份和恢复。同时验证CDP协议和LLDP协议的网络参数。完…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

DataWorks on EMR StarRocks,打造标准湖仓新范式

在大数据领域&#xff0c;数据仓库和实时分析系统扮演着至关重要的角色。DataWorks 基于大数据引擎&#xff0c;为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台&#xff0c;为用户带来智能化的数据开发和分析体验。而阿里云提供的 EMR Serverless St…

七、利用CSS和多媒体美化页面的习题

题目一&#xff1a; 利用CSS技术&#xff0c;结合表格和列表&#xff0c;制作并美化 “ 翡翠阁 ”页面。运行效果如下 运行效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>翡翠阁</title>&…

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…

【动手学深度学习Pytorch】2. Softmax回归代码

零实现 导入所需要的包&#xff1a; import torch from IPython import display from d2l import torch as d2l定义数据集参数、模型参数&#xff1a; batch_size 256 # 每次随机读取256张图片 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # 将展平每个…

51单片机基础05 实时时钟-思路及代码参考2、3

目录 一、思路二 1、原理图 2、代码 二、思路三 1、原理图 2、代码 一、思路二 所有设定功能相关的操作均在矩阵键盘进行实现&#xff0c;并在定时器中扫描、计数等 1、原理图 2、代码 #include <AT89X52.h> //调用51单片机的头文件 //------------------…

Notepad++的完美替代

由于Notepad的作者曾发表过可能在开发者代码中植入恶意软件的言论&#xff0c;他备受指责。在此&#xff0c;我向大家推荐一个Notepad的完美替代品——NotepadNext和Notepad--。 1、NotepadNext NotepadNext的特点&#xff1a; 1、跨平台兼容性 NotepadNext基于Electron或Qt…

Python | Leetcode Python题解之第564题数组嵌套

题目&#xff1a; 题解&#xff1a; class Solution:def arrayNesting(self, nums: List[int]) -> int:ans, n 0, len(nums)for i in range(n):cnt 0while nums[i] < n:num nums[i]nums[i] ni numcnt 1ans max(ans, cnt)return ans

面试经典 150 题:20、2、228、122

20. 有效的括号 参考代码 #include <stack>class Solution { public:bool isValid(string s) {if(s.size() < 2){ //特判&#xff1a;空字符串和一个字符的情况return false;}bool flag true;stack<char> st; //栈for(int i0; i<s.size(); i){if(s[i] ( |…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令&#xff0c;连接Android Studio 启动夜神模拟器后&#xff0c; 打开安装目录的bin文件夹执行下面的命令&#xff0c;只需执行一次&#xff09; nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…

【STM32】USB 简要驱动软件架构图

STM32 USB 软件架构比较复杂&#xff0c;建议去看 UM 1734 或者 st wiki STM32 USB call graph STM32 USB Device Library files organization Reference [1]: https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_USB_with_STM32 [2]: UM1734