У меня есть проект, в котором каждое приложение имеет модуль tests
, как показано ниже:
app1/
tests/
__init__.py
# whatever test files are
app2/
tests/
__init__.py
# whatever test files are
А также, как вы можете догадаться, иметь пакет проекта в корне проекта. У него есть подпакет testing
, который содержит базовые тестовые примеры для моделей и полей и, конечно же, фикстуры, как показано ниже:
myproject/
__init__.py
# settings and related files, you know
testing/
__init__.py
fixtures.py # for fixtures
# other modules for base test classes and stuff
Итак, общая структура моего проекта:
myproject/ # contains standard django stuff and a testing subpackage
app1/ # contains app and tests
app2/ # so as above
# so on and so forth
А содержимое pytest.ini
в корне проекта выглядит следующим образом:
[pytest]
DJANGO_SETTINGS_MODULE = myproject.settings.development
python_files =
test_*.py
myproject/testing/fixtures.py
addopts = -s
console_output_style = count
log_cli_level = DEBUG
log_print = True
Итак, предположим, что myproject/testing/fixtures.py
содержит фикстуру, как показано ниже:
# assuming i've imported related stuff
@pytest.fixture # might have different scope
def foo():
"""does foo"""
return "foo"
А позже я делаю pytest --fixtures
, чтобы убедиться, что pytest правильно обнаруживает мое приспособление, а это значит, что проблем быть не должно.
Однако, когда я запускаю тесты в проекте, я получаю следующую ошибку:
E fixture 'foo' not found
Это странно, так как я ясно вижу это в pytest --fixtures
. Я понятия не имею, почему это происходит или что вызывает это.
pytest-django
3.4.8Спасибо, кажется, это помогло. Пожалуйста, предоставьте его в качестве ответа, чтобы я мог принять его как действительный, и сотрудники Google также имеют представление об этом.
Если у вас есть фикстуры, которые должны храниться в отдельном модуле и быть доступными для всего набора тестов, лучше всего зарегистрировать модуль как плагин, чтобы обеспечить его загрузку до фазы сбора тестов. Создайте файл с именем conftest.py
в корневом каталоге проекта с содержимым
pytest_plugins = ['myproject.testing.fixtures']
Конечно, вы можете просто использовать conftest.py
вместо fixtures.py
и поместить туда светильники.
Добавьте
conftest.py
в корневой каталог со строкойpytest_plugins = ['myproject.testing.fixtures']
. Параметрpytest_files
предназначен для обнаружения тестов, поэтому, хотя он также обнаруживает фикстуры, нет гарантии, что фикстура будет импортирована достаточно рано, чтобы соответствовать аргументу теста.