#python #testing #configuration #pytest
Вопрос:
Новичок в том, что касается питеста.
Я настроил свою структуру: my_projsrc с файлами приложений в разделе src и my_projтесты с файлами тестов там. Следуя этой книге, я затем добавил такие файлы, как my_projsetup.py, который в настоящее время выглядит так:
from setuptools import setup, find_packages
setup(
name='my_proj',
version='0.1.0',
license='proprietary',
...
packages=find_packages(where='src'),
package_dir={'': 'src'},
install_requires=[],
extras_require={},
entry_points={
'console_scripts': [
'py_lib = py_lib.cli:py_lib_cli',
]
},
)
Затем, согласно книге, я побежал
> pip install -e .
… и с помощью какой-то магии, недоступной моему пониманию, это затем настроило все так, чтобы в части my_projтесты тестовые файлы могли импортировать файлы .py из-под my_projsrc.
Затем я хотел добавить новый файл .py в файлы src, т. Е. файлы приложений, файлы в разделе my_projsrc. Но тесты совершенно не могут этого увидеть: «Нет модуля с именем «xxx»».
Я попробовал pip install -e .
еще раз. Я тоже пытался pip develop .
, и я попробовал --no-cache-dir flag
. Я даже пытался бежать setup.py напрямую, что, по-видимому, не рекомендуется.
Затем я обнаружил, что в разделе my_projsrc есть сгенерированный каталог my_proj.egg-info. Один из файлов под этим SOURCES.txt, в котором, как представляется, перечислены все файлы в проекте. Мой новый файл .py в разделе src действительно указан там. И все же тестовая платформа, по-видимому, не может этого видеть.
Наконец я попытался удалить эту штуку:
pip uninstall my_proj
...
Proceed (y/n)? y
...
и переустановка
pip install -e .
Тесты все еще не могут увидеть (т. е. импортировать) новый файл. Гррр.
Can anyone explain this and tell me how to resolve the problem?
Edit
In answer to the comment: I added a new file, under srcutils: new_file.py, like this:
# -*- coding: utf-8 -*-
conc_fh = False
line_of_stars=50*'*' 'n'
The test file is my_projtestsunittest_misc_utils.py. I am usually running pytest from my_projtestsunit, although I have also tried the parent and grandparent directories. In that file this is the import line:
import utils.new_file
Same fail (for the new file). Then I tried all those possible remedies again.
I also tried deleting things like the my_proj.egg-info directory, and the my_projtests.pytest_cache and my_projtests__pycache__ directories.
Я могу только заключить (предварительно), что что-то в пакетах сайтов в виртуальной среде не может быть правильно обновлено.
Я даже попытался pip uninstall pytest
переустановить, а затем pip install -e .
снова. Даже тогда: НЕТ!
Может ли кто-нибудь подтвердить, что добавление файла работает для них без проблем (в идеале на ОС W10)?
NB это выход с ошибкой:
______________________________________ ERROR collecting unit/test_misc_utils.py _______________________________________
ImportError while importing test module 'D:My documentssoftware projectsEclipseWorkspacemy_projtestsunittest_misc_utils.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
c:usersmikeappdatalocalprogramspythonpython39libimportlib__init__.py:127: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
testsunittest_misc_utils.py:3: in <module>
import utils.new_file
E ModuleNotFoundError: No module named 'utils.new_file'
Позже
Я полностью создал новый проект, скопировав старый, но создав совершенно новую виртуальную среду.
Затем я снова установил pytest и снова запустил pip install -e .
, а затем pytest tests/unit
из каталога проекта.
К моему крайнему изумлению, еще раз, эти два новых файла, недавно созданные (и скопированные в процессе создания нового проекта), и только они, не были распознаны и не могли быть импортированы.
Теперь я совершенно сбит с толку. Похоже, что в природе этих файлов есть что-то «дефектное». Я пробовал просматривать строки в них на предмет таких вещей, как ложные символы Юникода. Пока ничего…
Комментарии:
1. Вы все делаете правильно (по книге :), насколько я могу видеть — я думаю, что проблема, вероятно, связана с вашим добавленным модулем. Можете ли вы показать файловую структуру вашего проекта и то, что вы добавили? От какого сообщения об ошибке вы получаете
pytest
?2. У вас есть
__init__.py
файл вutils
пакете, если нет, создайте его и посмотрите, работает ли он?3. @FelixKJose спасибо, у меня действительно есть
__init__.py
там.4. Чтобы было ясно: новые файлы правильно импортированы и используются в производственном коде, но не в тесте, правильно ли это?
5. Не могли бы вы попробовать
pip install .
? Затем вы сможете успешно импортировать модуль и функции в свой тест.
Ответ №1:
Думаю, я наконец-то разобрался в этом.
Вопрос в следующем: что доступно (для импорта) для модулей и файлов в разделе «my_proj/тесты». Я считаю, что это определяется setup.py (как описано в упомянутой книге). Самая голая версия этого -:
from setuptools import setup
setup(
name='my_proj2',
py_modules=['my_proj2']
)
Когда вы затем запустите pip install -e .
(примечание точка), это означает, что модули в разделе my_proj2/src становятся доступными для импорта. Но, возможно, не все. Загружаемые файлы (опять же для книги) включают модуль [root]/src/задачи … и под этим находится an __init__.py
, который явно импортирует различные переменные и классы из этого модуля для повторного экспорта в тестовые классы.
Этот подход (включая все, что вы хотите импортировать в тесты в __init__.py
модуле приложения) не является единственным способом доступа к материалам в модулях в разделе [root]/src при выполнении тестов. Любой допустимый путь в разделе [root]/src, по-видимому, работает. Я понятия не имею, почему это не удалось в моих предыдущих попытках. Может быть, предыдущая setup.py файл (измененный из загруженной версии) содержал что-то сложное, что мешало работе.
Комментарии:
1. Так что в конце концов все получилось, но вы все еще не знаете, что пошло не так? В любом случае, рад, что вы смогли заставить его работать — я понятия не имел, что здесь пошло не так…