Pytest добавляет новый файл в src и заставляет тесты видеть его

#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. Так что в конце концов все получилось, но вы все еще не знаете, что пошло не так? В любом случае, рад, что вы смогли заставить его работать — я понятия не имел, что здесь пошло не так…