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

news2024/11/23 15:37:33

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 json


class 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 res

    def 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. 实例化对象:ApiKey
    ak = 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 json


class 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 res

    def 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. 实例化对象:ApiKey
    ak = 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. 实例化对象:ApiKey
    ak = 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.coloradmin.cn/o/1445845.html

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

相关文章

【开源】SpringBoot框架开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

【java基础题型】录入3位数,求每一位是?

\t 制表符,用于整到8个格子 Scanner类,导入Scanner包(1),代码里导入Scanner类写录入,调用录入的对象的方法 通用求个位数,%10即可,余数不会小于除数 package java录入3位数;import java.util.Scanner; …

Stable Diffusion 模型下载:RealCartoon-Realistic - V13

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

npm ERR! network This is a problem related to network connectivity.

问题详细描述 PS D:\ALearnBlog\shiyi-blog\blog-web> npm install -g vue/cli npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/vue%2fcli failed, reason: connect ETIMEDOUT 104.1…

1【算法】——最大子数组问题(maximum subarray)

一.问题描述 假如我们有一个数组,数组中的元素有正数和负数,如何在数组中找到一段连续的子数组,使得子数组各个元素之和最大。 二.问题分析 分治法求解: 初始状态: low0;highA.length-1;mid&am…

绞杀者模式

来自:https://martinfowler.com/bliki/StranglerFiqApplication.html 逐步用新的架构代理老的部分 绞杀着模式对于老久庞大,难以改造的遗留系统是比较适用的 总结: 老的不改,建新的新的搞完,杀老的

BUGKU-WEB 计算器

题目描述 计算正确即可得到flag,先看看场景: 解题思路 先输入正确答案,发现只能输入一位数那应该是设置了输入的最大长度是一所以需要我们把这个限制解除就行了呗 相关工具 F12大法 解题步骤 在场景界面按下F12,找到对应的标签右键进行…

【C语言】实现单链表

目录 (一)头文件 (二)功能实现 (1)打印单链表 (2)头插与头删 (3)尾插与尾删 (4) 删除指定位置节点 和 删除指定位置之后的节点 …

力扣(LeetCode)数据结构练习题

今天来分享两道力扣(LeetCode)的题目来巩固上篇时间复杂度和空间复杂度的知识,也就是在题目上加上了空间复杂度和时间复杂度的限制。 目录 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素&#xff0c…

双场板功率GaN HEMT电容模型以精确模拟开关行为

标题:Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior(TED.16年) 摘要 本文提出了一种基于表面电位的紧凑模型,用于模拟具有栅极和源极场板(FP)结构的AlGaN/G…

IDEA Ultimate下载(采用JetBrain学生认证)

IDEA Ultimate版本下载 Ulitmate是无限制版(解锁所有插件,正版需要付费。学生可以免费申请许可)Community是开源社区版本(部分插件不提供使用,比如Tomcat插件。免费) 我们将通过学生认证获取免费版。 Je…

Linux第50步_移植ST公司的linux内核第2步_编译ST公司的linux源码和修改网络驱动

1、修改“linux-5.4.31”目录下的“Makefile” 1)、使用VSCode打开“linux-5.4.31.code-workspace” 2)、点击“linux-5.4.31”目录下的“Makefile” 3)、点击“编辑”,点击“查找”,输入“CROSS_COMPILE回车”,找到“ARCH ? $(SUBARCH)”…

【Linux学习】线程详解

目录 十八.多线程 18.1 线程与进程 18.2 内核视角看待创建线程与进程 18.3 线程优缺点总结 线程的优点: 线程的缺点: 线程的用途: 18.4 线程与进程的联系 十九.线程控制 19.1 POSIX线程库 19.2 线程创建 19.3 线程等待 19.4 线程终止 19.5 线…

【后端高频面试题--Nginx篇】

🚀 作者 :“码上有前” 🚀 文章简介 :后端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 后端高频面试题--Nginx篇 什么是Nginx?为什么要用Nginx?为什么Nginx性能…

揭秘:15条黄金法则,让你的GPT聊天提示效率翻倍!(一)

你的 ChatGPT 响应的好坏完全取决于你使用的ChatGPT 提示。 事实是,ChatgPT对于潜在客户开发、内容创建甚至外展都非常有效。 但大多数人只是使用人工智能来创建内容。 当然,它有时可以产生一些纯文本。也就是说,如果你只使用正确的提示。…

jsp课程教学管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 课程教学管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0…

FPGA_工程_基于rom的vga显示

一 框图 二 代码修改 module Display #(parameter H_DISP 1280,parameter V_DISP 1024,parameter H_lcd 12d150,parameter V_lcd 12d150,parameter LCD_SIZE 15d10_000 ) ( input wire clk, input wire rst_n, input wire [11:0] lcd_xpos, //lcd horizontal coo…

Days 29 ElfBoard LCD屏双电荷泵电路原理

7寸LCD屏幕的屏幕排线中采用的供电电压是5V供电,但是在屏幕工作时需要VCOM-5.3V、AVDD-12.5V、VGL--7V、VGH-17V几组电压,所以要对初始的5V电源进行DC-DC电压变换,在这里我们用到了双电荷泵电路。 再此电路中VCC_5V为电源输入,E…

gtkmm4 应用程序使用 CSS 样式

文章目录 前言css选择器css文件示例源代码效果动态设置css-classes 前言 程序样式和代码逻辑分离开 使代码逻辑更可观 css选择器 Cambalache提供了两种css-classes 相当于css里的类名:class“类名”css-name 相当于css里的标签名:spin div p 啥的 如上我设置了这个按钮控件的…

【ES】--ES集成热更新自定义词库(字典)

目录 一、问题描述二、具体实施1、Tomcat实现远程扩展字典2、验证生效3、ES配置远程扩展字典4、为何不重启ES能实现热更新 一、问题描述 问题现象: 前面完成了自定义分词器词库集成到ES中。在实际项目中词库是时刻在变更的,但又不希望重启ES,对此我们应…