1.要写两个读取yaml文件的方法
2.要写一个将token写入yaml文件名2的方法
3.要写一个清空yaml文件名2的方法
4.要写一个用例执行之前清空yaml文件名2的方法,要使用fixture固件
5.创建两个yaml文件
6.接下来就写用例方法了
1.要写两个读取yaml文件的方法
def read_yaml():
with open("yaml文件名1", encoding="utf-8")as f:
value = yaml.load(f,Loader=yaml.FullLoader)
return value
def read_yaml1():
with open("yaml文件名2", encoding="utf-8")as f:
value = yaml.load(f,Loader=yaml.FullLoader)
return value
2.要写一个将token写入yaml文件名2的方法
def write_yaml(data):
with open("yaml文件名2",encoding="utf-8",mode="a")as f:
value = yaml.dump(data,stream=f,allow_unicode=True)
3.要写一个清空yaml文件名2的方法
def clear_yaml():
with open('yaml文件名2', mode='w', encoding='utf-8') as f:
f.truncate()
4.要写一个用例执行之前清空yaml文件名2的方法,要使用fixture固件
# 在所有的接口请求之前执行清空文件里的内容
@pytest.fixture(scope="session",autouse=True)
def clear_token():
clear_yaml()
5.创建两个yaml文件
yaml文件名1.yaml-装测试数据 如url,data,json,params,headers,validate等
yaml文件名2.yam-装token或者apikey,再或者下游接口的参数需要使用上游的json数据
- yaml文件名1.yaml内容:
apikey:
- name: 用户登录获取apikey接口
request:
method: post
url: https://xxx.xxxxx.xxx/developerLogin
data:
name: zxtest2
passwd: 123456
header:
extract:
apikey: $.api
user:
- name: 关联apikey接口
request:
method: post
url: https://xxx.xxxxx.xxx/loginUser
data:
# 注意template 是字符串模板,用于替换字符串中的变量,
# 是 string 的一个类引用变量有 2 种格式
# $variable 使用 $变量名 引用变量,
# ${variable} 使用 ${变量名} 大括号包起来
# 这块具体怎么使用建议网上搜一搜用法
apikey: $api
name: peakchao
passwd: 123456
header: none
- yaml文件名2.yam不需要提前写任何东西。
6.接下来就写用例方法了
class TestYamlData():
#定义session的全局变量,以便于登录
sess = requests.session()
@pytest.mark.parametrize("args",read_yaml()["apikey"])
def test_01(self,args):
url = args["request"]["url"]
data = args["request"]["data"]
method = args["request"]["method"]
res = TestYamlData.sess.request(method,url=url,data=data)
json_data = res.json()
# 提取apikey
apikey = jsonpath.jsonpath(json_data, "$..apikey")[0]
# 将apikey写入第二个 test_study_token.yaml 里面
write_yaml({"apikey": apikey})
print(json_data)
@pytest.mark.parametrize("args1", read_yaml()["user"])
def test_02(self, args1):
url = args1["request"]["url"]
# 注意template 是字符串模板,用于替换字符串中的变量,
# 是 string 的一个类引用变量有 2 种格式
# $variable 使用 $变量名 引用变量,
# ${variable} 使用 ${变量名} 大括号包起来
# 这块具体怎么使用建议网上搜一搜用法
# 使用template进行对第一个 test_study_yaml.yaml 里面的apikey: $api进行替换
template = Template(args1["request"]["data"]["apikey"])
# 将apikey的值进行读取
args1["request"]["data"]["apikey"] = template.safe_substitute({"api": read_yaml1()["apikey"]})
# 最后读取最终的结果,这时候会发现该变量$api的值已经替换成 test_study_yaml.yaml 里的内容了
data = args1["request"]["data"]
method = args1["request"]["method"]
res = TestYamlData.sess.request(method, url=url, data=data)
print(res.json())
if __name__ == '__main__':
pytest.main()
7.整体代码:
yaml文件就是上面yaml文件名1.yaml的内容
from string import Template
import jsonpath as jsonpath
import yaml
import requests
import pytest
def read_yaml():
with open("test_study_yaml.yaml", encoding="utf-8")as f:
value = yaml.load(f,Loader=yaml.FullLoader)
return value
def read_yaml1():
with open("./test_study_token.yaml", encoding="utf-8")as f:
value = yaml.load(f,Loader=yaml.FullLoader)
return value
# 写入
def write_yaml(data):
with open("./test_study_token.yaml",encoding="utf-8",mode="a")as f:
value = yaml.dump(data,stream=f,allow_unicode=True)
# 清空
def clear_yaml():
with open('./test_study_token.yaml', mode='w', encoding='utf-8') as f:
f.truncate()
# 在所有的接口请求之前执行清空文件里的内容
@pytest.fixture(scope="session",autouse=True)
def clear_token():
clear_yaml()
class TestYamlData():
#定义session的全局变量,以便于登录
sess = requests.session()
@pytest.mark.parametrize("args",read_yaml()["apikey"])
def test_01(self,args):
url = args["request"]["url"]
data = args["request"]["data"]
method = args["request"]["method"]
res = TestYamlData.sess.request(method,url=url,data=data)
json_data = res.json()
# 提取apikey
apikey = jsonpath.jsonpath(json_data, "$..apikey")[0]
# 将apikey写入第二个 test_study_token.yaml 里面
write_yaml({"apikey": apikey})
print(json_data)
@pytest.mark.parametrize("args1", read_yaml()["user"])
def test_02(self, args1):
url = args1["request"]["url"]
# 使用template进行对第一个 test_study_yaml.yaml 里面的apikey: $api进行替换
template = Template(args1["request"]["data"]["apikey"])
# 将apikey的值进行读取
args1["request"]["data"]["apikey"] = template.safe_substitute({"api": read_yaml1()["apikey"]})
# 最后读取最终的结果,这时候会发现该变量$api的值已经替换成 test_study_yaml.yaml 里的内容了
data = args1["request"]["data"]
method = args1["request"]["method"]
res = TestYamlData.sess.request(method, url=url, data=data)
print(res.json())
if __name__ == '__main__':
pytest.main()