接口测试06 -- pytest接口自动化封装Loggin实战

2024-02-13 02:20

本文主要是介绍接口测试06 -- pytest接口自动化封装Loggin实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 接口关键字封装

1.1 基本概念

接口关键字封装是指:将接口测试过程中常用的操作、验证封装成可复用的关键字(或称为函数、方法),以提高测试代码的可维护性和可复用性。

1.2 常见的接口关键字封装方式

1. 发送请求:封装一个函数,接受参数如请求方法、URL、请求头、请求体等,使用相应的库发送请求,如requests库或HttpClient库。
---------------->>>>
2. 响应验证:封装一个函数,接受参数如响应对象、预期结果等,通过断言或其他方式验证响应的状态码、响应体等是否符合预期。
---------------->>>>
3. 数据提取:封装一个函数,接受参数如响应体、提取表达式等,使用正则表达式XPath、JSONPath等方式提取需要的数据,并返回提取结果。
---------------->>>>
4. 数据保存:封装一个函数,接受参数如文件路径、数据等,将数据保存到指定
的文件中,如Excel、CSV、数据库等。
---------------->>>>
5. 参数化配置:封装一个函数,接受参数如环境配置、数据文件路径等,根据不
同的环境或数据文件读取对应的配置信息,如接口URL、认证信息等。
---------------->>>>
封装的目的:
通过封装接口关键字,可以使接口测试代码更简洁、可读性更高,并且提供了灵活性和扩展性,方便维护和管理测试代码。

2. 接口封装实战应用

2.1 接口关键字封装代码示例 

这是接口关键字驱动类,用于提供自动化接口测试的关键字方法。
主要是实现常用的关键字内容,并定义好所有的参数内容即可
接口中常用关键字:
1.各种模拟请求方法:Post/get/put/delete/header/....
2.集合Allure,可添加@allure.step,这样在自动化执行的时候,Allure报告可以直接捕捉相关的执行信息,让测试报告更详细
3.根据需求进行断言封装:jsonpath、数据库断言。
----------------------->>>
封装get、post请求示例:
import requests
import jsonpath
import json"""
关键字驱动/基类/工具类:
1. 发送请求:8种:post、get、put、delete...
2. 提取数据
补充知识点:方法的缺省值:params=None (默认值),如果没有传参则默认为None
"""class ApiKey:def get(self, url, params=None, **kwargs):"""发送get请求:param url:接口请求url:param params: 拼接在url的参数:param kwargs: 其它的参数:return: 返回请求后的数据"""print(">>>>>>开始发送Get请求")return requests.get(url=url, params=params, **kwargs)def post(self, url, data=None, json=None, **kwargs):"""发送post请求:param url: 接口请求url:param data: data的请求数据:param json: json的请求数据:param kwargs: 其它的参数:return: 返回请求后的数据"""print(">>>>>>开始发送Post请求")res = requests.post(url=url, data=data, json=json, **kwargs)print(">>>>>>响应数据为:", res.json())return res

2.2 封装实现完整的登录接口

基于上面的封装代码:

实现一个项目的登录接口(post请求)、并添加josnpath提取响应信息

import requests
import jsonpath
import jsonclass ApiKey:def post(self, url, data=None, json=None, **kwargs):"""发送post请求:param url: 接口请求url:param data: data的请求数据:param json: json的请求数据:param kwargs: 其它的参数:return: 返回请求后的数据"""print(">>>>>>开始发送Post请求")res = requests.post(url=url, data=data, json=json, **kwargs)print(">>>>>>响应数据为:", res.json())return resdef get_text(self, response, key):"""提取json当中的某个值:param response: 需要提取的json数据,比如:{"msg":"登录成功"}:param key: 对应要提取的jsonpath,比如: $.msg:return: 返回提取数据之后的【第一个值】"""print(">>>>>>开始提取JsonPath响应数据")value_list = jsonpath.jsonpath(response, key)print(">>>>>>提取数据响应为:", value_list[0])return value_list[0]# 主函数:
if __name__ == '__main__':# 1. 实例化对象:ApiKeyak = ApiKey()# 2. 通过对应的类调用对应的方法 --四要素url = "http://xxx.com/index.php?s=/api/user/login"# 公共参数pulic_data = {"application": "app", "application_client_type": "weixin"}# 请求参数-- body (你的body数据是要以json进行提交,参数:json)data = {"accounts": "hailey", "pwd": "hailey123", "type": "username"}res = ak.post(url=url, params=pulic_data, data=data)# 3. 提取数据text = ak.get_text(res.json(), "$.msg")

为了代码的健壮性,添加提取数据的格式判断:

如果返回的响应数据格式是json字符串"{"msg":"登录成功"}",则进行类型转换:

import requests
import jsonpath
import jsonclass ApiKey:def post(self, url, data=None, json=None, **kwargs):"""发送post请求:param url: 接口请求url:param data: data的请求数据:param json: json的请求数据:param kwargs: 其它的参数:return: 返回请求后的数据"""print(">>>>>>开始发送Post请求")res = requests.post(url=url, data=data, json=json, **kwargs)print(">>>>>>响应数据为:", res.json())return resdef get_text(self, response, key):"""提取json当中的某个值:param response: 需要提取的json数据,比如:{"msg":"登录成功"}:param key: 对应要提取的jsonpath,比如: $.msg:return: 返回提取数据之后的【第一个值】"""# 为了代码的健壮性,添加判断是否为字符串(防止响应信息格式为json字符串)if isinstance(response,str):#是字符串,我就让它转一下类型response = json.loads(response)print(">>>>>>开始提取JsonPath响应数据")value_list = jsonpath.jsonpath(response, key)print(">>>>>>提取数据响应为:", value_list[0])return value_list[0]# 主函数:
if __name__ == '__main__':# 1. 实例化对象:ApiKeyak = ApiKey()res ='{"msg":"登录成功"}'text = ak.get_text(res, "$.msg")

2.3 测试用例封装

这里,我们使用pytest框架进行测试用例的编写与封装

在之前Pytest的学习中,我们了解到:

需要将测试用例新建一个项目文件,一个是用例主体,放测试用例,另一主体是用例运行main文件;之前pytest使用详情戳:pytest -- 基本使用详解_pytest 具体能做哪些事情-CSDN博客、pytest -- 进阶使用详解_怎么通过pytest-html插件查看pytest结果-CSDN博客

现在我们在项目文件下新增一个已经封装好的登录功能文件(即上面的示例代码)

 文件结构

测试用例 

在testcase文件下,首先新建一个'test_ds_01.py'文件(登陆的测试用例):

# 导入:从项目根目录的下一级开始写
from Requests_demo.day06.PytestFrame.api_keyword.api_key import ApiKey# 方法:要以test 【默认的规则】
def test_loging():# 1. 实例化对象:ApiKeyak = ApiKey()# 2. 通过对应的类调用对应的方法 --四要素url = "http://xxxx.com/index.php?s=/api/user/login"pulic_data = {"application": "app", "application_client_type": "weixin"}data = {"accounts": "hailey", "pwd"

这篇关于接口测试06 -- pytest接口自动化封装Loggin实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704229

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试