• 自动化测试框架Pytest(六)——requests封装


    requests是用来发送http请求以及接收http响应的python第三方库,主要用于做接口自动化。今天我们来学习一下如何封装到pytest里。

    1、安装requests

    pip install requests

    2、requests库常用方法。包括了http的几种常见请求和必填参数

    requests.get(url, params=None, **kwargs)requests.post(url, data=None, json=None, **kwargs)requests.put(url, data=None, **kwargs)requests.delete(url, **kwargs)requests.request(method, url, **kwargs)

    3、get请求的常用返回值,这里测试用的是我自己写的一个jira方法

    import requests
    class TestApi:
        def test_get(self):        url = "http://172.19.1.34:8015/emanage/getissue"        datas = {            "issue":"PAY"        }
            res = requests.get(url=url,params=datas)        print(res.text) #返回body的文本信息        print(res.json) #返回body的json格式        print(res.content) #返回body的byte类型        print(res.status_code)  # 返回状态码        print(res.reason)  # 返回状态信息        print(res.cookies)  # 返回响应的cookie信息        print(res.encoding)  # 返回编码格式        print(res.headers)  # 返回响应头        print(res.request.method)  # 返回请求的数据

    4、post请求和get请求差不多,需要注意的是json和字符串之间的转换

    json.loads() 把json字符串转化成dict
    json.dumps() 把dict转化成json字符串​​​​​​​

        def test_post(self):        urls = "http://172.19.1.34:8016/hdj/s1/"        datas = {              "user": "wufan",              "sqlword": "select * from t_11"        }
            res = requests.post(url=urls, data=datas)        print(res.json())

    5、实际案例:

    获取微信小程序的token接口并通过token去获取小程序标签

    • 获取微信小程序appid和secret的方式,访问下面地址,微信登录即可

    https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
    • 获取了appid和secret后就可以获取小程序的token了

    import jsonimport re
    import requests
    class TestProductApi:
        access_token = ""    session = requests.session() #通过session去关联,session默认情况下会自动关联cookie
    
        def test_get_token(self):         print("获取token鉴权码")         urls = "https://api.weixin.qq.com/cgi-bin/token"         datas = {              "grant_type":"client_credential",              "appid":"wx8e8b67ced3c4b884",              "secret":"27c524bd9ca932e31e229be30b0a805b"         }
             res = TestProductApi.session.request("get",url=urls,params=datas)
             TestProductApi.access_token = res.json()['access_token']         print(TestProductApi.access_token)

    6、上面的案例,data和url都是直接写在用例里,不便于后期维护。

    下面我们对requests进行第一层封装,在yaml文件里读取参数。

    在commons/yaml_util.py工具里新增方法:​​​​​​​

    #读取测试用例def read_testcase_yaml(yaml_path):    with open(get_object_path()+yaml_path,encoding='utf-8') as f:        value = yaml.load(f,Loader=yaml.FullLoader)        return value

    将get请求需要的参数写在pm_get_token.yaml文件里:​​​​​​​

    -  name: 获取token鉴权码  request:    method: get    url: https://api.weixin.qq.com/cgi-bin/token    params:      grant_type: client_credential      appid: wx8e8b67ced3c4b884      secret: 27c524bd9ca932e31e229be30b0a805b  validate: none

    修改用例,参数从yaml文件里去读取:​​​​​​​

    # 测试类名必须以Test开头,并且不能有init方法import pytestimport requests
    from test6.commons.yaml_util import read_testcase_yaml
    class TestProductApi:
        #测试方法必须以test开头    @pytest.mark.parametrize("args_name"read_testcase_yaml('/testcase/pm_get_token.yaml'))    def test_get_token(self, args_name):        url = args_name['request']['url']        params = args_name['request']['params']        res = requests.get(url=url,params=params)        print(res.json()['access_token'])
    

    接口调取成功,成功输出token

    7、虽然参数都写到yaml文件里去了,但代码还是复杂了一点。

    我们来进行第二次封装,新建一个/commons/request_util.py,

    里面包含了校验yaml文件格式:​​​​​​​

    import reimport requests
    class RequestUtil:    session = requests.session()    #规范YAML测试用例    def standard_yaml(self,caseinfo):        caseinfo_keys = caseinfo.keys()        # 判断关键词是否完整        if "name" in caseinfo_keys and "request" in caseinfo_keys and "validate" in caseinfo_keys:            cs_request = caseinfo['request']            cs_request_keys = cs_request.keys()            if "method" in cs_request_keys and "url" in cs_request_keys:                method = cs_request.pop("method") #pop-删除列表里最后一个并且返回这个值                url = cs_request.pop("url")                res = self.send_request(method,url,**cs_request)                # return_text = res.text                print(res.json()['access_token'])                return res            else:                print("二级关键字必须包含:method,url")        else:            print("一级关键字必须包含:name,request,validate")
        #统一请求封装    def send_request(self, method, url, **kwargs):        method = str(method).lower()        res = RequestUtil.session.request(method,url,**kwargs)        return res

    新建一个用例,调用request_util工具,

    这次只要一句话就可以请求接口了:​​​​​​​

     @pytest.mark.parametrize("caseinfo", read_testcase_yaml('/testcase/pm_get_token.yaml'))    def test_get_token2(self, caseinfo):        RequestUtil().standard_yaml(caseinfo)

    查看结果,也能成功获取token,但是代码简单了许多,两个用例都能获取token:


    学习资源分享

    最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

    这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….

    如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入下方我的qq群大家一起讨论交流,里面也有各种软件测试资料和技术交流。

  • 相关阅读:
    面试被经常问的SQL窗口函数!
    IP-adapter masking
    推荐系统笔记(四):NGCF推荐算法理解
    leetcode1678:设计Goal解析器(11.6每日一题)
    Windows 和 Linux 下后台运行 Jar包
    拉曼光谱仪 便携式手持拉曼光谱分析仪识别仪 1064激发波长 抗荧光干扰 无损快速一键检测TFN F670
    C# GFPGAN 图像(人脸面部)修复
    某百亿头部量化私募企业在招岗位:AI算法工程师年base60-200万+bonus+cut965制度“岗位职责:base 北京 上海 杭州 深圳
    【校招VIP】java语言考点之异常
    [英雄星球七月集训LeetCode解题日报] 第2日 字符串
  • 原文地址:https://blog.csdn.net/m0_58026506/article/details/126385908