#python-3.x #pytest
#python-3.x #пытест
Вопрос:
У меня есть куча тестов, которые используют в качестве входных данных случайно сгенерированные данные. Чтобы убедиться, что сбои повторяются, я организовал их следующим образом:
import random import pytest @pytest.fixture def seed(): return random.getrandbits(32) def test_foo(seed): # seed the random number generators, and generate random data # test foo def test_bar(seed): # seed the random number generators, and generate random data # test bar def test_baz(seed): # seed the random number generators, and generate random data # test baz
Таким образом, в случае сбоя pytest сообщает значение seed
, и я могу временно изменить seed()
прибор, чтобы вернуть это конкретное значение, исправить ошибки, а затем вернуть его обратно. (Вероятно, есть более элегантные способы сделать это.)
Одна из проблем с приведенной выше структурой заключается в том, что в каждом тесте повторяется много кода для генерации случайных данных.
Поэтому я решил провести рефакторинг тестового модуля следующим образом:
import random import pytest @pytest.fixture def seed(): return random.getrandbits(32) @pytest.fixture def stimulus(seed): # seed the random number generators and generate random data return data def test_foo(stimulus): # test foo def test_bar(stimulus): # test bar def test_baz(stimulus): # test baz
Теперь тесты по-прежнему повторяемы, в том смысле, что если seed()
fixture возвращает (или переписывается для возврата) то же значение, мы получаем те же результаты теста. Однако в случае сбоя pytest выводит значение stimulus
, которое обычно слишком длинное, чтобы поместиться на экране. (Плюс было бы намного сложнее изменить stimulus()
, чтобы вернуть точно такие же данные.)
Есть ли способ сообщить pytest, что «в случае сбоев распечатайте значение последнего прибора, т. е., seed
а не первого прибора stimulus
«?
Ответ №1:
Одна вещь, которую вы можете сделать (если вы также в порядке, чтобы увидеть вывод stimulus
), заключается в том, что позвольте stimulus
прибору вернуться (seed, data)
(и соответствующим образом отрегулируйте свои тестовые функции) и в команде pytest включите переключатель --showlocals
. Таким образом, вы увидите значение приспособления, просто теперь оно seed
также показывает значение..