Python unittest:使用Nose在失败时重试?
我有一个测试,它有时候会随机失败。我想让它在发送错误信息之前,尝试多次。
我在用Python和Nose这个工具。
我写了下面的代码,但不幸的是,即使我用了try/except来处理错误,当测试第一次失败时,Nose还是会返回一个错误。
def test_something(self):
maxAttempts = 3
func = self.run_something
attempt = 1
while True:
if attempt == maxAttempts:
yield func
break
else:
try:
yield func
break
except:
attempt += 1
def run_something(self):
#Do stuff
谢谢
2 个回答
4
你可以在你的函数上使用一些属性,借助flaky nose 插件,这个插件会自动重新运行测试,并让你使用一些高级参数(比如如果3次测试中有2次通过,那就算通过)。
如何为Python安装Flaky插件:
pip install flaky
示例nose测试运行器配置:
nosetests.exe your_python_tests.py --with-flaky --force-flaky --max-runs=3
示例Python代码,其中函数被标记为Flaky属性:
from flaky import flaky
@flaky
def test_something_that_usually_passes(self):
value_to_double = 21
result = get_result_from_flaky_doubler(value_to_double)
self.assertEqual(result, value_to_double * 2, 'Result doubled incorrectly.')
3
通过使用生成器,你给nose提供了maxAttempts
次测试机会。如果其中任何一个测试失败了,整个测试套件就会失败。这里的try/catch并不适用于你所生成的测试,因为是nose在运行这些测试。你可以这样重写你的测试:
def test_something(self):
maxAttempts = 3
func = self.run_something
attempt = 1
while True:
if attempt == maxAttempts:
func() # <<<--------
break
else:
try:
func() # <<<--------
break
except:
attempt += 1
def run_something(self):
#Do stuff