pytest: тест на импорт подпакета - PullRequest
1 голос
/ 06 февраля 2020

Я хочу сделать следующее. В моем проекте a у меня есть фабричный класс Fac с экземпляром fac=Fac(), в котором регистрируются определенные классы. Эти классы находятся в подпакете a.b.

Если я делаю простой import a, подпакет a.b не импортируется, классы не регистрируются, и, таким образом, fac.registered_classes является пустым списком.

После импорта подпакета b fac.registered_classes заполняется классами в подпакете b.

Чтобы не запутать пользователя, я добавил строку

import .b в __init__.py пакета a.

Теперь я хотел бы написать тест с pytest, который в основном проходит, если fac.registered_classes не пусто; поэтому никто случайно не стирает эту строку в моем __init__.py. Давайте назовем этот тест test_import_b

Разные тесты, конечно, также проверяют функциональность подпакета b, тем самым импортируя b сами.

Однако, кажется, что все операции импорта выполняются во время тестовых прогонов. доступны для всех тестов. Хотя простой запуск test_import_b завершается неудачей, если строка импорта удаляется в __init__.py, он больше не работает, если все тесты выполняются одновременно.

Что я должен сделать, чтобы выполнить настройку теста работа

1 Ответ

1 голос
/ 07 февраля 2020

Это правильное поведение py.test и Python. Код уровня тела модуля запускается, когда в модуль импортируется. Python Виртуальная машина поддерживает импортированные модули для каждого процесса.

Я не верю, что есть хорошее решение для достижения желаемого поведения. Мне приходят на ум две стратегии

  • Никогда не регистрируйте ничего неявным образом только при импорте модуля - сделайте регистрацию всего явным через вызов функции, например, получив init()

  • В тестах, которые явно необходимо импортировать и запустить регистр, импортируйте его в начале теста или создайте прибор, который выполняет импорт

Например

def test_boohoo():
     import a.b
     # Test goes here
...