接口测试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"

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

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

相关文章

基于Spring Boot的美容院管理系统设计与实现,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1757434902285987841

洛谷数组P1319压缩技术

做题思路: 这里表示输入的第一个数字N为N*N的方阵,后面的数字表示连续输入几个1或者0,定义result表示实际输出的数字0或1(result输出0或1,可以用绝对值abs我们初始化result为0,我们将它-1后再取绝对值就可以…

二、ClickHouse简介

ClickHouse简介 前言一、行式存储二、DBMS功能三、多样化引擎四、高吞吐写入能力五、数据分区与线程级并行六、场景七、特定版本 前言 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C 语言编写,主要…

[NSSCTF]-Web:[SWPUCTF 2021 新生赛]easyrce解析

先看网页 代码审计: error_reporting(0); :关闭报错,代码的错误将不会显示 highlight_file(__FILE__); :将当前文件的源代码显示出来 eval($_GET[url]); :将url的值作为php代码执行 解题: 题目既然允许…

片上网络NoC(4)——直连拓扑

目录 一、前言 二、直连拓扑 三、总结 一、前言 本文中,我们将继续介绍片上网络中拓扑相关的内容,主要介绍直连拓扑,在此之前,我们已经介绍过了拓扑的指标,这将是继续阅读本文的基础,还没有了解相关内容…

算法刷题:盛水最多的容器

盛水最多的容器 .习题链接题目题目解析算法原理我的答案 . 习题链接 盛水最多的容器 题目 题目解析 VH*W h为左右两边低的一边,w为左右两边之间的距离 算法原理 定义两个指针 left0,rightn-1; left从左往右对数组进行遍历,right从右往左进行遍历 遍历的过程中,每一次都需要…

Hive的小文件问题

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一:insert overwrite (推荐) 3.2.2 方式二:concatenate 3.2.3 方式三&#xff…

全国计算机等级考试二级,MySQL数据库考试大纲(2023年版)

基本要求: 1.掌握数据库的基本概念和方法。 2.熟练掌握MySQL的安装与配置。 3.熟练掌握MySQL平台下使用SQL语言实现数据库的交互操作。 4.熟练掌握 MySQL的数据库编程。 5.熟悉 PHP 应用开发语言,初步具备利用该语言进…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第二套(选择题)

CSP-J入门组初赛模拟题二 1、在计算机内部用来传送、存贮、加工处理的数册或指令都是以()形式进行的 A、二进制 B、八进制 C、十进制 D、智能拼音 答案:A 考点分析:主要考查小朋友们计算机相关知识,在计算机中都是采用二进制运算&#…

助力工业生产质检,基于轻量级yolov8-seg开发构建工业场景下滚珠丝杠传动表面缺陷分割检测系统

AI赋能工业生产是一个强有力的方式,在我们之前的系列博文中也有很多相应的开发实践,感兴趣的胡都可以自行移步阅读,本文的核心思想就是想要基于轻量级的实例分割模型来开发构建工业场景下的滚珠丝杠传动表面缺陷分割检测系统,首先…

Java+SpringBoot实习管理系统探秘

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

算法-----高精度算法1(高精度加法,高精度减法)(详解)

什么是高精度算法? 高精度的意思就是他得名字----高的精度,简单说就是位数很大,而高精度算法就是将这些高精度数(位数很大在几百几千几万位的数叫高精度数)通过计算机的型式模拟出来结果。 为什么要用高精度算法&…

C语言—字符数组(3)

可能不是那么的完整,先凑合看吧,如果我学会如何修改以后,我慢慢回来修改的 1.编写程序实现对两个字符串的连接功能; 法一:不使用strcat函数,写程序直接实现,记得添加结束符,不然程序访问数组时候将变得不…

【教程】C++语言基础学习笔记(八)——函数

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

耳机壳UV树脂制作私模定制耳塞需要哪些工具和材料呢?

制作私模定制耳塞需要使用到一些工具和材料,包括但不限于以下内容: UV树脂:用于制作耳塞的主体部分,具有高硬度、耐磨、耐高温、环保等优点。耳模材料:用于获取用户的耳型,通常是一些快速固化的材料&#…

LeetCode 0987.二叉树的垂序遍历:遍历时存节点信息,遍历完自定义排序

【LetMeFly】987.二叉树的垂序遍历:遍历时存节点信息,遍历完自定义排序 力扣题目链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/ 给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历…

【C语言】【力扣】7.整数反转和9.回文数

一、整数反转 1.1 个人思考过程 初解:出现ERROR,数据溢出的情况下应该返回0。(错误) int reverse(int x){int y0;while(x!0){yy*10x%10;x/10; }return y; } 再解:加上数据溢出判断条件。(正确&#…

“bound drug/molecule”or “unbound drug/molecule”、molecule shape、sketching是什么?

“bound drug/molecule”or “unbound drug/molecule” For clarity, the following terms will be used throughout this study: “bound drug/molecule” (or “unbound drug/molecule”) refers to the drug/molecule that is bound (or unbound) to proteins [48]. 意思就是…

Java实现快乐贩卖馆管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元 简述五年后,人工智能将掌握在谁的手中? 简述 根据 OpenAI 最近的一份报告,到 2030 年,训练大型 AI 模型的成…