Python unittest:使用Nose在失败时重试?

3 投票
2 回答
3179 浏览
提问于 2025-04-17 00:33

我有一个测试,它有时候会随机失败。我想让它在发送错误信息之前,尝试多次。

我在用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次通过,那就算通过)。

GitHub flaky 项目

如何为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

撰写回答