在做接口自动化的时候经常会有一种场景是上一个接口的响应结果会用到下一个接口的请求中,通常我们会设置类变量做接口关联,但是类变量在跨py文件的时候就不是那么好用了,所以我们会将中间变量保存单独的文件中,这样进行调用的时候就直接把这个文件当成一个固件进行调用就可以了。
思路:通常我们会使用yaml文件的方法,先将中间变量写入到yaml文件中,然后下一个接口使用这个中间变量的时候再读取yaml文件,等到所有操作结束以后再将文件中的内容清清除掉
#中间变量写入yaml文件的函数
import os
import yaml
#写入
def write_yaml(data):
with open((os.getcwd()+"/extract.yaml",encoding="utf-8",mode="a+") as f:
yaml.dump(data,stream=f,allow unicode=True)
#读取yaml中的中间变量
import os
import yaml
#读取
def read yaml(key):
with open(os.getcwd()+"/extract.yaml",encoding="utf-8",mode="r") as f:
value =yaml.load(f,yaml.FullLoader)
return value[key]
#将中间文件中数据清除,因为每次执行的时候都会写入读取,
#清宅
def clear yam1():
with open(os.getcwd()+ "/extract.yaml", encoding="utf-8", mode="w")as f:
f.truncate()
实例:接口1是获取文件上传的token,接口2是将文件上传到指定的终端,接口2会用到接口1响应中的token ,这个时候将token保存在中间文件中
创建三个文件:主文件主要写接口的请求,yamldata主要写对yaml文件的写入读取还有清除,中间变量存储的文件
0730文件中代码如下
import json
import jsonpath
import pytest
import requests
from yamldata import write_yaml, read_yaml, clear_yam1
url1 = 'https://apigw-sit.ypshengxian.com/request' # 接口调用的服务器的地址
url2 = 'https://sit-api-ypsx-resource.ypsx-internal.com/resource/upload' # 将文件上传到终端的地址
filename = '库存导入模块.xlsx' # 文件的地址
filepath='E:/testproject/库存导入模版.xlsx'
# 请求头的地址
headers1 = {
'app-id': 'yptb',
'app-version': '1.0',
'app-platform': 'wxApp',
'Content-Type': 'text/plain'
}
data1 = {"api": "ylp.md.resource.service.getUploadToken", "version": "1.0", "token": "5dabc95eac7e4520ba96bbe481f785a0",
"nonce": "145a156d-d72b-11bc-bcbe-6f684dd2dca2", "login": "13270719291", "params": {"fileName": filename}}
#将data数据转换成json格式
data2=json.dumps(data1)
class TestUpload:
#先将上一次的结果给清除掉
clear_yam1()
# 接口1获取上传的token
def testupload_one(self):
res = requests.request(method='POST', url=url1, data=data2, headers=headers1).json()
idtoken = jsonpath.jsonpath(res, '$..params')[0]
idtoken1=json.loads(idtoken)['token']
datas={"token":idtoken1}
write_yaml(datas) #将中间变量写入到文件中
#接口2将文件上传到指定位置
def testupload_two(self):
files = {
"file": ("库存导入模版.xlsx", open(filepath, "rb"), "application/json") # 因为上传的文件是二进制所以要将文件以二进制的方式进行打开
}
data2 = {
"token": read_yaml('token')
}
response = requests.request(method='POST', url=url2, files=files, data=data2).json()
print(response)
def main(): #定义一个函数执行类下面所有test开头的函数
pytest.main([__file__])
if __name__ == '__main__':
main()
yamldata中的数据:
import os
import yaml
#写入
def write_yaml(data):
with open(os.getcwd()+"/extract.yaml",encoding="utf-8",mode="a+") as f:
yaml.dump(data,stream=f,allow_unicode=True)
#读取
def read_yaml(key):
with open(os.getcwd()+"/extract.yaml",encoding="utf-8",mode="r") as f:
value =yaml.load(f,yaml.FullLoader)
return value[key]
#清除
def clear_yam1():
with open(os.getcwd()+ "/extract.yaml", encoding="utf-8", mode="w")as f:
f.truncate()