Обнаружение теста Nose2 начинается с неверного родительского каталога (python 3.6) - PullRequest
0 голосов
/ 26 февраля 2020

Я сейчас перевожу проект 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 () одинаков.

...