Приспособление Pytest: установка, демонтаж и запуск кода между каждым тестом

Я пытаюсь использовать pytest для тестирования модуля, который я пишу. Модуль представляет собой оболочку процесса с ДОЛГИМ временем запуска. Поэтому я хочу убедиться, что у меня есть правильная логика установки/разборки, чтобы убедиться, что инициализация не происходит более одного раза.

Мой текущий код выглядит так:

import pytest
import leelaZeroWrapper

@pytest.fixture(scope='module')
def leela(request):
    leela = leelaZeroWrapper.LeelaWrapper()
    def quit():
        leela.quit()
    request.addfinalizer(quit)
    return leela

def test_single_play(leela):
    leela.reset()
    result = leela.play('b', 'a11')
    assert result == [{'color': 'black', 'loc': 'a11'}]

def test_single_play_uppercase(leela):
    leela.reset()
    result = leela.play('WHITE', 'A11')
    assert result == [{'color': 'white', 'loc': 'a11'}]

def test_reset(leela):
    leela.reset()
    leela.play('b', 'a11')
    leela.play('w', 'a13')
    leela.reset()
    assert leela.current_board == []
    assert leela.current_move == 0

Я заметил, что ВСЕ мои тесты начнутся с вызова сброса моего модуля! Есть ли способ добавить это в прибор, или как бы вы это решили?

Псевдокод того, что я хочу:

@pytest.fixture(scope='module')
def leela(request):
    leela = leelaZeroWrapper.LeelaWrapper()
    def quit():
        leela.quit()
    def reset():
        leela.reset()
    request.addfinalizer(quit)
    request.add_between_test_resetter(reset)
    return leela

Если бы первоначальная настройка не была такой тяжелой, я бы просто пропустил это и позволил классу инициализировать каждый тест. Я попытался просмотреть документацию по объекту запроса, но не нашел подходящего метода. Я предполагаю, что это должно быть решено каким-то другим способом. Есть идеи?


person hirolau    schedule 11.08.2018    source источник


Ответы (1)


Просто введите другой прибор, который выполняет сброс. Сделайте его приспособлением для автоматического использования, чтобы оно выполнялось автоматически перед каждым тестом:

@pytest.fixture(scope='module')
def leela():
    leela = leelaZeroWrapper.LeelaWrapper()
    yield leela
    leela.quit()

@pytest.fixture(autouse=True)
def reset(leela):
    leela.reset()


def test_single_play(leela):
    result = leela.play('b', 'a11')
    assert result == [{'color': 'black', 'loc': 'a11'}]

Областью фиксации по умолчанию является function, поэтому фикстура reset будет перезапускаться перед каждым тестом в модуле.

person hoefling    schedule 11.08.2018