Как заставить Pytest идентифицировать номер итерации при циклическом тестировании функции - PullRequest
0 голосов
/ 28 сентября 2019

Я использую pytest для этого теста, который я делаю.

Я хочу сделать один и тот же тест несколько раз, при этом изменяя начальное значение.Это рандомизирует тестовые переменные, которые я считал хорошей идеей.Таким образом, если тест не пройден, я могу легко воссоздать тот же тест в другой среде, чтобы увидеть, что не удалось, используя тот же начальный ввод:

def test_foo():
    for i in range(0, 10):
        foo = random_foo('something', seed = i)

        assert subject_value(foo) == expected_value(foo)

Однако, если тест не пройден, Pytest не сможетскажите мне значение i, когда произошла ошибка AssertionError, что делает отладку практически невозможной.Есть ли способ успешно сделать это?Или это плохое структурирование тестового кода, которое в этом случае может быть лучше?

1 Ответ

1 голос
/ 28 сентября 2019

Эта структура тестового кода называется подтестом .В вашем случае каждая итерация цикла должна быть новым подтестом.

Вы, вероятно, ищете плагин подтестов .

import subtests

def test_foo():
    for i in range(10):
        with subtests.test(msg="seed", i=i):  # Add what you need to see here.
            foo = random_foo('something', seed=i)

            assert subject_value(foo) == expected_value(foo)

Обратите внимание, что стандартная библиотека unittest.TestCase class уже имеет поддержку для подтестов, использующих with self.subTest() (начиная с Python 3.4).Pytest также может запускать эти стандартные тестовые случаи.


Кроме того, если вам интересны, в частности, рандомизированные тестовые входы, вас может заинтересовать Гипотеза .

...