Оптимальная организация файловой структуры модуля Python unittests?

К сожалению, я заметил, что существует слишком много способов сохранить ваш unittest в Python, и они обычно не хорошо документированы.

Я ищу «конечную» структуру, которая выполнит большинство из нижеперечисленных требований:

  • быть открытыми с помощью тестовых платформ, в том числе:
    • pytest
    • nosetests
    • tox
  • тесты должны быть вне файлов модулей и в другом каталоге, кроме самого модуля (обслуживание), вероятно, в каталоге tests/ на уровне пакета.
  • необходимо будет просто выполнить тестовый файл (тест должен быть в состоянии узнать, где находится модуль, который должен тестировать)

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

Вот такой подход, который я использовал:

Структура каталога

 # All __init__.py files are empty in this example. app package_a __init__.py module_a.py package_b __init__.py module_b.py test __init__.py test_app.py __init__.py main.py 

main.py

 # This is the application's front-end. # # The import will succeed if Python can find the `app` package, which # will occur if the parent directory of app/ is in sys.path, either # because the user is running the script from within that parect directory # or because the user has included the parent directory in the PYTHONPATH # environment variable. from app.package_a.module_a import aaa print aaa(123, 456) 

module_a.py

 # We can import a sibling module like this. from app.package_b.module_b import bbb def aaa(s, t): return '{0} {1}'.format(s, bbb(t)) # We can also run module_a.py directly, using Python's -m option, which # allows you to run a module like a script. # # python -m app.package_a.module_a if __name__ == '__main__': print aaa(111, 222) print bbb(333) 

module_b.py

 def bbb(s): return s + 1 

test_app.py

 import unittest # From the point of view of testing code, our working modules # are siblings. Imports work accordingly, as seen in module_a. from app.package_a.module_a import aaa from app.package_a.module_a import bbb class TestApp(unittest.TestCase): def test_aaa(self): self.assertEqual(aaa(77, 88), '77 89') def test_bbb(self): self.assertEqual(bbb(99), 100) # Simiarly, we can run our test modules directly as scripts using the -m option, # or using nose. # # python -m app.test.test_app # nosetests app/test/test_app.py if __name__ == '__main__': unittest.main()