Когда продолжаются генераторы приспособлений pytest и влияет ли на это область действия?

#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)
  

Это работает так, как ожидалось.