接口自动化测试之request模块讲解,以及初步接口自动化测试框架封装(统一请求)

news2024/11/30 20:47:44

一、有接口测试工具的情况下,为什么要做接口自动化?

1.敏捷开发,接口一般数量很大,团队实现接测试,版本控制。
2.功能太死板,有些接口完全无法实现(复杂的加密接口,签名接口等)
3.接口项目当中有多种不同协议的接口。
4.排错,定位接口问题不方便,结合抓包实现。
5.没有办法生成美观的报告。
6.多接口串联,数据库验证,日志监控。
7.有些公司做web自动化+接口自动化。

二、python+requests模块

requests第三方库,主要用于发送http请求,做接口自动化。

pip install requests

三、requests全局观请求

1.requests.get()       发送get请求
2.requests.post()     发送post请求
3.requests.delete()  发送delete请求
4.requests.put()       发送put请求
5.requests.request() 最核心的方法

响应:response对象

rep=requests.request()
#返回字符串的数据
print(rep.text)
# 返回字节格式的数据
print(rep.content)
# 返回字典格式的数据
print(rep.json())
# 返回状态信息
print(rep.reason)
#返回cookie信息
print((rep.cookies))

四、接口实战

pytest默认规则

1.py文件必须以test_开头或者_test结尾。
2.类名必须以Test开头
3.测试用例必须以test_开头

注意︰

1、get请求通过params传递参数。

2、post请求通过json或者data传参。

json或者data传参,他们的区别是什么?

data
①数据报文:dict字典类型,那么默认情况下,请求头: applilcation/x-www-form-urlencoded,表示以form表单的方式传参,格式: a=1&b=2&c=3
②数据报文∶str类型,那么默认情况下,请求头:text/plain(如果是字典格式需要转换成dict格式传参)
json
①数据报文∶不管是dict还是str类型,默认都是application/json,格式:{"a":1,"b":2}

json.dumps(data)      序列化把字典格式的数据转换成str格式。
json.loads(data)        反序列化把str格式转换成字典格式

总结:data只能传简单的只有键值对的dict或者是str格式,json一般只能传dict格式

cookie鉴权:网页的接口基本上都要做cookie鉴权。这种不常用。
通过session实现cookie鉴权,这种常用。

import json
import re
import time

import pytest
import requests

class TestsendRequest:

    # 类变量:通过类名访问
    access_token = " "
    csrf_token = ""

    def test_get_token(self):
        # 发送get请求ctrl+左键
        url = "https://api.weixin.gq.com/cgi-bin/token"
        data = {
            "grant_type": "client_credential",
            "appid": "wx6b11b3efd1cdc290",
            "secret": "106a9c6157c4db5f6029918738f9529d"
        }
        rep = requests.get(url=url, params=data)
        print(rep.json())
        TestsendRequest.access_token = rep.json()['access_token']

    def test_edit_flag(self):
        # 发送post请求(data和json只需要传一个,下面举例两种)
        url = "https://api.weixin.qq.com/cgi-bin/tags/update?acess_token=" + TestsendRequest.access_token + ""
        data = {"tag": {"id": 134, "name": "广东人"}}
        #因为上面是字典的形式,所以使用json的方式进行传参
        rep = requests.post( url, json=data)
        #如果是使用data的形式,就得将字典转换成str格式进行传参
        # rep=TestsendRequest.session.request(url,data=json.dump(data))
        #如果是简单的字典(如只有一层的简单的键值对),也是可以使用data的形式.如:
        # data={"tag":""}
        # rep=TestsendRequest.session.request((url,data=data))
        print(rep.json)

    def test_file_upload(self):
        url = "https://api.weixin.qq.com/cgi-bin/media/uploading?acess_token=" + TestsendRequest.access_token + ""
        data = {
            "media": open(r"E:\shu.png", "rb")
        }
        rep = requests.post(url=url, files=data)
        #也可以这样
        # rep = requests.request("post", url=url, files=data)
        print(rep.json())

    # 需要带请求头的接口以及需要cookie关联的接口如何测试?
    def test_start(self):
        # 发送get请求ctrl+左键
        url = "http://47.107.116.139/phpwind"
        rep = requests.get(url=url)
        # print(rep.text)
        # 通过正则表达式获取鉴权码
        TestsendRequest.csrf_token = re.search('name="csrf_token"value="(.*?)"', rep.text)[1]
        print(TestsendRequest.csrf_token)
        TestsendRequest.cks = rep.cookies

    # 请求需要带请求头的接口
    def test_login(self):
        url = "http://47.107.116.139/phpwind/index.php?m=u&c=login&a=dorun"
        data = {
            "username": "msxy",
            "password": "msxy",
            "csrf_token": TestsendRequest.csrf_token,
            "backurl": "http://47.107.116.139/phpwind/",
            "invite": ""
        }
        headers = {
            "Accept": "application/json,text/javascript,/;q=0.01",
            "X-Requested-With": "XMLHttpRequest"
        }
        time.sleep(4)
        rep = requests.post( url, data=data, headers=headers, cookies=TestsendRequest.cks)
        print(rep.json)


if __name__ == '__main__':
    pytest.main(['-vs'])

五、接口自动化测试框架封装

接口自动化框架封装的第一步:统一请求方式。

将上述的代码进行框架封装,如下所示:

import json
import re
import time

import pytest
import requests

class TestsendRequest:

    # 类变量:通过类名访问
    access_token = " "
    csrf_token = ""
    session = requests.session()

    def test_get_token(self):
        # 发送get请求ctrl+左键
        url = "https://api.weixin.gq.com/cgi-bin/token"
        data = {
            "grant_type": "client_credential",
            "appid": "wx6b11b3efd1cdc290",
            "secret": "106a9c6157c4db5f6029918738f9529d"
        }
        rep = TestsendRequest.session.request("get", url=url, params=data)
        print(rep.json())
        TestsendRequest.access_token = rep.json()['access_token']

    def test_edit_flag(self):
        # 发送post请求(data和json只需要传一个,下面举例两种)
        url = "https://api.weixin.qq.com/cgi-bin/tags/update?acess_token=" + TestsendRequest.access_token + ""
        data = {"tag": {"id": 134, "name": "广东人"}}
        #因为上面是字典的形式,所以使用json的方式进行传参
        rep = TestsendRequest.session.request("post", url, json=data)
        #如果是使用data的形式,就得将字典转换成str格式进行传参
        # rep=TestsendRequest.session.request(url,data=json.dump(data))
        #如果是简单的字典(如只有一层的简单的键值对),也是可以使用data的形式.如:
        # data={"tag":""}
        # rep=TestsendRequest.session.request((url,data=data))
        print(rep.json)

    def test_file_upload(self):
        url = "https://api.weixin.qq.com/cgi-bin/media/uploading?acess_token=" + TestsendRequest.access_token + ""
        data = {
            "media": open(r"E:\shu.png", "rb")
        }
        rep = TestsendRequest.session.request("post", url=url, files=data)
        #也可以这样
        # rep = requests.request("post", url=url, files=data)
        print(rep.json())

    # 需要带请求头的接口以及需要cookie关联的接口如何测试?
    def test_start(self):
        # 发送get请求ctrl+左键
        url = "http://47.107.116.139/phpwind"
        rep = TestsendRequest.session.request("get", url=url)
        # print(rep.text)
        # 通过正则表达式获取鉴权码
        TestsendRequest.csrf_token = re.search('name="csrf_token"value="(.*?)"', rep.text)[1]
        print(TestsendRequest.csrf_token)
        # TestsendRequest.cks = rep.cookies

    # 请求需要带请求头的接口
    def test_login(self):
        url = "http://47.107.116.139/phpwind/index.php?m=u&c=login&a=dorun"
        data = {
            "username": "msxy",
            "password": "msxy",
            "csrf_token": TestsendRequest.csrf_token,
            "backurl": "http://47.107.116.139/phpwind/",
            "invite": ""
        }
        headers = {
            "Accept": "application/json,text/javascript,/;q=0.01",
            "X-Requested-With": "XMLHttpRequest"
        }
        time.sleep(4)
        rep = TestsendRequest.session.request("post", url, data=data, headers=headers, cookies=TestsendRequest.cks)
        print(rep.json)

if __name__ == '__main__':
    pytest.main(['-vs'])


 

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

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

相关文章

【STL十九】算法——修改序列的操作(copy、move、remove、transform、replace)

算法——不修改序列的操作(copy、move、transform、remove、replace) 一、分类二、修改序列的操作三、copy四、move五、remove、remove_if六、fill、transform、replace、replace_if、reverse 一、分类 根据网站https://www.apiref.com/cpp-zh/cpp/head…

Spring的执行流程以及Bean的作用域和生命周期

深入Bean对象 1. Bean对象的作用域1.1 引出作用域问题1.2 六种作用域 2. Spring的执行流程3. Bean对象的生命周期 在之前的学习中,我们了解到Spring能够用来帮助我们管理Java中的Bean对象,我们能够向Spring的IOC容器中添加以及获取对象。那我们从Spring对…

【腾讯云 Finops Crane 集训营】学习云原生成本优化

目录 开篇介绍搭建环境第一步第二步第三步 添加集群成本洞察成本分析资源推荐与副本数智能预测与自动扩缩容EHPA安装Metrics Server创建测试应用创建 EffectiveHPA增加负载整体流程 调度优化负载感知调度拓扑感知调度 混部清理环境 开篇 某次闲逛CSDN,发现了这样一…

(文章复现)基于电力系统碳排放流理论的碳排放分摊模型研究(含matlab代码)

参考文献:基于电力系统碳排放流理论的碳排放分摊模型研究 之前写过一篇博客复现论文《电力系统碳排放流的计算方法初探》,那篇文章模型比较简单,没有考虑网损。(文章复现)电力系统碳排放流的计算方法初探(含matlab代码) 今天要复现的这篇文献…

1行命令本地部署 AgentGPT

本地部署 AgentGPT 部署 AgentGPT访问 AgentGPT 部署 AgentGPT 运行下面命令部署 AgentGPT,输入你的 OpenAI Key, git clone https://github.com/reworkd/AgentGPT.git; cd AgentGPT; ./setup.sh --docker访问 AgentGPT 使用浏览器打开 http://localh…

万得后端一面

目录 1.说说重载和重写2.内连接和外连接3.如果有一个任务来了,线程池怎么运行5.hashset怎么判断重复6.list和set说说7.说说有哪些list8.单例模式的饿汉式和懒汉式,怎么样可以防止反射。9.volatile关键字说说 1.说说重载和重写 1、重载发生在本类&#x…

MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes”

MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes” 问题描述 数据库RDS MySQL版在创建表索引时,出现如下错误信息。 Error 1071: Specified key was too long; max key length is 767 bytes.ERROR 1709 (HY000): Index column siz…

基于ESP32/ESP8266的单通道LoRaWAN网关设计-网页界面介绍

资料下载链接》》 网页界面介绍 对于单通道网关的第六版用户界面,我们专注于 Web 界面。本文档仅涉及 Web 界面。有几个部分要讨论: 用户界面说明web界面可以设置哪些参数单通道接口配置涉及的文件。 Web 界面的各个部分 启动 Web 界面时&#xff0…

【评测】腾讯云服务器的性能怎么样?

转载请注明出处:小锋学长生活大爆炸[ http://xfxuezhang.cn] 最近腾讯云推出了5年款服务器,性价比非常的高。但这么便宜的服务器,性能怎么样呢?学长特地领取了新人试用版测试了一下性能,这里与大家分享一下。 服务器领…

与对应负数同时存在的最大正整数

一、2441. 与对应负数同时存在的最大正整数 思路 这个题我想的是将数组中的负数全部找出来放进另一数组,然后再将原数组的元素与与之相比,如果相加等于0,那么就使num; 代码实现 int findMaxK(int* nums, int numsSize){int max0…

学系统集成项目管理工程师(中项)系列21b_整体管理(下)

1. 监控项目工作 1.1. 跟踪、审查和报告项目进展,以实现项目管理计划中确定的绩效目标的过程 1.2. 输入 1.2.1. 项目管理计划 1.2.2. 进度预测 1.2.2.1. 基于实际进展与进度基准的比较而计算出进度预测 1.2.2.1.1. 完工尚需时间估算(ETC) 1.2.2.1.2. 进度偏差(SV…

威胁报告检测到物理后果呈指数增长的OT网络攻击

2023年威胁报告 - 具有物理后果的 OT 网络攻击 在过去一年(2022 年),我们看到了 57 起针对工业系统的 OT 相关网络攻击,这些攻击在现实世界中造成了物理后果。这是我们在 2021 年看到的 22 次类似攻击的 2.5 倍多,是 …

网路通信-路由交换协议

目录 一、什么是协议 二、为什么要有协议 三、协议分类 (1)OSI通信模型 (2)tcp/ip通信模型 (3)数据传输的过程 1.传输路线 2.发送者封装数据 3.数据经过交换机 4.数据经过路由器 5.路由器转发到目…

深度学习环境配置系列文章(四):WSL2配置Windows11和Linux双系统

深度学习环境配置系列文章目录 第一章 专业名称和配置方案介绍 第二章 Anaconda配置Python和PyTorch 第三章 配置VS Code和Jupyter的Python环境 第四章 WSL2配置Windows11和Linux双系统 第五章 配置Docker深度学习开发环境 第四章文章目录 深度学习环境配置系列文章目录前言一…

横截面收益率(二) 阿尔法策略是如何构建的

资本资产定价模型自从首次被提出以来在金融经济学中一直处于中心地位。 在一系列简化假定条件下,资本资产定价模型表明,任何证券的收益率与该证券 的系统性风险(或者贝塔值)呈线性关系。因此,依据资本资产定价模型横截…

【STM32】基础知识 第十三课 中断

【STM32】基础知识 第十三课 中断 概述中断是什么中断的作用 & 意义STM32 中断体系NVIC中断向量表STM32 中断优先级基本概念 STM32 外部中断器 (EXTI)EXTI 简介EXTI 配置 AFIOAFIO 与中断 案例 概述 今天小白我将带领大家详细介绍 STM32 单片机中的中断处理机制, 包括中断…

Python每日一练(20230514) 不同路径 I\II\III UniquePaths

目录 1. 不同路径 I Unique Paths 1 2. 不同路径 II Unique Paths 2 3. 不同路径 III Unique Paths 3 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 不同路径 I Unique Paths 1 一个…

Java每日一练(20230514) 滑动窗、最大子序和、转罗马数字

目录 1. 滑动窗口最大值 🌟🌟 2. 最大子序和 🌟 3. 整数转罗马数字 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1.…

C/C++每日一练(20230514) 全排列、分数转小数、排序链表去重II

目录 1. 全排列 🌟🌟 2. 分数到小数 🌟🌟 3. 删除排序链表中的重复元素 II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Ja…

【C++】unordered_map与unordered_set(系列关联式容器)

文章目录 1.unordered系列关联式容器2. unordered_map3.unordered_set 1.unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,如map和set,它们在查询时效率可达logN,即最差情况下需要比较红黑树的高度…