7.pytest参数化

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

图 3

参数化测试用例名字

图 4

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'

pylib\utils\pulgins.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
图 5

生成报告:
os.system('allure serve tmp/report')

============================= 12 passed in 9.64s ==============================
'allure' �����ڲ����ⲿ���Ҳ���ǿ����еij���
���������ļ���

直接在控制台输入
D:\py project\Merchants_combat>allure
'allure' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

解决方法:

allure下载:
https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/

参考地址:
https://www.jianshu.com/p/5134eee6594b

posted @ 2021-08-18 20:27  幸福一家  阅读(166)  评论(0编辑  收藏  举报