Я создаю тестовый модуль pytest для функции в моем программном обеспечении.
Прежде чем даже начать тестирование, pyunit, похоже, не может импортировать мой декоратор "cache_offline", который косвенно импортируется при импортеЯ тестирую функцию в своем тесте.
Я использую Anaconda для встраивания Python 3.7 и pytest 5.2.2
Я пытался закомментировать код, в котором декоратор применяется к моим функциям,когда я делаю так, ошибка pytest исчезает, и тесты выполняются правильно.
Мой тест находится в ./tests/scripts/test_scripts_helper.py
, и я запускаю pytest в корне проекта .
Pytest правильно находит мой тест (см. сообщение об ошибке),так что здесь проблема не в этом.
Мой тест импортирует и хочет проверить функцию read_tiff_tag
из пакета vorace.scripts_helper
, который импортирует функцию safe_mkdir
из пакета vorace.core.misc
, который импортируетпакет vorace.core.vorace
, в котором 3 функции украшены декоратором cache_offline
из package vorace.core.misc
Я пытался запустить оба теста, используя py.test
или python -m pytest
в корне mу проекта.
Мой проект имеет следующую структуру (упрощенно). Корень кода - ./vorace
Корень теста - ./tests
.
├── conftest.py
├── tests
│ ├── __init__.py
│ ├── scripts
│ │ ├── __init__.py
│ │ └── test_scripts_helper.py
│ └── tests_data
│ └── test_ROI.tif
└── vorace
├── __init__.py
├── core
│ ├── __init__.py
│ ├── misc.py
│ └── vorace.py
└── scripts
├── __init__.py
├── batch_analyzis.py
└── scripts_helper.py
Я пытался:
- с пустым
__init__.py
и без него в каждой подпапке tests
папки. -> без изменений - с пустым
conftest.py
в корне проекта и без него. -> без изменений - выполнение теста, который не требует импорта в моем файле
test_scripts_helper.py
(мой тест вызывает комментирование проблемы) -> тест выполняется правильно
Я подозреваю, что это проблема кругового импорта, но мне всегда говорили, что это не может произойти в python. Может быть, декораторы являются исключением из этого правила?
Мой vorace.core.misc
код с декоратором
from vorace.core import vorace
[...]
def cache_offline(cache_path=os.getcwd()):
[...]
def decorator(func):
[...]
def wrapper(*args, **kwargs):
[...]
return result
return wrapper
return decorator
def safe_mkdir(path):
[...]
Одна из декорированных функций в vorace.core.vorace
from vorace.core.misc import *
[...]
@cache_offline(cache_path=".cache")
def classify_clusters_by_connectivity(xyz_data):
[...]
[...]
Результат выполнения py.test
в корне проекта
==================== test session starts ====================
platform linux -- Python 3.7.3, pytest-5.2.2, py-1.8.0, pluggy-0.12.0
rootdir: /home/flo/PycharmProjects/VorAce
plugins: arraydiff-0.3, openfiles-0.3.2, doctestplus-0.3.0, remotedata-0.3.1
collected 0 items / 1 errors
==================== ERRORS ====================
_________ ERROR collecting tests/scripts/test_scripts_helper.py _________
tests/scripts/test_scripts_helper.py:1: in <module>
import vorace.scripts.scripts_helper as sh
vorace/scripts/scripts_helper.py:6: in <module>
from vorace.core.misc import safe_mkdir
vorace/core/misc.py:8: in <module>
from vorace.core import vorace
vorace/core/vorace.py:91: in <module>
@cache_offline(cache_path=".cache")
E NameError: name 'cache_offline' is not defined
Если я выполню простой 0 == 0
тест в моем файле tests/scripts/test_scripts_helper.py
без импорта из моего проекта, тест будет успешно выполнен.