Пакет Python не найден в Pytest - PullRequest
1 голос
/ 30 ноября 2019

У меня есть следующая структура проекта:

foo
│
├── foo
│   ├── cli
│   │    ├── tests
│   │    └── __init__.py
│   ├── core
│   │    ├── tests
│   │    └── __init__.py
│   ├── tests
│   │    ├── __init__.py
│   │    └── test_foo.py
│   ├── __init__.py
│   └── foo.py
├── kube
├── requirements
├── ...any-other-non-source-related
└── README.md

Внутри файла foo/foo.py у меня есть следующий код заполнителя:

import cli
import core


def say_hi():
    print('hi')


if __name__ == '__main__':
    say_hi()

И в файле foo/tests/test_foo.py У меня естьследующее:

from foo import foo


def test_foo():
    foo.say_hi()

    assert False

Затем в оболочке я получаю следующее:

$ python foo/foo.py 
hi
$ pipenv run pytest
===================== test session starts =====================
platform linux -- Python 3.7.4, pytest-5.3.1, py-1.8.0, pluggy-0.13.1
rootdir: /xxx/xxx/xxx/xxx/python-project-folder-structures
collected 0 items / 1 error                                                                                                                                                                                         

===================== ERRORS =====================
_____ ERROR collecting foo/tests/test_foo.py _____
ImportError while importing test module '/xxx/xxx/xxx/xxx/python-project-folder-structures/foo/tests/test_foo.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
foo/tests/test_foo.py:1: in <module>
    from foo import foo
foo/foo.py:1: in <module>
    import cli
E   ModuleNotFoundError: No module named 'cli'
!!!!!!! Interrupted: 1 error during collection !!!!!!!
===================== 1 error in 0.05s =====================

Может кто-нибудь помочь? Почему Pytest не основывает мой импорт? Я пробовал несколько подходов, даже с папкой tests вне папки foo (на корневом уровне), но ошибка все еще сохраняется.

Единственный способ, который я нашел, чтобы исправить этопоместив файл conftest.py на уровень кода, чтобы он был обнаружен pytest. Я действительно не хочу этого делать, так как я хочу отделить свое тестирование от моего исходного кода.

1 Ответ

0 голосов
/ 01 декабря 2019

Если кто-то борется с этим, я смог найти решение. Я удалил файл __init__.py из директории foo, придав такую ​​структуру:

foo
│
├── foo
│   ├── cli
│   │    ├── tests
│   │    └── __init__.py
│   ├── core
│   │    ├── tests
│   │    └── __init__.py
│   ├── tests
│   │    ├── __init__.py
│   │    └── test_foo.py
│   └── foo.py
├── kube
├── requirements
├── ...any-other-non-source-related
└── README.md

Их, на mt test, я получил сейчас:

import foo


def test_foo():
    foo.say_hi()

    assert False

Я заметилчто поведение Pytest заключается в том, чтобы перейти от теста к корневому каталогу, идентифицируя пакеты. Поскольку foo был пакетом (с файлом __init__.py), он добавлялся как один в мой PATH:)

ВАЖНО Обратите внимание, что оператор import foo относится кфайл foo.py, а не каталог foo. Итак, если ваш файл называется boo.py в каталоге foo, импорт должен быть: import boo

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