自动化测试框架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 json
import 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 pytest
import 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 re
import 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:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值