Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

# 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 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 -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()