#python #pytest
#python #pytest
Вопрос:
Мой tests
каталог выглядит так:
tests/
conftest.py
some_of_tests/
conftest.py
test_parts.py
test_these_parts.py
some_other_tests/
conftest.py
test_these_other_parts.py
У меня есть приспособление, /tests/confest.py
которое создает некоторый тестовый файл, создает экземпляр подключения к базе данных, а затем выполняет некоторую очистку базы данных:
@pytest.fixture(scope='session', autouse=True)
def setup_db():
try:
generate_test_files()
db = connect_to_db()
yield db
finally:
# cleanup
print("Cleaning up session scoped fixture")
Внутри tests/some_tests/conftest.py
у меня есть другое приспособление, которое создает некоторые файлы, создает таблицу базы данных, а затем удаляет эти файлы:
@pytest.fixture(scope='package')
def local_setup():
try:
generate_test_files()
# do stuff with db
yield db
finally:
delete_test_files()
print("Cleaning up package scoped fixture")
Мои тесты настроены таким образом, что я бы хотел, чтобы тестовые файлы, созданные с помощью some_of_tests
, были очищены перед запуском тестов some_other_tests
. Я ожидал, что приспособления some_of_tests
будут продолжаться и вызываться delete_test_files()
перед запуском тестов в some_other_tests
, но когда я запускаю pytest --capture=no tests
, я вижу:
Cleaning up session scoped fixture
Cleaning up package scoped fixture
после того, как все тесты выполнены, и они не в том порядке, который я ожидал. Что я неправильно понимаю и каков наилучший способ очистки тестов с областью действия пакета перед запуском следующего пакета тестов?
Кроме того, я понимаю, что pytest
это выполняется в алфавитном порядке. Я использую это для запуска тестов в том порядке, в котором я хочу. Итак, pytest будет запускать их следующим образом some_of_tests/test_parts.py -> some_of_tests/test_these_parts.py -> some_other_tests/test_these_other_parts.py
Комментарии:
1. Не удается воспроизвести проблему, используя приведенный вами пример; приспособление с областью действия пакета завершается до того, как оно будет выполнено в сеансовой области.
Ответ №1:
Я столкнулся с той же проблемой. Но я пришел к выводу, что вам нужно __init__.py
добавить в свои тесты, чтобы их можно было распознать как пакеты. В противном случае в конце он выполнит демонтаж для теста и будет действовать как сеанс.
Например:
system_test/
- conftest.py
- test_dir1/
- __init__.py
- conftest.py (here put scope as package)
- test1.py
- test2.py
- test_dir2/
- __init__.py
- test1.py
- test2.py
- conftest.py (here put scope as package)
Это работает так, как ожидалось.