用gpt定制一个pytest接口测试框(附源码)

news2024/11/17 7:29:37

目的:

描述我的需求和目标让gpt给我写一个测试接口框架 并且让他自己完善。

我说:帮我写一个基于python语言的 pytest的接口测试框架 支持post get put delete请求 添加详细的断言,处理身份验证和授权,处理HTTP错误 加上allure2报告和有请求失败发邮件功能

gpt回答:

好的,下面是一个更完整的代码示例,这个示例结合了你的所有需求:


import requests
import pytest
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import allure

class APIClient(object):
    def __init__(self, base_url, token):
        self.base_url = base_url
        self.headers = {'Authorization': 'Bearer ' + token}

    def get(self, path, params=None):
        return requests.get(self.base_url + path, params=params, headers=self.headers)

    def post(self, path, data=None, json=None):
        return requests.post(self.base_url + path, data=data, json=json, headers=self.headers)

    def put(self, path, data=None):
        return requests.put(self.base_url + path, data=data, headers=self.headers)

    def delete(self, path):
        return requests.delete(self.base_url + path, headers=self.headers)

@pytest.fixture(scope="module")
def api_client():
    token = 'your_token' # 替换成你的Token
    return APIClient("http://your-base-url.com", token) # 你的API的基础URL

def send_email(subject, content, to):
    # Replace the following lines with your email settings
    smtp_server = 'your_smtp_server'
    username = 'your_username'
    password = 'your_password'
    from_email = 'your_email'

    msg = MIMEText(content, 'plain', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = from_email
    msg['To'] = to

    try:
        server = smtplib.SMTP(smtp_server)
        server.login(username, password)
        server.sendmail(from_email, [to], msg.as_string())
        server.quit()
    except smtplib.SMTPException as e:
        print(f"Error: unable to send email: {e}")

@pytest.allure.feature('HTTP methods')
def test_get(api_client):
    try:
        response = api_client.get("/path-for-get") # 这里需要替换成你的GET接口的路径
        assert response.status_code == 200
        assert 'expected_field' in response.json() # 检查预期的字段是否存在
        assert response.json()['expected_field'] == 'expected_value' # 检查预期的字段是否等于预期的值
    except Exception as e:
        send_email('Test failed', str(e), 'your_email@domain.com')
        raise

@pytest.allure.feature('HTTP methods')
def test_post(api_client):
    data = {} # 这里添加POST请求需要的数据
    try:
        response = api_client.post("/path-for-post", data=data) # 这里需要替换成你的POST接口的路径
        assert response.status_code == 200
        assert 'expected_field' in response.json() # 检查预期的字段是否存在
        assert response.json()['expected_field'] == 'expected_value' # 检查预期的字段是否等于预期的值
    except Exception as e:
        send_email('Test failed', str(e), 'your_email@domain.com')
        raise

@pytest.allure.feature('HTTP methods')
def test_put(api_client):
    data = {} # 这里添加PUT请求需要的数据
    try:
        response = api_client.put("/path-for-put", data=data) # 这里需要替换成你的PUT接口的路径
        assert response.status_code== 200
    assert 'expected_field' in response.json() # 检查预期的字段是否存在
    assert response.json()['expected_field'] == 'expected_value' # 检查预期的字段是否等于预期的值
    except Exception as e:
    send_email('Test failed', str(e), 'your_email@domain.com')
    raise
    
    @pytest.allure.feature('HTTP methods')
    def test_delete(api_client):
    try:
    response = api_client.delete("/path-for-delete") # 这里需要替换成你的DELETE接口的路径
    assert response.status_code == 200
    assert 'expected_field' in response.json() # 检查预期的字段是否存在
    assert response.json()['expected_field'] == 'expected_value' # 检查预期的字段是否等于预期的值
    except Exception as e:
    send_email('Test failed', str(e), 'your_email@domain.com')
    raise

请注意你需要替换一些地方的内容,包括`your_token`, `http://your-base-url.com`, `your_smtp_server`, `your_username`, `your_password`, `your_email@domain.com`等等。这些应该替换为你自己的实际值。

此外,你也需要根据实际的接口情况,修改`"/path-for-get"`, `"/path-for-post"`, `"/path-for-put"`, `"/path-for-delete"`以及你的断言内容。

在你的测试过程中,如果测试失败,将会发送一封邮件到指定的邮箱。生成Allure报告的命令如下:

```bash
pytest --alluredir=/tmp/my_allure_results

然后使用allure命令生成报告:
allure serve /tmp/my_allure_results

我说:帮我总结下这个框架和如何优化

gpt回答:这个测试框架主要包括以下几个部分:

1、APIClient:一个用于发送HTTP请求的客户端,支持GET、POST、PUT和DELETE方法。它使用了requests库来发送HTTP请求,同时使用Bearer Token进行身份验证和授权。

2、Pytest:使用Pytest作为测试框架。每个HTTP方法(GET、POST、PUT、DELETE)都有对应的测试函数。测试函数中使用了断言来验证HTTP响应的状态码和内容。

3、Allure:使用Allure生成测试报告。通过在测试函数上添加allure.feature装饰器,我们可以在Allure报告中看到每个测试的详细信息。

4、邮件通知:如果测试失败,会发送一封包含错误详情的邮件。

这个框架可以在多个方面进行优化:

1、参数化:可以使用Pytest的参数化功能来运行多个测试案例。例如,你可以创建一个列表或字典来存储多个不同的请求数据和预期结果,然后在测试函数中使用pytest.mark.parametrize装饰器来为每个数据和结果创建一个测试。

2、使用环境变量:出于安全考虑,你可以将一些敏感数据(例如Token和电子邮件设置)存储在环境变量中,而不是直接在代码中写出这些数据。Python的os.environ可以用来访问环境变量。

3、异常处理:可以增加更多的异常处理代码,以便更好地处理可能发生的错误。例如,你可以检查HTTP响应的状态码是否在200-299的范围内,如果不在这个范围内,就认为请求失败。

4、使用配置文件:可以使用配置文件(例如JSON或YAML文件)来存储测试设置。这样,如果你想修改测试设置,就不需要修改代码,只需要修改配置文件就可以了。

5、日志:可以添加日志代码,将测试过程中的重要信息记录下来,这样在出现问题时可以更方便地进行调试。Python的logging库可以用来添加日志。

6、并行测试:如果你有很多测试需要运行,可以使用Pytest的-xdist插件来并行运行测试,从而减少测试时间。但请注意,如果你的测试会影响到共享的资源或状态(例如数据库),那么并行运行可能会导致问题。

我说:能不能基于这些优化 在帮我扩展下这个测试框架

gpt回答:当然可以,我将在原有的测试框架上添加以下功能:

1、参数化测试案例

2、使用环境变量

3、异常处理增强

4、使用配置文件

代码如下:

首先,我们需要一个配置文件,比如一个名为config.json的JSON文件,内容如下:


{
    "base_url": "http://your-base-url.com",
    "smtp_server": "your_smtp_server",
    "smtp_username": "your_username",
    "smtp_password": "your_password",
    "from_email": "your_email",
    "to_email": "your_email@domain.com"
}

测试代码如下:


import requests
import pytest
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import allure
import os
import json

class APIClient(object):
    def __init__(self, base_url):
        self.base_url = base_url
        self.headers = {'Authorization': 'Bearer ' + os.getenv('TOKEN')}

    def get(self, path, params=None):
        try:
            response = requests.get(self.base_url + path, params=params, headers=self.headers)
            response.raise_for_status()
            return response
        except requests.exceptions.RequestException as e:
            pytest.fail(f"GET request failed: {e}")

    # Similar changes can be made for the post, put and delete methods

@pytest.fixture(scope="module")
def api_client():
    with open('config.json') as f:
        config = json.load(f)
    return APIClient(config["base_url"])

def send_email(subject, content, to, config):
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = config["from_email"]
    msg['To'] = to

    try:
        server = smtplib.SMTP(config["smtp_server"])
        server.login(config["smtp_username"], config["smtp_password"])
        server.sendmail(config["from_email"], [to], msg.as_string())
        server.quit()
    except smtplib.SMTPException as e:
        print(f"Error: unable to send email: {e}")

@pytest.fixture(scope="module")
def test_data():
    # Replace this with your actual test data
    return [
        {
            "path": "/path-for-get",
            "expected_field": "field",
            "expected_value": "value"
        },
        # Add more dictionaries for more test cases
    ]

@pytest.mark.parametrize('data', test_data, indirect=True)
@pytest.allure.feature('HTTP methods')
def test_get(api_client, data):
    try:
        response = api_client.get(data["path"])
        assert data["expected_field"] in response.json()
        assert response.json()[data["expected_field"]] == data["expected_value"]
    except Exception as e:
        with open('config.json') as f:
            config = json.load(f)
        send_email('Test failed', str(e), config["to_email"], config)
        raise

以上代码中,我增加了一个config.json的配置文件,其中存储了一些基础配置信息,比如SMTP服务器的信息,API的基础URL等。并且,我使用了os.getenv(‘TOKEN’)来获取环境变量中的Token。

对于异常处理,我添加了response.raise_for_status()来抛出HTTP错误。如果HTTP请求的状态码不在200-299之间,raise_for_status会抛出一个异常。

我还添加了一个test_data fixture用于参数化测试。在test_data中,你可以添加你的实际测试数据。在这个示例中,每个测试数据都是一个包含"path"、"expected_field"和"expected_value"的字典。

在test_get测试函数中,我使用了pytest.mark.parametrize装饰器来参数化测试。这样,对于test_data中的每一个测试数据,都会运行一次test_get测试。并且,如果测试失败,会发送一封包含错误详情的邮件。

对于post,put和delete的方法,也可以进行类似的修改。

这个新的测试框架增加了配置文件的使用,环境变量的使用,异常处理的增强,以及测试参数化,使得测试更加灵活和强大。如果你需要对其他特定的部分进行扩展或者需要帮助,请告诉我,我会很高兴为你提供更多的帮助。

结果:后面还可以用gpt不断这个框架,有需要可以找我

最后为了方便软件测试人员,我研究了一个专为软件测试人使用的GPT人工智能:

http://ai.hctestedu.com/#/chat/1002

免费分享给大家使用!!

需要激活码的朋友可以关注我下方的公众号,免费获取!

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

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

相关文章

代码随想录第51天

1.最佳买卖股票时机含冷冻期 淦,自己写,用3个状态死活写不出来。 动规五部曲,分析如下: 确定dp数组以及下标的含义 dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 其实本题很多同学搞的比较懵&…

SecurityAccess(0x27)服务

SecurityAccess(0x27)服务 此服务的目的是提供访问数据和/或诊断服务的手段,这些服务因安全,排放或安全原因而受到限制。 用于将 例程或数据下载/上传到服务器和从服务器读取特定存储器位置的诊断服务是可能需要安全访问的情况。…

使用Inkscape绘制矢量电路图

GNU Inkscape是一个免费的开源矢量图形编辑器,非常适合画论文中的矢量插图。 Inkscape Inkscape支持win mac linux全平台(下载),windows端还发布了uwp版本,可在Windows store安装。 基本操作: inkscape工…

2023年前端面试题汇总-性能优化

1. CDN 1.1. CDN的概念 CDN(Content Delivery Network,内容分发网络)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户&…

简谈软件版本周期 | Alpha、Beta、RC、Stable版本之间的区别

目录 💌 引言 ⭕ 软件版本周期 🛠️ 软件开发期 ⚖️ 软件完成期 💰 商业软件版本 💌 引言 定义好版本号,对于产品的版本发布与持续更新很重要;但是对于版本怎么定义,规则如何确定&#x…

【微服务架构】无法在Sentinel Dashboard查看到服务的监控信息原因

(目前项目中使用的Hystrix,而Hystrix已经不维护了,至今仍然是2018年发布的1.5.8版本。) 开始学习一下新的服务治理框架Sentinel Sentinel官网介绍 在集成Sentinel案例中碰到的问题 微服务,无法在sentinel dashboard…

Oracle中的数据导出(3)

假如我现在不想再打开DOS界面输入命令导出数据,那又有什么简单便捷的方法实现呢? 我将在本篇描述一种自动化的操作方法,简单讲就是:我把需要查询的数据脚本放在桌面的一个mini,通过双击快捷图标直接实现数据结果导出到…

VMware ESXI7.0.3的安装

文章目录 一、VMware ESXI7.0版本的安装与配置1.1、VMware概述。1.2、VMware 解析:1.3、VMware ESXI解析:2.1、准备资料2.2.1、VMware ESXI的ISO下载 3.1、安装ESXI4.1、浏览器键入esxi上述ipv4地址:192.168.229.171 一、VMware ESXI7.0版本的…

VMware ESXi 8.0b Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0b Unlocker & OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:https://sysin.org/blog/vmware-esxi-8-sysin/,查看最新版。原创作…

C语言——分段函数求值

一、题目描述 二、题目分析 本题是简单的分段函数的求解&#xff0c;应学会合理的运用for\if\swich函数解答问题。 三、代码实现 //for语句解题#include <stdio.h> int main() {int x,y;scanf("%d",&x);if(x<1){yx;}else if(1<x && x<…

FL Studio软件最新21中文版本安装包下载

FL Studio21集合最新FL基础操作、编曲技巧、混音技巧、乐理基础、声乐演奏等各类内容&#xff0c;编曲软件FL Studio 简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前版本是FL Studio20&#xff0c;它让你的计算机就…

章节1:远程代码执行渗透与防御

章节1&#xff1a;远程代码执行渗透与防御 01 什么是远程代码执行&#xff1f; 远程代码执行&#xff08;RCE漏洞&#xff09; 远程代码执行&#xff1a;Remote Code Execute 远程命令执行&#xff08;命令注入漏洞&#xff09;&#xff1a;Remote Command Execute 定义&a…

高速PCB Layout设计要用哪些工具?

随着时代高速发展&#xff0c;高速PCB项目逐渐成为主流项目之一&#xff0c;越来越多的电子工程师需要掌握高速PCB Layout设计能力&#xff0c;同时电子工程师在进行高速PCB Layout时需要用到多种工具&#xff0c;下面来看看有哪些工具和软件&#xff1f; 1、设计软件 ①Altiu…

Redis的常用数据结构之列表类型

列表类型的数据特点 用于存储多个有序的字符串单个列表最多可以存储2的32次方-1个元素&#xff08;4294967295&#xff09;。列表的元素是可以重复的可以分别对列表的两端做插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;操作 List相关的操作命令 向右…

Vue3(二):Vue3生命周期、自定义hook、其他API、Suspense等组件

Vue3&#xff1a;第二章 一、Vue3生命周期二、自定义hook函数三、toRef四、其他Composition API1.shallowRef与shallowReactive2.readonly与shallowReadonly3.toRaw 与 markRaw&#xff0c;customRef4.provide和inject5.响应式数据的判断 五、组合式API的优势1.选项式API的问题…

股票买卖篇(II,III,IV)--基础,详细!状态机简单应用

目录 股票买卖II 本题思路 关于异常值的解释 代码 股票买卖III 本题思路 (包括对交易过程的理解&#xff0c;需认真理解) 代码 股票买卖 IV 本题思路 代码 股票买卖II 输入样例 6 7 1 5 3 6 4 输出样例 7 输入样例 5 1 2 3 4 5 输出样例 4 本题思路 该题是最…

1. Mysql InnoDB中的索引

一、InnoDB中的索引 InnoDB存储引擎支持以下几种常见的索引&#xff1a;B树索引、全文索引、哈希索引&#xff0c;其中比较关键的是B树索引。 1. B树索引介绍 InnoDB中的索引自然也是按照B树来组织的&#xff0c;前面我们说过B树的叶子节点是用来放数据的。但是放什么数据呢…

攻防世界-基础android

下载链接&#xff1a;下载 参考链接&#xff1a;攻防世界-Mobile-基础android (Misc经验解法&#xff09;_攻防世界基础android_Q_yt的博客-CSDN博客 方法一&#xff1a; 这是个偏向Misc的解题思路&#xff0c;下载完是个apk文件&#xff0c;载入010 Editor看一下&#xff0…

京东工作8年,肝到T8就剩这份心得了,已助朋友拿到10个Offer

在京东工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到T7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

TiDB亿级数据亚秒响应查询方案介绍

目录 1 什么是TiDB2 什么是NewSQL2.1 传统SQL的问题2.1.1 升级服务器硬件2.1.2 数据分片 2.2 NoSQL 的问题2.2.1 优点2.2.2 缺点 2.3 NewSQL 特性2.3.1 NewSQL 的主要特性&#xff1a;2.4 三种SQL的对比 3 TiDB怎么来的3.1 TiDB社区版和企业版 4 TIDB核心特性4.1 水平弹性扩展4…