Модульное тестирование всей иерархии проекта в Python с использованием unittest в pydev

Я использую модуль unittest для модульного тестирования некоторого кода Python, который был создан в иерархической структуре пакетов с использованием Pydev. Проблема возникает, когда я пытаюсь использовать отдельные исходные папки для реального исходного кода и его модульного тестирования в pydev.

project
  |----src
  |     |----com
  |     |     |----myself
  |     |     |       |----MyApplication
  |     |     |       |          |----SampleFileToTest.py  => The application file that I want to test
  |----test
  |     |----com
  |     |     |----myself
  |     |     |       |----MyApplication
  |     |     |       |          |----TestTheSampleFileToTest.py  => My test case file

Поскольку я пытаюсь разделить иерархии, у меня возникают проблемы при обращении к файлу приложения в тестовом файле. Можно ли пойти по пути Junit, то есть с использованием разных исходных папок, но с тем же именем пакета?

1 ответ

Это не поддерживается по умолчанию в самом Python (то есть: ничего общего с PyDev) - я также пришел из Java-фона, поэтому, возможно, вам придется забыть некоторые из ваших концепций Java здесь:)

В Python, когда папка с __init__.py найден, этот пакет больше не будет искать по другим путям. Я думаю, что setuptools имеет некоторые хакеры, чтобы заставить это работать, и я смутно помню, что Python 3 может добавить некоторую поддержку, но пока я не думаю, что это вообще рекомендуется... Это немного отличается от подхода Java - в Python, flat лучше, чем вложенный - может быть, вы знаете, но в противном случае, просто для удовольствия, запустите сеанс интерпретатора Python и выполните "import this":)

Т.е.: короче говоря, один раз my_app/__init__.py найден, он не будет пытаться разрешить подпапки my_app в любом другом месте PYTHONPATH

Итак, у вас есть 2 подхода... Обычно я делаю тесты рядом с модулем в пакете _tests. То есть:

/project
/project/src
/project/src/myapp
/project/src/myapp/__init__.py
/project/src/myapp/_tests
/project/src/myapp/_tests/__init__.py
/project/src/myapp/_tests/test_myapp.py

И другой подход (который, я должен сказать, мне нравится немного меньше, поскольку тесты "чувствуют" себя более отделенным от кода), будет иметь отдельный пакет для тестов:

/project
/project/src
/project/src/myapp
/project/src/myapp/__init__.py
/project/src/myapp_tests/__init__.py
/project/src/myapp_tests/test_myapp.py
Другие вопросы по тегам