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