python封装接口自动化测试套件

在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例:

首先,我们需要安装所需的库:


pip install requests pytest

创建一个项目目录结构,如下所示:


project/
│
├── common/           # 公共方法模块
│   └── utils.py      # 存放请求、断言等公共函数
│
├── conf/             # 配置模块
│   └── config.py     # 存放测试环境、API基础URL等配置信息
│
├── data/             # 测试用例参数模块
│   └── test_data.json # 存放测试用例的输入数据
│
├── log/              # 日志模块
│   └── log.txt       # 存放测试过程中的日志信息
│
├── report/           # 测试报告模块
│   └── report.html   # 自动生成的测试报告
│
├── test_case/        # 测试用例模块
│   ├── test_login.py # 登录接口测试用例
│   ├── test_signup.py# 注册接口测试用例
│   └── ...          # 其他接口测试用例
│
└── testsuite.py      # 测试套件文件,用于组织和运行测试用例

 

在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接【点击文末小卡片免费领取资料文档】

软件测试视频教程观看处:

2024年Python自动化测试全套保姆级教程,70个项目实战,3天练完,永久白嫖...

编写各个模块的代码

common/utils.py:封装请求和断言等公共函数。


import requests
import json
def send_request(method, url, headers=None, params=None, data=None):response = requests.request(method, url, headers=headers, params=params, data=data)response.raise_for_status()  # 如果响应状态不是200,抛出异常return response.json()
def assert_response(response_data, expected_key, expected_value):assert expected_key in response_data, f"Expected key '{expected_key}' not found in response."assert response_data[expected_key] == expected_value, f"Expected value for '{expected_key}' is '{expected_value}', but got '{response_data[expected_key]}'"

conf/config.py:配置测试环境和基础URL。

TEST_ENVIRONMENT = "development"
BASE_URL = "http://localhost:8000/api/"
test_case/test_login.py:编写登录接口测试用例。
import json
from project.common.utils import send_request, assert_response
from project.conf.config import BASE_URL
class TestLogin:def test_successful_login(self):url = f"{BASE_URL}login"data = {"username": "test_user","password": "test_password"}response_data = send_request("POST", url, data=json.dumps(data))assert_response(response_data, "status", "success")assert_response(response_data, "message", "Logged in successfully.")def test_invalid_credentials(self):url = f"{BASE_URL}login"data = {"username": "invalid_user","password": "invalid_password"}response_data = send_request("POST", url, data=json.dumps(data))assert_response(response_data, "status", "error")assert_response(response_data, "message", "Invalid credentials.")

testsuite.py:组织和运行测试用例。


import pytest
from project.test_case import test_login, test_signup  # 导入其他测试用例模块
@pytest.mark.parametrize("test_case_module", [test_login, test_signup])
def test_suite(test_case_module):suite = unittest.TestLoader().loadTestsFromModule(test_case_module)runner = unittest.TextTestRunner()results = runner.run(suite)assert results.wasSuccessful(), "Test suite failed."

​​​​​​运行测试套件:

pytest testsuite.py

这个示例提供了一个基本的接口自动化测试套件的封装结构和代码。你可以根据实际项目的需要对其进行扩展和修改

添加更复杂的断言、错误处理、测试数据管理、报告生成等功能

更复杂的断言

在common/utils.py中,你可以添加更多的断言函数来处理更复杂的情况。例如,检查响应中的某个字段是否在预期的值列表中:

def assert_in_response(response_data, key, expected_values):assert key in response_data, f"Expected key '{key}' not found in response."assert response_data[key] in expected_values, f"Expected value for '{key}' to be one of {expected_values}, but got '{response_data[key]}'"

错误处理

在common/utils.py的send_request函数中,你可以添加更详细的错误处理逻辑,例如捕获和记录不同类型的HTTP错误:

def send_request(method, url, headers=None, params=None, data=None):try:response = requests.request(method, url, headers=headers, params=params, data=data)response.raise_for_status()  # 如果响应状态不是200,抛出异常return response.json()except requests.exceptions.HTTPError as http_error:logging.error(f"HTTP error occurred: {http_error}")raise http_errorexcept Exception as e:logging.error(f"Unexpected error occurred: {e}")raise e

测试数据管理

你可以创建一个单独的模块或文件来管理测试数据。例如,在data/test_data.py中定义一个字典,包含所有测试用例所需的输入数据:

LOGIN_TEST_DATA = {"valid_credentials": {"username": "test_user","password": "test_password"},"invalid_credentials": {"username": "invalid_user","password": "invalid_password"}
}

然后在测试用例中使用这些数据:

from project.data.test_data import LOGIN_TEST_DATA
class TestLogin:def test_successful_login(self):url = f"{BASE_URL}login"data = LOGIN_TEST_DATA["valid_credentials"]response_data = send_request("POST", url, data=json.dumps(data))assert_response(response_data, "status", "success")assert_response(response_data, "message", "Logged in successfully.")def test_invalid_credentials(self):url = f"{BASE_URL}login"data = LOGIN_TEST_DATA["invalid_credentials"]response_data = send_request("POST", url, data=json.dumps(data))assert_response(response_data, "status", "error")assert_response(response_data, "message", "Invalid credentials.")

报告生成

你可以使用pytest-html插件来生成HTML格式的测试报告。首先安装插件:


pip install pytest-html

然后在testsuite.py中配置报告生成:


import pytest
from pytest_html_reporter import attach_extra_css, add_context
from project.test_case import test_login, test_signup  # 导入其他测试用例模块
@pytest.mark.parametrize("test_case_module", [test_login, test_signup])
def test_suite(test_case_module):suite = unittest.TestLoader().loadTestsFromModule(test_case_module)runner = unittest.TextTestRunner()results = runner.run(suite)assert results.wasSuccessful(), "Test suite failed."
if __name__ == "__main__":pytest.main(["--html=report/report.html", "--self-contained-html"])attach_extra_css("custom.css")  # 添加自定义CSS样式add_context({"project_name": "My API Test Project"})  # 添加上下文信息

运行测试套件时,将会生成一个名为report.html的测试报告。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

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

相关文章

克隆clone github上某个项目的子目录

有时会遇到只需要克隆github某个项目的子目录,此时可以使用以下方法实现: 需求示例: 现需要克隆:https://github.com/SingleZombie/DL-Demos项目中的ddim项目 注:ddim项目的地址为:https://github.com/Sing…

Adobe Photoshop 2017(PS2017)安装包下载及安装教程

Photoshop 2017下载链接:https://docs.qq.com/doc/DUmVpdUVNbU1wTG10 1.选中下载的压缩包,然后鼠标右键选择解压到“Photoshop CC2017“文件夹 2.双击打开“Photoshop CC2017”文件夹 3.再次打开“Setup”文件夹 4.选中“Setup.exe”右键选择以管理员身份…

关于Python里xlwings库对Excel表格的操作(二十五)

这篇小笔记主要记录如何【如何使用xlwings库的“Chart”类创建一个新图表】。 前面的小笔记已整理成目录,可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 (1)如何安装导入xlwings库; (2…

解决Android AAPT: error: resource android:attr/lStar not found. 问题

错误信息 /xxx/gjc/.gradle/caches/transforms-2/files-2.1/930c42acd29d295ce5bc495c3b84423e/core-1.9.0/res/values/values.xml:104:5-113:25: AAPT: error: resource android:attr/lStar not found. not found 资源位置 场景 原Android studio中的项目都是在git上面拉的老项…

【逆向】C与汇编的关系

程序1 使用 VC6.0 编译如下程序(使用 VC6.0 的原因是该编译器不会对代码进行过多的优化,因此适合逆向入门) // 01.cpp : Defines the entry point for the console application. // # include "stdafx.h"int main(int argc, char…

LeetCode第32题 : 最长有效括号

题目介绍 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 1: 输入:s "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2&#xf…

智能语音信息处理团队EMNLP 2023入选论文解析

2023年12月6日至10日,自然语言处理领域顶会EMNLP 2023在新加坡举行。语音及语言信息处理国家工程研究中心智能语音信息处理团队共3篇论文被会议主会及Findings接收,论文方向涵盖多方对话、大语言模型应用、小说理解等,各接收论文解读见后文。…

.NET Core NPOI导出复杂Excel

一、引入NPOI NuGet: NPOI GitHub源码地址: GitHub - tonyqus/npoi: a .NET library that can read/write Office formats without Microsoft Office installed. No COM, no interop. 版本说明: NPOI 2.4.1 (注意不同版本可能使用…

k8s的二进制部署(二)网络

节点部署完成之后,节点的状态都是Notready,所以要部署k8s网络: k8s的网络类型: k8s中的通信模式: pod内部之间容器与容器之间的通信。 在同一个pod中的容器共享资源和网络,使用同一个网络命名空间,可以直…

【并发设计模式】聊聊Thread-Per-Message与Worker-Thread模式

在并发编程中,核心就是同步、互斥、分工。 同步是多个线程之间按照一定的顺序进行执行,比如A执行完,B在执行。而互斥是多个线程之间对于共享资源的互斥。两个侧重点不一样,同步关注的是执行顺序,互斥关注的是资源的排…

【vue3】-

创建vue3工程 在终端输入以下命令,根据自己的需求做出相应的选择: 生成的项目文件作用: extensions.json:插件 favicon.ico:页签图标 env.d.ts:ts不认识.css .html .txt .js……文件,这个文件…

微信支付产品种类

前言 微信支付产品共有6种形式,详情可参考 支付产品 支付产品 1. 付款码支付 用户展示微信钱包内的 “付款码”给商家,商家扫描后直接完成支付,适用于线下面对面收银场景。 2. JSAPI 支付 JSAPI 支付是指商户通过调用微信支付提供的接…