И pytest
, и unittest
предлагают возможности, о которых вы спрашиваете, и обе функции объясняются в соответствующей документации с примерами: ищите fixture
в документации pytest
и setup
вunittest
документация.
Однако использование этих функций на практике быстро выходит из-под контроля и имеет тенденцию создавать нечитаемый тестовый код.Он принимает две формы, одна из которых заключается в том, что настройка общего устройства становится слишком большой (слишком общей), что затрудняет читателю понимание того, что на самом деле актуально для конкретного тестового примера.Во-вторых, тестовый код больше не является самодостаточным, и кажется, что магия происходит снаружи.Meszaros называет результирующий запах теста «Obscure Test» с вышеупомянутыми сценариями, называемыми «General Fixture» и «Mystery Guest».
Моя рекомендация состоит в том, чтобы предпочесть вспомогательные функции / методы, которые вы вызываете явным образом из каждого теста.Вы можете иметь несколько из них, дать им описательные имена и, таким образом, сохранить свой тестовый код читабельным, не требуя от читателя предварительного поиска в файле, чтобы найти какие-либо «автоматические» вещи.В вашем примере тесты могут выглядеть следующим образом:
def test_1(self, mock1, mock2, mockn):
default_setup(mock1, mock2, mockn)
# further test code...
def test_2(self, mock1, mock2, mockn):
default_setup(mock1, mock2, mockn)
setup_mock2_to_behave_as_xxx(mock2)
# further test code...
def test_3(self, mock1, mock2, mockn):
setup_mock1_to_always_xxx(mock1)
setup_mock2_to_behave_as_xxx(mock2)
setup_mockn_to_xxx(mockn)
# further test code...