pytest参数化
参数化数据
test_contracts.yml
add:
name: ['收款合同','付款合同','租赁合同','抵押合同','担保合同','融资合同']
amount: [550,1000,1500,2000,25000,3000]
读取参数化数据
@staticmethod
def get_params(path='case_data/test_contracts.yml'):
data=read_yml(path)['add']#{'name': ['收款合同', '付款合同', '租赁合同', '抵押合同', '担保合同', '融资合同'], 'amount': [550, 1000, 1500, 2000, 25000, 3000]}
datas=[data[key] for key in data]#[['收款合同', '付款合同', '租赁合同', '抵押合同', '担保合同', '融资合同'], [550, 1000, 1500, 2000, 25000, 3000]]
data=list(zip(*datas))#[('收款合同', 550), ('付款合同', 1000), ('租赁合同', 1500), ('抵押合同', 2000), ('担保合同', 25000), ('融资合同', 3000)]
return data
if __name__ == '__main__':
Conver_data.get_params('../../case_data/test_contracts.yml')
新增合同用例优化
from pylib.utils.pulgins import Conver_data
@pytest.mark.parametrize('name,amount',Conver_data.get_params())
def test_tc003001(after_tc003001,init_accounts,init_contracttypes,init_organiz,name,amount):
global contract
contract_api=after_tc003001
kws={
'name' : name,
'amount': amount,
'othercompany' : init_accounts['_id'],
'contract_type' : init_contracttypes['_id'],
"company_id" :init_organiz['_id'],
"create_date":Conver_data.current_time()
}
#step1
contract=contract_api.add(**kws)
#step2
contracts=contract_api.list_all()
#step3
assert contract in contracts
参数化测试用例名字
def test_tc003001(after_tc003001,init_accounts,init_contracttypes,init_organiz,name,amount):
global contract
allure.dynamic.title(name)
现在可以实现,写一个装饰器来增强下
装饰器不入侵代码
自定义装饰器
def decorate(fun):
def wrapper(*args,**kwargs):
print('fun执行前')
res=fun()
print('fun之前后')
return res
return wrapper
def demo():
print('fun执行中')
输出:
fun执行中
Process finished with exit code 0
加上装饰器
@decorate
def demo():
print('fun执行中')
输出:
fun执行前
fun执行中
fun之前后
Process finished with exit code 0
问题1:
args = (), kwargs = {}
def wrapper(*args,**kwargs):
title=kwargs['name']
E KeyError: 'name'
pylibutilspulgins.py:35: KeyError
定位检查函数有没有执行,发现函数名被改了
print(test_demo.name)
输出:
wrapper
函数名被改变了
def decorate(fun):
@wraps
问题2:
Traceback (most recent call last):
File "D:/py project/Merchants_combat/day4/pylib/utils/pulgins.py", line 50, in
test_demo()
TypeError: update_wrapper() missing 1 required positional argument: 'wrapper'
解决方法
def decorate(fun):
@wraps(fun)
输出:
test_demo
问题3:
E TypeError: test_tc003001() missing 6 required positional arguments: 'after_tc003001', 'init_accounts', 'init_contracttypes', 'init_organiz', 'name', and 'amount'
忘记传参数了
res=test_fun(*args,**kwargs)
问题4:
def test_tc003001(after_tc003001,init_accounts,init_contracttypes,init_organiz,name,amount):
E TypeError: 'NoneType' object is not callable
def dynamic(target):
def decorate_report(test_fun):
@wraps(test_fun)
def wrapper(*args,**kwargs):
title=kwargs[target]
allure.dynamic.title(title)
res=test_fun(*args,**kwargs)
return res
return wrapper
加了一层忘记返回
def dynamic(target):
def decorate(test_fun):
@wraps(test_fun)
def wrapper(*args,**kwargs):
title=kwargs[target]
allure.dynamic.title(title)
res=test_fun(*args,**kwargs)
return res
return wrapper
return decorate
动态定制title
#通过target选择参数列表中的参数内容作为定制化标题
def dynamic(target):
def decorate(test_fun):
@wraps(test_fun)#保持函数的名字
def wrapper(*args,**kwargs):
title=kwargs[target]
allure.dynamic.title(title)
res=test_fun(*args,**kwargs)
return res
return wrapper
return decorate
@dynamic('amount')
@pytest.mark.parametrize('name,amount',Conver_data.get_params())
传入amount定制化title为amount
生成报告:
os.system('allure serve tmp/report')
============================= 12 passed in 9.64s ==============================
'allure' �����ڲ����ⲿ���Ҳ���ǿ����еij���
���������ļ���
直接在控制台输入
D:py projectMerchants_combat>allure
'allure' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
解决方法:
allure下载:
https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/