def wraper_func(test_func): @wraps(test_func) # @wraps:避免被装饰函数自身的信息丢失 def inner_func(self): failures = str([fail[0] for fail in self._outcome.result.failures]) flag = (test_func in failures) if failures.find(test_func) != -1: test = unittest.skipIf(flag, "{} failed".format(test_func))(test_func) else: test = test_func return test(self) return inner_func 写的装饰器判断函数为这个,为什么上条用例跳过了,下条还是会跳过,而不是失败时才会跳过用例
时间: 2024-02-14 15:15:36 浏览: 19
根据你提供的代码,我可以看出这是一个装饰器函数,用于判断某个测试函数是否在测试结果的失败列表中。如果在失败列表中,则使用unittest.skipIf将该测试函数跳过。如果不在失败列表中,则直接执行该测试函数。
如果你发现上一条用例跳过了,而下一条用例仍然跳过,这可能是因为你的测试函数在多个测试用例中都被调用了,而且在其中一个测试用例中出现了失败。因此,该测试函数将被跳过,无论它是在哪个测试用例中调用。
解决这个问题的方法是在测试函数中添加一个条件,仅当测试在当前用例中运行时才跳过该测试。你可以通过检查unittest.TestCase实例的_id()是否与当前用例的id相同来实现这一点。例如:
```
import unittest
from functools import wraps
def skip_if_failed(test_func):
@wraps(test_func)
def inner_func(self):
failures = [fail[0] for fail in self._outcome.result.failures]
if test_func.__name__ in failures:
if self._id() == self._testMethodName:
test = unittest.skip("{} failed".format(test_func.__name__))(test_func)
else:
test = test_func
else:
test = test_func
return test(self)
return inner_func
```
在这个修改后的版本中,我们首先获取了所有失败的测试函数名称,并将其存储在failures列表中。然后,我们检查当前测试函数是否在失败列表中,以及当前测试函数的id是否与当前测试用例的id相同。只有在这两个条件都满足时,我们才会将测试函数跳过,否则我们将正常地执行它。