Модульное тестирование всей иерархии проекта в 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