场景:当接口返回没有达到预期值时,重跑接口
问题: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
下次发代码要格式化,用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)