pytest 接口使用装饰器报错:In wrapper: function uses no argument 'payMethod'

场景:当接口返回没有达到预期值时,重跑接口
问题:1.把装饰器和函数都放在同一个文件,报错:In wrapper: function uses no argument ‘payMethod’
但是我单独跑类似代码 又没问题
2. 这种应如何优化,放在test_测试用例中感觉不太好,而且每个用例都需要调用



你装饰器改成这样子试试

def failrerun(n=3):
    def decorator(func):
        def wrapper(*args,**kwargs):
            self = args[0] # 获取函数中的第一个参数
            logger.info("进入重跑机制")
            for i in range(n):
                try:
                    r = func(self, *args, **kwargs)
                    logger.info(f"无异常??{r}")
                    return r
                except Exception as  err:
                    logger.info(f"用例第{i+1}次失败原因:{err}")

也一样报错,不过把参数化去掉就不报错了 不知道这样为啥不行

把装饰器的部分copy 出来

def failrerun(n=3):
def decorator(func):
def wrapper(*args, **kwargs):
logger.info(“进入重跑机制”)
for i in range(n):
try:
r=func(*args, **kwargs)
logger.info(f"无异常??{r}")
return r
except Exception as err:
logger.info(f’用例第{i+1}次失败原因:{err}’)
# raise NameError
return wrapper
return decorator

下面两图是添加self的运行结果


下次发代码要格式化,用markdown 的代码块发

from symbol import decorator
import pytest

import decorator
def failrerun(n=3):
    def inner(func):
        def wrapper(*args, **kwargs):
            print("aaaa")
            # logger.info("进入重跑机制")
            for i in range(n):
                try:
                    r=func(*args, **kwargs)
                    print("bbbb")
                    # logger.info(f"无异常??{r}")
                    return r
                except Exception as err:
                    print("error")
                    # logger.info(f'用例第{i+1}次失败原因:{err}')
            # raise NameError
        return decorator.decorator(wrapper, func)
    return inner


@pytest.mark.parametrize("name", [1,2,3])
@failrerun(3)
def test_demo(name):
    print("test_demo", name)