自己写的装饰器,用runner方式去执行才生效,用loader方法不生效,为什么
时间: 2024-03-17 09:46:55 浏览: 57
LoaderRunner参数详解
在 Python 的 unittest 框架中,使用 `loader` 方法加载测试用例时,会将测试用例的方法名作为字符串进行比较,从而确定是否加载该测试用例。由于装饰器会修改原函数的名称、参数等属性,这可能会导致 `loader` 无法正确地加载被装饰的测试用例。
解决这个问题的常见方法是在装饰器中使用 `functools.wraps` 装饰被装饰的函数,这可以将原函数的名称、参数等属性复制到装饰器函数中,从而避免了名称和参数的变化。
例如,在下面的代码中,我们定义了一个装饰器 `my_decorator`,它会将被装饰的函数 `my_func` 的参数转换成大写,并在每次调用时打印一条日志。为了让该装饰器在 unittest 框架中正常工作,我们在装饰器中使用 `functools.wraps` 装饰被装饰的函数。
```python
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
args = [arg.upper() for arg in args]
print("Calling my_func with args: ", args, kwargs)
return func(*args, **kwargs)
return wrapper
class MyTest(unittest.TestCase):
@my_decorator
def test_my_func(self):
self.assertEqual(my_func("hello", "world"), "HELLO WORLD")
```
如果不使用 `functools.wraps` 装饰器,在使用 `loader` 方法加载测试用例时,可能会出现找不到测试用例的情况。
阅读全文