以下方法是用于python+pytest+yaml框架下,多个接口之间的参数关联。例如:登录接口返回的token用于下一个接口使用。
方法一:使用os.environ来存储及获取参数
yaml文件编写如下,动态获取的参数为$sms
-
case_id: login_success
title: 获取登录需要的参数
url: /reglogin
method: get
data:
mobile: 18829354854
sms: $sms
timestamp: 1629858222
ex_result:
code: 0
result: {"expire": 3000}
在登录接口下的py文件中,将获取到的参数存起来,语法如下:
os.environ["sms"] = "6666"
封装获取完整测试数据的函数,即将yaml中的动态参数补齐:
import yaml
import os
from string import Template
import json
def replace_yaml(data,**kwargs):
tempTemplate1 = Template(json.dumps(data))
dic = {}
if len(kwargs) == 0 :
data = tempTemplate1.safe_substitute(os.environ)
else:
for key in kwargs:
dic[key] = kwargs[key]
data = tempTemplate1.safe_substitute(dic)
data = json.loads(data)
return data
在其他接口中调用replace_yaml函数,获得完整的参数:
方法一:部分参数动态获取,例如sms、appkey
new_data = replace_yaml(data,sms=os.environ["sms"],appkey="20")
方法二:全部os.environ中有存储且xml中设置动态获取的参数,进行动态获取
new_data = replace_yaml(data)
方法二:定义全局类变量类,存储参数
新建全部变量类py文件:
@staticmethod
class GlobalData(object):
cookie = {}
登录接口中获取token,将token存入类变量中,语法如下:
from util.get_globals_data import GlobalData
GlobalData.cookie["token"] = "DFSAFSDGAFSDGjgiojsdofigjsdg"
其他接口中,直接从类变量中取参数token:
from util.get_globals_data import GlobalData
def test_page():
data = GlobalData.cookie["token"]
print ("11111111111111:{}".format(data))
方法三:conftest.py文件内,fixture获取
conftest.py文件编写请求登录接口,获取token等必须的参数:
import pytest
# scope='session',session代表仅运行一次
@pytest.fixture(scope='session')
def get_token():
token = "1111"
uid = "22222"
print ("hahha ")
return token,uid
其他用例直接引入该函数即可,如下:
def test_login(data,get_token):
token = get_token[0]
uid = get_token[1]
方法四:使用装饰器,封装存参和取参
创建get_globals_data.py文件
def xx(fun):
ins={}
def _xx(*args,**kw):
if fun not in ins:
ins[fun]=fun(*args,**kw)
return ins[fun]
return _xx
@xx
class Pool(object):
def __init__(self):
self.data = {}
def set_value(self,keyname,valuename):
self.data[keyname] = valuename
def get_value(self,keyname):
valuename = self.data[keyname]
return valuename
例如test_passport.py文件使用的时候:
from util.get_globals_data import Pool
Pool().set_value("uid","11111")
Pool().get_value("uid")
后续有其他方法时,不断更新中