Py.test фикстуры с глобальной областью видимости

Я ищу способ использовать что-то вроде «глобальных приборов» в py.test. Кажется, что scope="session" был бы ближе всего к тому, что мне нужно, но похоже, что он работает аналогично варианту уровня scope="module". Устройство инициируется всего n раз, где n - количество модулей.

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

@pytest.fixture(scope='session', autouse=True)
def morfanalyzer():
    from myapp.nlp.morfservice import MorfAnalyzerService
    morfservice = MorfAnalyzerService()

    def f():
        morfservice.run(debug=True)

    thread = Thread(target=f)
    thread.start()

    yield morfservice

    morfservice.stop()
    thread.join()

И я использую это как

@pytest.mark.usefixtures(morfanalyzer.__name__)
def test_this_stage(morfanalyzer):
    assert False

Я бы хотел, чтобы ровно одна копия службы запускалась перед запуском всех тестов и отключалась после того, как все было запущено.

Невозможно воспроизвести (вместо вашего сервиса используется фиктивный HTTPServer). Можете ли вы предоставить минимальный воспроизводимый пример? Кстати, вы явно запрашиваете значение прибора в тесте (через аргумент теста), поэтому установка autouse на True и маркировка теста с помощью usefixtures не требуется.

hoefling 10.09.2018 11:23
0
1
321
1

Ответы 1

Указав scope="session" в вашем устройстве, вы получите экземпляр с ограниченным сеансом. Вы можете проверить настройку и разборку приборов с помощью флага cli setup-show, как это отражено в 3.0 Журнал изменений

Также, как указал @hoefling в комментариях, после установки autouse=True маркировка теста с помощью usefixtures больше не нужна.

Другие вопросы по теме