Конфликт с загрузкой фиктивных данных для модульного тестирования между PyCharm и модульными тестами - PullRequest
0 голосов
/ 29 мая 2020

У меня структура проекта Python выглядит следующим образом:

.
├── data
├── src
│   ├── module1
│   └── module2
└── tests
    ├── base
    ├── module1
    └── module2

В каталог data я помещаю фиктивные данные для использования в модульном тесте (например, файлы CSV). Если я нахожусь внутри PyCharm, внутри модульного теста, я могу использовать относительный путь, как показано ниже, и использовать среду IDE для успешного выполнения модульного теста (используя unittests).

pd.read_csv('../../data/mock.csv')

Однако за пределами PyCharm , Я могу попробовать выполнить следующую команду для запуска модульного теста.

python -m unittest tests/module1/*.py

Я получаю сообщение об ошибке, в котором говорится, что файл не существует. Если я изменю путь следующим образом, то запуск модульного теста из-за пределов PyCharm будет работать, но запуск теста в PyCharm завершится неудачно.

pd.read_csv('./data/mock.csv')

Когда я проверяю конфигурацию модульного теста, я замечаю, что working directory установлено /Users/myusername/myproject/tests/module1. Если я изменю рабочий каталог на /Users/myusername/myproject, я получаю следующую ошибку: AssertionError: Path must be within the project.

Я даже пытался переместить каталог data в tests > module1, но конфликт остался; теперь pd.read_csv('./data/mock.csv') работает для PyCharm, но не работает для терминала.

Есть идеи, как разрешить этот конфликт?

1 Ответ

0 голосов
/ 29 мая 2020

Я решил эту проблему, абстрагируясь от получения пути к фиктивным данным.

def normalize_path(resource, proj_root='root_folder'):
    path = os.getcwd() # current working directory
    tokens = path.split('/') # tokens of directory path
    index = tokens.index(proj_root) # look for where project root ends
    tokens = tokens[1:index + 1] # reconstruct the path up to the project root
    p = '/'.join(tokens)
    p = f'/{p}/{resource}' # append the resource to the project root

    return p

В моем коде теперь я делаю что-то вроде следующего.

pd.read_csv(normalize_path('data/mock.csv'))

Я могу выполнить тесты из терминала или PyCharm без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...