совместное использование модуля между тестами и ядром - соответствующая структура проекта - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь улучшить структуру проекта при добавлении в базу кода.Я нашел образец структуры здесь , который выглядит следующим образом:

README.rst
LICENSE
setup.py
requirements.txt
sample/__init__.py
sample/core.py
sample/helpers.py
docs/conf.py
docs/index.rst
tests/test_basic.py
tests/test_advanced.py

В частности, я замечаю, что requirements.txt и setup.py находятся на более высоком уровне, чем tests/ и sample/

Если я добавлю sample/classes.py, вам нужно всего лишь написать from classes import MyClass в sample/core.py, чтобы получить его там.Однако он не может быть так легко импортирован в tests/test_basic.py, не похоже, что при импорте python «смотрит за угол» так.

В моем случае, есть также MANIFEST.in на том же уровне сneeds.txt и некоторые файлы, которые на самом деле не являются python, а просто настраивают для платформы, на которой это работает.

Если бы classes.py были на том же уровне, что и requirements.txt Я думаю, что это было бы легко импортировать всем в tests/ и sample/ и их подкаталогах, но для этого может потребоваться __init__.py.как-то нехорошо.

Так куда же оно должно пойти, если оба tests/ и sample/ должны иметь возможность использовать его?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Если вы используете Python> = 3.3, вы можете просто превратить тестовую папку в пакет, добавив в нее модуль __init__.py.Затем в этом __init__.py (и только там) вы добавляете путь родительского пакета к sys.path.Это, если достаточно для unittest, обнаружить, чтобы использовать его для всех модулей в tests.

Мой один просто:

import os
import sys

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

Тогда, если вам нужно получить доступ к classes.py от одного изтестовые модули, вы можете просто использовать:

from sample import classes

или напрямую импортировать MyClass:

from sample.classes import MyClass

Это просто работает, потому что sample уже является пакетом, а его родительская папка имеетдобавлен в sys.path, когда python unittest загрузил пакет test.


Конечно, это работает только в том случае, если ваши тесты находятся в пакете.Если по какой-либо причине это невозможно, например, потому что вам нужно запускать тестовые модули по отдельности, то вы должны поместить модификацию sys.path непосредственно во все тестовые файлы.

Записать файл path_helper.pyв папке тестов:

import os
import sys

core_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if core_path not in sys.path:  # don't add it if it is already here
    sys.path.append(core_path)

Затем вы можете импортировать его во все тестовые файлы:

import path_helper
...
0 голосов
/ 09 октября 2018

Давайте сделаем это просто.

Если я правильно понимаю, проблема в How to import simple module in test.Это означает, что вы хотите использовать что-то вроде from simple.classes import MyClass.

Это просто, просто добавьте свой корневой путь к PYTHONPATH перед выполнением python test/test_basic.py.

Это также то, что IDE делает для васкогда вы выполняете тесты через него.

...