Контрольные приборы pytests сообщают о сбоях в случае сбоев

#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 также показывает значение..