request+pytest根据yaml文件发送请求

request怎么跟pytest结合起来,然后根据yaml文件去发一个基本的请求呢?
下面是一个简单的示例。
1、先新建一个名为“demo.yaml”的yaml文件,用来存放测试数据的。
-
  name: G广州研发中心
  parentid: 1   #第一次用例的数据正常
  expect: 60008     #对请求结果进行断言
- name: ""
  parentid: 1   #第二次用例的数据name为空
  expect: 40058     #对请求结果进行断言
- name: F广州研发中心
  parentid:     #第三次用例的数据parentid为空
  expect: 60004     #对请求结果进行断言

这里存放的我们执行部门创建用例的三个测试用例。 

其中expect为这个用例执行的返回结果errcode做了一个断言,第一个用例是正常的数据,但是它已经在我们的部门列表中存在存在了,所以我们通过后来的用例执行可以知道60008表示该部门已存在,用例二是40058是部门名字为空,用例三是parentid为空错误码是60004;因为name跟parentid是必填字段不能为空。

2、读取数据的工具包,创建utils.py文件,用来存放读demo.yaml的代码,在utils中去写一个方法:
import yaml


def read_yaml(path):
    with open(path, "r", encoding="utf-8") as f:
        data = yaml.safe_load(f)
        return data

这个文件就是来读demo.yaml测试数据文件的。

3、然后新建一个名为“test_demo.py”的测试文件,测试文件一般都以test开头或者结尾。
写一个测试用例:
import pytest
import requests
from utils import read_yaml
import yaml


class TestDemo:
 #创建部门时要先获取一个token
    def setup_class(self):
        ID = "ww71bb4160935cc48d"#企业ID
        SECRET = "Px17uiWMpszjPNjVMD-zMG14PRnK1ng2LrfbwL--JAg"#企业密钥
        url = f" https://qyapi.weixin.qq.com/cgi-bin/gettoken"#获取token的接口地址
        #把参数维护在字典中
        param = {
             "corpid": ID,
             "corpsecret": SECRET
        }
        # 请求方式和请求地址
        r = requests.request("get", url, params=param)#用过param参数把维护在字典中的请求参数传到里面
        self.token = r.json()["access_token"]

    #测试用例
    #通过读取yaml文件来获取测试数据
    #用数据驱动来获取测试数据from utils import read_yaml
    @pytest.mark.parametrize("case", read_yaml("demo.yaml"))
    def test_01(self, case):
        #创建部门为例
        url = "https://qyapi.weixin.qq.com/cgi-bin/department/create"
        #access_token维护到字典中
        param = {
            "access_token": self.token
        }
        data = {
            "name": case["name"],
            "parentid": case["parentid"]
        }
        r = requests.request("post", url, params=param,json=data)
        assert r.json()["errcode"] == case["expect"]

if __name__ == '__main__':
    pytest.main()
部门创建的基础是获取token,所以我们首先要进行的是对token的获取:
 #创建部门时要先获取一个token
    def setup_class(self):
        ID = "ww71bb4160935cc48d"#企业ID
        SECRET = "Px17uiWMpszjPNjVMD-zMG14PRnK1ng2LrfbwL--JAg"#企业密钥
        url = f" https://qyapi.weixin.qq.com/cgi-bin/gettoken"#获取token的接口地址
        #把参数维护在字典中
        param = {
             "corpid": ID,
             "corpsecret": SECRET
        }
        # 请求方式和请求地址
        r = requests.request("get", url, params=param)#用过param参数把维护在字典中的请求参数传到里面
        self.token = r.json()["access_token"]
拿到了token我们才能去执行部门创建的用例:
 #测试用例
    #通过读取yaml文件来获取测试数据
    #用数据驱动来获取测试数据from utils import read_yaml
    @pytest.mark.parametrize("case", read_yaml("demo.yaml"))
    def test_01(self, case):
        #创建部门为例
        url = "https://qyapi.weixin.qq.com/cgi-bin/department/create"
        #access_token维护到字典中
        param = {
            "access_token": self.token
        }
        data = {
            "name": case["name"],
            "parentid": case["parentid"]
        }
        r = requests.request("post", url, params=param,json=data)
        assert r.json()["errcode"] == case["expect"]
然后最后加一个执行的代码,从这执行测试用例:这样可以保证文件中的主程序能够执行,main函数被调用:

if __name__ == '__main__':
    pytest.main()
或者直接把这个写到main.py中去执行:
import pytest

if __name__ == '__main__':
    pytest.main()
4、用例执行结果:

request+pytest根据yaml文件发送请求_第1张图片

可以看到,只有第一个正常的用例执行成功了。
6、我们再修改一下后来两个的测试数据,让它们也可以执行成功:
-
  name: G广州研发中心
  parentid: 1   #第一次用例的数据正常
  expect: 60008     #对请求结果进行断言
- name: 12345
  parentid: 1   #第二次用例的数据name为空
  expect: 40058     #对请求结果进行断言
- name: F广州研发中心
  parentid:  1   #第三次用例的数据parentid为空
  expect: 60004     #对请求结果进行断言
执行结果:

request+pytest根据yaml文件发送请求_第2张图片

我们可以看到虽然成功添加了部门,但是断言是失败的,因为我们执行成功的返回码应该是0,但是我们断言的是40058和60004,所以pycharm中断言失败:

你可能感兴趣的:(pytest)