Python unittest обнаруживает во время выполнения - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь запустить свои модульные тесты для модуля python из отдельного тестового скрипта. Вот моя файловая структура

- root
  |- modules
     |- a_module.py
  |- test
     |- test_a_module.py
  |- main.py

main.py выглядит так:

import unittest

loader = unittest.TestLoader()
suite = loader.discover(start_dir='./test', pattern='test_*.py')

runner = unittest.TextTestRunner()
runner.run(suite)

А вот a_module.py и test_a_module.py:

# a_module.py
def something():
    return True

# test_a_module.py
import unittest

from ..modules.a_module import something

class TestSomething(unittest.TestCase):
    def test_something(self):
        self.assertTrue(something)

При запуске python3 main.py я получаю следующую ошибку.

======================================================================
ERROR: test_a_module (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_a_module
Traceback (most recent call last):
  File "/usr/lib/python3.7/unittest/loader.py", line 436, in _find_test_path
    module = self._get_module_from_name(name)
  File "/usr/lib/python3.7/unittest/loader.py", line 377, in _get_module_from_name
    __import__(name)
  File "/home/schu_max/root/test/test_a_module.py", line 3, in <module>
    from ..modules.a_module import something
ImportError: attempted relative import with no known parent package


----------------------------------------------------------------------

Я относительно новичок в python и не знаю, как решить эту проблему. И другие вопросы / ответы на SO тоже не были такими полезными. Так как мне заставить это работать?

1 Ответ

0 голосов
/ 24 мая 2019

Есть несколько способов запустить ваши тесты.Теперь, когда они являются пакетами импорта, попробуйте

python -m unittest -v в корневой папке пакета, удалив две точки из относительного пути импорта в test/test_a_module.py.Также будет работать с python main.py из той же папки.Если вы введете python -m unittest -v за пределами root и перед префиксом относительного пути будет root, это тоже будет работать.Возможно, есть и другие способы.

Просто знайте, что относительные пути импорта в файлах тестов зависят от папки, из которой вы запускаете тестовый сценарий.

Чтобы оставаться последовательными, всегда выполняйте тестыи поместите все свои тесты в test/, где вы можете ссылаться на все свои корневые подпакеты по относительному пути, без необходимости упоминать имя пакета `root *, что хорошо, потому что вы можете переименовать его вбудущее.

...