Я сейчас перевожу проект python с python 2.7 на python 3. Общая структура проекта выглядит следующим образом (не очень pythoni c, но, поскольку я в основном из Java Мир это имеет большой смысл - для меня ...):
project-root
└ src
├ main
│ └ python
│ ├ my_module.py
│ └ lib
│ └ my_lib
│ ├ __init__.py
│ └ util_xyz.py
└ test
└ python
└ test_my_module.py
Фактический код python находится под src/main/python
и под src/test/python
есть юнит-тесты.
Для выполнения тестов мы используем nose2 (версия 0.9.1) с файлом конфигурации, который выглядит следующим образом:
[unittest]
start-dir = /path/to/project-root/src/test/python
code-directories = /path/to/project-root/src/main/python
При python3 .6 выполнение тестов с nose2 завершается с ошибкой импорта:
======================================================================
ERROR: python.test_my_module (nose2.loader.ModuleImportFailure)
----------------------------------------------------------------------
ImportError: Failed to import test module: python.test_my_module
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/nose2/plugins/loader/discovery.py", line 201, in _find_tests_in_file
module = util.module_from_name(module_name)
File "/usr/local/lib/python3.6/dist-packages/nose2/util.py", line 77, in module_from_name
__import__(name)
File "/path/to/project-root/src/test/python/test_my_module.py", line 3, in <module>
import my_module as my_module
File "/path/to/project-root/src/main/python/my_module.py", line 18, in <module>
import lib.my_lib as my_lib
File "/path/to/project-root/src/main/python/lib/my_lib/__init__.py", line 1, in <module>
import lib.my_lib.util_xyz as util_xyz
AttributeError: module 'lib' has no attribute 'my_lib'
Очевидно, что имя тестового модуля неверно, так как оно должно быть просто test_my_module
, а не python.test_my_module
. Если я добавлю print(sys.path)
в качестве самой первой строки test_my_module.py
, я получу
['/path/to/project-root/src/test', '/path/to/project-root/src/main/python',
'/path/to/project-root/src/test/python', '', '/usr/lib/python36.zip',
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages',
'/usr/lib/python3/dist-packages']
И print(os.getcwd())
приведет к таким выводам:
/path/to/project-root
Мне интересно, где Самая первая запись в sys.path /path/to/project-root/src/test
приходит с того момента, как я указываю nose2 на /path/to/project-root/src/test/python
и указывает, действительно ли это вызывает проблему. И что я мог сделать, чтобы тесты работали правильно с python3 .6.
Я попробовал ту же самую настройку с python3 .7, и тесты выполняются без проблем. Хотя вывод sys.path и os.getcwd () одинаков.