• 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'

    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
    图 5

    生成报告:
    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/

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

  • 相关阅读:
    《Flutter实战·第二版》
    vue 加载本地 json文件
    如何发布自己的npm包(超详细步骤,博主都在用)_前端小丑CSDN博客_npm 发布自己的包
    前端开发常用JS功能函数
    silo相关
    配置
    RTLRegister Transfer Level
    驱动调试方法 1.查看内核打印日志 2.挂虚拟机调试
    经典版沙盒被启动
    rpcss
  • 原文地址:https://www.cnblogs.com/xiehuangzhijia/p/15158664.html
Copyright © 2020-2023  润新知