Python接口自动化 ❀ Request库详解和框架封装

这篇具有很好参考价值的文章主要介绍了Python接口自动化 ❀ Request库详解和框架封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、目前软件测试的市场行情以及测试人员的能力标准

从招聘需求我们不难看出目前市面上对软件测试人员的要求:

  • 综合型的测试人才、侧重业务能力
  • 代码能力(在自动化框架这一块有一定的建树)
  • 开发思维(代码的封装能力)

而接口测试或者接口自动化是每一个面试环节都必问的,比如:

  • 主流接口测试工具
    • Postman+Newman+Jenkins持续集成接口自动化(基于Javascript语言)
    • Jmeter+Ant+Jenkins持续集成接口自动化(基于Java语言)
  • 接口自动化测试以及接口自动化平台测试(一般适用于中大型的项目或者公司)
    • python+requests+pytest+yaml+allure+logging+jenkins接口自动化

既然我们有postman、jmeter、apifox等工具都可以实现接口测试,为什么我们还要封装框架或者是开发测试平台?工具的弊端如下:

  • 敏捷开发接口数量巨大,如何实现团队合作和版本控制(如果是联网协助,安全问题?)
  • 功能太死板,有些接口功能难以实现(比如:自定义加密、RSA加密、签名等)
  • 当接口项目当中出现了多种协议的接口
  • 没有办法生成美观的测试报告以及日志监控的实现
  • 框架或平台可以自动以功能并推广到所有的项目中复用

二、全面熟悉Requests库以及顶层方法调用逻辑

2.1 requests库

requests库是用来发送HTTP请求,接受HTTP响应的Python第三方库,主要用于做接口自动化测试,使用前需要安装:

pip install requests

2.1 详解requests模块常用方法

def get(url, params=None, **kwargs): 发送get请求
    url:接口请求地址
    params:是get请求用于传参,这个参数会自动的以?的方式加到url之后,多个参数之间用&分割。
    **kwargs:可变长度字典参数
    

def post(url, data=None, json=None, **kwargs): 发送post请求
    data:用于传参
    json: 用于传参
    files: 文件上传
    
    基于Postman:
        form-data: 既有表单参数也有文件上传 files
        Content-Type:multipart/form-data
        x-www-form-urlencoded 表单          (data)
        Content-Type:application/x-www-form-urlencoded (data)
        raw: json(json),xml(data),text(data)
        Content-Type:application/json (json)
        Content-Type:text/plain (data)
        Content-Type:application/javascript (data)
        Content-Type:text/html (data)
        Content-Type:application/xml (data)
        binay:二进制文件上传(data)
        Content-Type:application/octrent-stream (data)
        

def put(url, data=None, **kwargs):  发送put请求
def delete(url, **kwargs):          发送delete请求
------------------------------------------------------------------------

requests模块下的:
def request(method, url, **kwargs):   发送任意请求,它是get、post、put、delete的底层方法

------------------------------------------------------------------------

def session():       获得一个session对象
session对象的:
def request(         session对象的request方法
    self,
    method,                    请求方式 get post put delete
    url,                       请求URL地址,接口文档标准的接口请求地址
    params=None,               params参数:请求数据中的链接,常见的一个get请求,请求参数都是放在url地址
    data=None,                 data参数:请求数据,参数为表单的数据格式
    json=None,                 json参数:接口常见的数据请求格式
    headers=None,              请求头:请求头信息 ,http请求中,编码方式等内容的添加
    cookies=None,              cookie信息:保存用户的登录信息。比如做一些充值功能,但是需要用户已经登录
    files=None,                文件上传
   -----------------------------------------------以上为常用参数-------------------
    auth=None,                 鉴权的意思,接口设置操作权限
    timeout=None,              超时处理
    allow_redirects=True,      重定向,请求不成功,再次请求(该功能并不是很常用)
    proxies=None,              设置代理
    hooks=None,                钩子
    stream=None,               文件下载功能,通过请求方式,下载文件,进行验证
    verify=None,               证书验证 1.要么请求忽略证书 2.要么加载证书地址
    cert=None,                 CA证书
):
reuests.request()和session.request()的区别在于:
前者的每一个请求都是独立的,后者会自动的关联所有的请求cookies信息(类似于jmeter中的http cookies管理器)
                                                                                                                                                                                                                                                                

2.3 requests模块中的response对象的属性和方法

使用requests方法后会返回一个response对象,存储服务器的返回信息。response返回信息如下:

res = requests.get(url,params):
    
res.text        返回字符串类型的数据,主要是文本
res.content     返回bytes字节类型数据,主要取照片和文件,中文显示为字符
res.json()      返回字典格式的数据
res.status_code 返回状态码
res.reason      返回状态信息
res.cookies     返回cookies信息 
res.encoding    返回编码格式
res.headers     返回响应头信息

三、requests接口自动化测试实战

  1. get请求接口 get请求接口(需要关联接口)
  2. post请求接口(包括json传参和data传参)
  3. 文件上传接口
  4. 访问phpwind首页接口(正则表达式应用)
  5. 登录phpwind接口(包括:请求头、cookie鉴权、session鉴权)
import re
import time
import requests

class TestApi:
    # 类变量
    access_token = ""
    csrf_token = ""
    session = requests.session()  # 创建会话对象

    # get请求接口
    def test_get_token(self):
        urls = "https://api.weixin.qq.com/cgi-bin/token"
        datas = {
            "grant_type": "client_credential",
            "appid": "wx6b11b3efd1cdc290",
            "secret": "106a9c6157c4db5f6029918738f9529d"
        }
        res = requests.get(url=urls, params=datas)
        result = res.json()
        TestApi.access_token = result["access_token"]
        print(result["access_token"])
        # 在第一个接口里面获取到access_token鉴权码

    # get请求接口(需要关联接口)
    def test_select_flag(self):
        urls = "https://api.weixin.qq.com/cgi-bin/tags/get"
        datas = {
            "access_token": TestApi.access_token
        }

        res = requests.get(url=urls, params=datas)
        print(res.json())

    # post请求接口(包括json传参和data传参)
    def test_edit_flag(self):
        urls = "https://api.weixin.qq.com/cgi-bin/tags/update"
        ps = {
            "access_token": TestApi.access_token
        }
        datas = {"tag": {"id": 7206, "name": "beibei" + str(int(time.time()))}}
        res = requests.post(url=urls, json=datas, params=ps)
        print(res.json())

    # 文件上传接口
    def test_file_upload(self):
        urls = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + TestApi.access_token
        datas = {
            "media": open(r"E:\shu.png", "rb")
        }
        res = requests.post(url=urls, files=datas)
        print(res.json())

    # 访问phpwind首页接口(正则表达式应用)
    def test_phpwind(self):
        urls = "http://47.107.116.139/phpwind"
        res = TestApi.session.get(url=urls)
        result = res.text
        TestApi.csrf_token = re.search('name="csrf_token" value="(.*?)"', result).group(1)
        print(TestApi.csrf_token)

    # 登录接口(包括:请求头,cookie鉴权,seeion鉴权)
    def test_login(self):
        urls = "http://47.107.116.139/phpwind/index.php?m=u&c=login&a=dorun"
        datas = {
            "username": "fwj1151617715",
            "password": "123456",
            "csrf_token": TestApi.csrf_token,
            "backurl": "http://47.107.116.139/phpwind/",
            "invite": ""
        }

        headers = {
            "Accept": "application/json, text/javascript, /; q=0.01",
            "X-Requested-With": "XMLHttpRequest"
        }

        # res = request.post(url=urls,data=datas,headers=headers)
        res = TestApi.session.post(url=urls, data=datas, headers=headers)
        print(res.text)


if __name__ == '__main__':
    TestApi().test_get_token()
    TestApi().test_select_flag()
    TestApi().test_edit_flag()
    TestApi().test_phpwind()
    TestApi().test_login()

3.1 接口关联必用的三种方式以及对应python库详解:

1、通过类变量保存中间变量实现接口关联 (上面代码使用到的就是类变量实现)
2、通过单独的文件保存中间变量实现接口关联
3、极限封装成零代码方式提取和使用接口关联

3.2 变量提取方式

3.2.1 正则提取

正则提取(正则表达式只能提取字符串的数据)
1、re.seach:只匹配一个值,通过下标[1]取值,没有匹配到放回None
2、re.findall:匹配多个值,返回列表list,多个值通过下标取值,,没有则返回None

token = re.search('"token":"(.*?)",',res.text)[1]
print("token1:%s",%token)

token = re.findall('"token":"(.*?)",'res.text)
print("token2:%s",%token)

3.2.2 JsonPath提取

JsonPath提取(jsonpath只能够提取json格式的数据)
jsonpath.jsonpath,返回的是一个列表,通过下标取值,没有则返回None

四、接口自动化框架封装

目的:简化接口自动化的落地实施,统一化、标准化,企业期望达到:不懂代码的团队也能够通过框架实现接口自动化测试

4.1 接口自动化统一请求封装

为什么要封装统一接口请求?

  1. 去重重复的、冗余的代码
  2. 实现统一的异常处理和日志监控

封装代码如下:

#统一请求封装
import requests

class RequestsUtil:
    """
    使用requests底层代码进行封装
    """

    # 创建请求会话,使其会话保持一致,会自动关联所有请求的cookies信息
    sess = requests.session()

    def send_all_request(self, **kwargs):

        #发送请求
        res = RequestsUtil.sess.request(**kwargs)
        return res

五、接口自动化测试框架封装之接口关联封装改进(python+pytest+yaml+allure+requests)

接口关联:创建一个extract.yaml文件存放关联数据,使用yaml文件写和读的操作进行接口关联

Python接口自动化 ❀ Request库详解和框架封装

#commons--->yaml_util.py文件

import requests
import yaml

class YamlApi:
    def __init__(self, yaml_file):
        """
        通过init方法把yaml文件传入到这个类
        :param yaml_file: yaml文件路径
        """
        self.yaml_file = yaml_file
    
    def read_yaml(self):
        """
        读取yaml,对yaml反序列化,就是把我们的yamk格式转成dict格式
        :return: 返回读取的字典格式的值
        """
        with open(self.yaml_file, encoding="utf-8") as f:
            value = yaml.load(f, Loader=yaml.FullLoader)
            print(value)
        return value

    def write_yaml(self, data):
        """
        :param data: 要写入的数据
        :return:
        """
        with open(self.yaml_file, encoding="utf-8", mode="a+") as f:
            yaml.dump(data, stream=f, allow_unicode=True)

    def clear_yaml(self):
        """
        清空
        :return:
        """
        with open(self.yaml_file, encoding="utf-8", mode="w") as f:
            f.truncate()



if __name__ == '__main__':

    # YamlApi("../testcase/test_api.yaml").write_yaml("aaaa")
    YamlApi("../testcase/test_api.yaml").read_yaml()


#commons--> requests_util.py文件

import requests

class RequestsUtil:
    """
    使用requests底层代码进行封装
    """

    # 创建请求会话,使其会话保持一致,会自动关联所有请求的cookies信息
    sess = requests.session()

    def send_all_request(self, **kwargs):
        """
        将get、post、put、delete请求进行封装
        :param kwargs:

        :return: 返回请求对象
        """
        res = RequestsUtil.sess.request(**kwargs)
        print(res.text)
        print(res.status_code)
        return res

#interfacecase-->test_inter.py文件

import pytest
from commons.requests_util import RequestsUtil
from commons.yaml_util import YamlApi

class TestApi:

    @pytest.mark.parametrize("caseinfo", YamlApi("./testcase/test_api.yaml").read_yaml())
    def test_get1_token(self, caseinfo):
        urls = caseinfo['request']['url']
        datas = caseinfo['request']['data']
        RequestsUtil().send_all_request(method="get", url=urls, data=datas)

注意:这块的文件路径有一个坑,是以all.py文件为参照物来定义路径,所以路径是./testcase/test_api.yaml

#testcase-->test_api.yaml文件-

- name: 获取token鉴权码的接口
  request:
    method: get
    url: https://api.weixin.qq.com/cgi-bin/token
    data:
      grant_type: client_credential
      appid: wx74a8627810cfa308
      secret: e40a02f9d79a8097df497e6aaf93ab80
    vaildata: None

# 上面的- 必需加
# 全局下的pytest.ini文件

[pytest]
#命令行参数,用空格分割
addopts = -vs
#测试用例文件夹,可自己配置
testpaths = ./
#配置测试搜索的模块文件名称
python_files = test_*.py
#配置测试搜索的测试类名
python_classes = Test*
#配置测试搜索的测试函数名
python_functions = test*
#加一个基础路径(测试环境)

#标记
markers =
    smoke:冒烟用例
    usermanage:用户管理模块
    productmangage:商品管理模块
#全局下的all.py文件

import pytest

if __name__ == '__main__':
    pytest.main()

Python接口自动化 ❀ Request库详解和框架封装文章来源地址https://www.toymoban.com/news/detail-420682.html

到了这里,关于Python接口自动化 ❀ Request库详解和框架封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • python接口自动化之request请求,如何使用 Python调用 API?

    python接口自动化之request请求,如何使用 Python调用 API?

        尊重原创,转载请注明出处,谢谢!!

    2024年02月08日
    浏览(13)
  • python+request+pytest+allure接口自动化使用说明书

    接口自动化使用与流程设计: 一、设计思路 1、一个好的框架,必须要可读性强,所以目录规划尤为重要; 2、公共的方法提取出来,提高复用性; 3、可变的环境等参数,提取出来放到配置文件中,这样,每次只需要更改配置文件中的值; 4、为了追踪错误,需要必要的日志

    2024年02月09日
    浏览(53)
  • 如何编写接口自动化框架系列之unittest测试框架的详解(二)

    如何编写接口自动化框架系列之unittest测试框架的详解(二)

    在编写自动化框架过程中 ,我们首先想到的就是选择一个合适的测试框架 ,目前常用的测试框架有unittest和pytest , unittest比较简单,适合入门着学习 ;而pytest比较强大,适合后期进阶 。本文主要介绍的就是unittest框架 。接下来 ,我们从以下三个问题开始说明: unittest是什么

    2024年02月07日
    浏览(13)
  • Python 接口自动化 —— requests框架

    Python内置的urllib模块,也可以用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。因此我们使用 requests 模块进行进行接口测试。 requests官方文档资料地址: http://cn.python-requests.org/zh_CN/latest/ cmd(win+R快捷键)输入: 提示以下信息表示安装成功。

    2024年02月08日
    浏览(12)
  • 从零搭建完整python自动化测试框架(UI自动化和接口自动化

    从零搭建完整python自动化测试框架(UI自动化和接口自动化

    总体框架 PO模式、DDT数据驱动、驱动 框架技术选择 框架运行结果 各用例对应的定义方式(PO/DDT) 测试执行结果 从零开始搭建项目 一、开发环境搭建 二、新建项目 三、基础功能实现 1. 配置功能实现(Conf) 2. 日志功能实现(Log) 3. 读取EXCEL实现(data) 4. 邮件发送实

    2024年02月07日
    浏览(14)
  • 从零搭建完整python自动化测试框架(UI自动化和接口自动化)

    从零搭建完整python自动化测试框架(UI自动化和接口自动化)

    总体框架 PO模式、DDT数据驱动、驱动 框架技术选择 框架运行结果 各用例对应的定义方式(PO/DDT) 测试执行结果 从零开始搭建项目 一、开发环境搭建 二、新建项目 三、基础功能实现 1. 配置功能实现(Conf) 2. 日志功能实现(Log) 3. 读取EXCEL实现(data) 4. 邮件发送实

    2024年02月04日
    浏览(16)
  • python+requests接口自动化框架的实现

    python+requests接口自动化框架的实现

    为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离;数据的变更不影响程序 3、有日志功能,实现无人值守 4、自动发送测试报告 5、不懂编程的测试人员也可以进行测试 正常接口测试的流程是什么? 确定接口测试使用的工具-----配置需要的接口参数----

    2024年03月13日
    浏览(18)
  • 基于Python接口自动化测试框架(初级篇)附源码

    基于Python接口自动化测试框架(初级篇)附源码

    目录 引言 框架设计思路 框架结构 运行程序 总结 总结:   很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢? 相同之处就不说了,先说一下工具的局限性: 1.测试数据不可控

    2024年02月11日
    浏览(10)
  • python pytest 最简单的接口自动化测试框架

    最近由于工作的原因,需要开发一个接口自动化测试框架,使用pytest框架、数据驱动,并展示直观的测试报告。 具体的开发过程如下: 安装必要的库: pytest:用于编写和运行测试用例。 requests:用于发送 HTTP 请求。 pytest-html:用于生成 HTML 格式的测试报告。 可以使用以下命

    2024年03月19日
    浏览(29)
  • 从零搭建完整 Python 接口自动化测试框架—持续更新

    从零搭建完整 Python 接口自动化测试框架—持续更新

    本接口自动化框架采用 python + unittest + request + openpyxl + myddt + pymysql 来实现接口自动化。  unittest 是 Python 自带的一个单元测试框架 2.1 作用 管理用例 批量执行用例 组织运行结果/报告 让代码更稳健 可拓展 2.2 unittest 框架中,有以下几个组件: TestCase:即测试用例,Unittest提供

    2024年02月09日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包