Pytest без аргументов имеет неправильный рабочий каталог - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь использовать pytest для автоматизации моего процесса тестирования.У меня есть несколько файлов тестовых случаев (test_methodA.py, test_methodB.py и т. Д.) В папке с именем test, которая сама находится в каталоге верхнего уровня моего проекта.Все эти тесты выполняются в программе, содержащейся в одном файле - program.py.Этот program.py файл также находится в каталоге верхнего уровня, так же как и папка с файлами конфигурации confs, которая необходима для правильной работы.

Когда я запускаю pytest из каталога верхнего уровня сАргумент одного из моих тестовых файлов:

$ pytest test/test_methodA.py

Программа работает правильно и проходит тесты.Однако, если я просто запускаю pytest без аргументов:

$ pytest

все мои тесты не пройдены, потому что методы инициализации моей программы выдают FileNotFoundError при попытке доступа к файлам конфигурации.

Я имеюпоэкспериментировал с этим поведением и определил, что прямой причиной является pytest, использующий неправильный рабочий каталог (каталог на один уровень выше каталога верхнего уровня проекта).Например, если я сделаю

$ cd test
$ pytest

, все тесты будут работать правильно.Я также подтвердил это, напечатав один из тестов os.getcwd() на консоли.

Ни один из каталогов, участвующих в проекте, не содержит файл __init__.py, на котором сосредоточено большинство результатов поиска, которые я нашел для этой проблемы.Какие еще причины были бы для этой проблемы?

1 Ответ

0 голосов
/ 11 июня 2018

Ваша проблема заключается в использовании относительных путей при открытии файлов:

open('file/path.yml', 'r')

разрешит путь к каталогу, из которого вы выполняете код.Это означает, что при запуске program.py из другого каталога будет получено FileNotFoundError, поскольку скрипт будет искать файлы конфигурации в неправильном каталоге.Вы можете легко это проверить, изменив dir и попытавшись запустить скрипт:

$ cd /tmp
$ python /path/to/program.py
Traceback (most recent call last):
  File "/path/to/program.py", line 1, in <module>
    with open('file/path.yaml') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'path/file.yaml'

Это можно исправить, построив пути относительно скрипта program.py (__file__ - это имя питонавыполняемый файл):

import os

parent_dir = os.path.dirname(__file__)
file = os.path.join(parent_dir, 'file', 'path.yaml')
with open(file, 'r') as fp:
    ...

Если вы используете Python 3.4 или новее, разрешение пути будет более элегантным при использовании pathlib:

# program.py
import pathlib

parent_dir = pathlib.Path(__file__).parent
file = parent_dir / 'file' / 'path.yaml'

with file.open('r') as fp:
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...