Вы не упомянули, какую платформу модульного тестирования вы используете, но если вы используете pytest , она уже поддерживает такую организацию приложений / тестов, где тесты находятся за пределами кода приложения .
setup.py
mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py
...
- ..
- Если у вас нет файла
setup.py
и вы полагаетесь на тот факт, что
Python по умолчанию помещает текущий каталог в sys.path
для импорта
ваш пакет, вы можете выполнить python -m pytest
для выполнения тестов
против локальной копии напрямую, без использования pip
.
Ваши коды уже правильно структурированы. Вам не нужно вручную устанавливать sys.path
. Вы можете использовать from app import main
как обычно (см. Мой образец test_one.py ниже). Единственное, что я хотел бы добавить, это pytest.ini , чтобы указать пути тестирования и шаблон для тестовых файлов.
структура каталогов :
Project
├── pytest.ini
├── app
│ ├── __init__.py
│ └── main.py
│
├── tests
│ ├── __init__.py
│ └── test_one.py
pytest.ini
[pytest]
addopts = -v
console_output_style = count
python_files = test_*.py
testpaths = tests
образец main.py :
def calculate(x, y):
return x + y
образец test_one.py :
from app import main
def test_calculate():
assert(3 == main.calculate(1, 2))
работает pytest:
$ pytest tests
=============================================================================== test session starts ===============================================================================
platform linux -- Python 3.7.2, pytest-4.6.2, py-1.8.0, pluggy-0.12.0 -- /home/gino/.virtualenvs/test-py37/bin/python3.7
cachedir: .pytest_cache
rootdir: /home/gino/Project, inifile: pytest.ini, testpaths: tests
collected 1 item
tests/test_one.py::test_calculate PASSED [1/1]
============================================================================ 1 passed in 0.01 seconds =============================================================================