接口测试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,一经查实,立即删除!

相关文章

Sketch 99.1 for macOS

Sketch 99.1 for macOS 概述 这个程序是对矢量绘图的创新性和焕然一新的看法。它特意采用了极简主义的设计,基于一个大小无限、图层自由的绘图空间,没有调色板、面板、菜单、窗口和控件。 此外,它提供了强大的矢量绘图和文本工具,…

django通过指定用户手机号查询外键所关联的数据,倒序查询

django通过指定用户手机号查询外键所关联的数据 在Django中,可以通过使用filter方法和双下划线语法来查询外键所关联的数据。以下是一种常见的方法: from your_app.models import User, ForeignKeyModel# 假设User模型有一个名为phone的字段&#xff…

基于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代码执行 解题: 题目既然允许…

速盾:cdn集群防御空间dns服务器

在当今数字化时代,网络安全和性能成为了企业关注的焦点。速盾的CDN集群防御空间DNS服务器技术为网站提供了更高水平的安全性和性能优化。本文将深入探讨这一技术的关键特点和优势。 1. 集群防御: 速盾的CDN集群防御通过分布在全球的节点集群,…

c++恶魔轮盘制造第1期输赢

小常识&#xff0c;恶魔叫DEALER&#xff0c;上帝叫God. 赢了很简单 void sheng() { cout<<"你获胜了&#xff01;";MessageBox(NULL,TEXT("你的钱~~~~~~给你"),TEXT("DEALER"),MB_OK);system("pause");system("cls"…

P5732 【深基5.习7】杨辉三角 python解法

# 【深基5.习7】杨辉三角 ## 题目描述 给出 n<20&#xff0c;输出杨辉三角的前 n 行。 如果你不知道什么是杨辉三角&#xff0c;可以观察样例找找规律。 ## 输入格式 ## 输出格式 ## 样例 #1 ### 样例输入 #1 6 ### 样例输出 #1 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5…

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

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

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

盛水最多的容器 .习题链接题目题目解析算法原理我的答案 . 习题链接 盛水最多的容器 题目 题目解析 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 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

假期作业 2月12日

分支、循环练习 1、选择题 1.1、以下程序的输出结果是________。 main() { int k11,k22,k33,x15; if(!k1) x--; else if(k2) if(k3) x4; else x3; printf(“x%d\n”,x); } A x4 B x15 C x14 D x3 1.2、有以下程序&#xff0c;while循环执行________次。 int …

Servo的并发模型介绍

Servo是一个由Mozilla Research开发的实验性浏览器引擎&#xff0c;旨在为未来的网页和应用程序提供高性能的渲染。Servo的并发模型是其核心特点之一&#xff0c;它利用现代多核处理器的优势&#xff0c;通过异步编程和并行处理来提高渲染效率和响应性。以下是对Servo并发模型的…

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

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

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

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

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

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

Java+SpringBoot实习管理系统探秘

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

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

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

C# 【WPF】之 INotifyPropertyChanged的简单封装

以下是一个简单的 INotifyPropertyChanged 封装示例&#xff1a; using System.ComponentModel; c#兼职Q群&#xff1a;741058172 public class ObservableObject : INotifyPropertyChanged {public event PropertyChangedEventHandler PropertyChanged;protected void RaiseP…