Измените рабочий каталог pytest на каталог тестового случая - PullRequest
0 голосов
/ 27 мая 2020

У меня следующая структура каталогов pytest:

system_tests/
  ├── conftest
  ├── pytest.ini
  │
  ├── suite_1/
  │   └── test_A.py
  │   
  └── suite_2/
      ├── sub_suite_2a/
      │   └── test_B.py
      └── sub_suite_2b/
          └── test_C.py

Когда запускается каждый тестовый метод, ряд библиотек / процессов в текущем рабочем каталоге генерирует ряд артефактов, которые необходимо сохранить. Когда я cd в папку sub_suite и запускаю pytest, файлы создаются в папке sub_suite, где я хочу, чтобы они были. Однако, когда я запускаю pytest из папки system_test для запуска всех тестов, все артефакты создаются в папке system_test, что мне не нужно.

Есть ли простой способ заставить pytest всегда использовать папку тестового класса в качестве рабочего каталога, чтобы я получал одинаковые результаты независимо от того, КАК или ГДЕ я запускаю тест?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Последнее решение, которое я принял, было комбинацией вещей (спасибо участникам):

  1. Не используйте пути относительно рабочего каталога, сначала разрешите их с помощью pathlib.
  2. Используйте приспособление или метод package_artifacts() для консолидации и перемещения любых файлов, которые необходимо сохранить в конце каждого тестового примера.

Ключом к решению проблемы было добавление следующей строки в фикстура уровня функции:

@pytest.fixture(scope="function")
def initialize(request):
    os.chdir(request.fspath.dirname)
  • request - встроенная фикстура pytest
  • fspath - LocalPath исполняемого тестового модуля
  • dirname - это каталог тестового модуля

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

Также заслуживает внимания:

  • request.config.rootdir - pytest root, не меняется в зависимости от того, где вы запускаете pytest
  • request.config.invocationdir - папка, из которой запускался pytest
1 голос
/ 28 мая 2020

Для этого вам доступно множество вариантов. Вот несколько.

1. Напишите приспособление pytest, чтобы проверить, совпадает ли текущий рабочий каталог с желаемым рабочим каталогом, и если нет, переместите все файлы артефактов в желаемый каталог. Если все артефакты, которые вы генерируете, относятся к одному типу файлов (например, * .jpg, * .png, * .gif) и вы просто хотите, чтобы они находились в другом каталоге, этого может быть достаточно. Что-то вроде этого может сработать

from pathlib import Path
import shutil

@pytest.fixture
def cleanup_artifacts():
    yield None
    cwd = Path.cwd()
    desired_dir = Path.home() / 'system-tests' / 'suite-2' / 'sub_suite_2a'
    if cwd != desired_dir:
        for f in cwd.glob('*.jpg'):
            shutil.move(f, desired_dir)

И затем вы можете добавить этот прибор в свои тесты по мере необходимости.

2. Вы можете настроить pytest rootdir как желаемый каталог, поскольку pytest использует rootdir для хранения информации о проекте / testrun c.

Когда вы запускаете pytest, запускайте его как

pytest --rootdir=desired_path

См. Здесь для получения дополнительной информации: https://docs.pytest.org/en/latest/customize.html#initialization -determining-rootdir-and-inifile

Если оба не работают для вас, расскажите подробнее о ваших требованиях . Конечно, это можно сделать с помощью pytest.

...