Python unittest: Повторить попытку в случае сбоя с Nose? - PullRequest
2 голосов
/ 29 августа 2011

У меня есть тест, который случайно проваливается, и я хочу позволить ему повторить попытку несколько раз перед отправкой сообщения об ошибке.

Я использую Python с Nose.

Я написалниже, но, к сожалению, даже с обработкой try / кроме 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 ]

3 голосов
/ 18 мая 2015

Вы можете использовать атрибуты в своих функциях с плагином flaky nose , который будет автоматически перезапускать тесты и позволять вам использовать расширенные параметры (например, если 2 из 3 пройден, то это будет проход)

GitHub Flaky Project

Как установить плагин Flaky для Python:

pip install flaky

Пример конфигурации тестера носа:

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.')
2 голосов
/ 29 августа 2011

Используя генератор, вы даете носу maxAttempts тесты для запуска.если любой из них не удастся, комплект завершится неудачно.Попробовать / поймать не особенно относится к тестам, которые вы проводите, потому что это нос, который их проводит.Перепишите ваш тест так:

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
...