В случае, если это кому-нибудь поможет, вот подход, который я нашел для решения этой проблемы. У меня был случай использования, где у меня есть следующая структура каталогов:
mypackage/
tests/
test_category_1/
tests_1a.py
tests_1b.py
...
test_category_2/
tests_2a.py
tests_2b.py
...
...
и я хочу, чтобы все перечисленное ниже работало очевидным образом и могло быть предоставлено с теми же аргументами командной строки, которые приняты unittest:
python -m mypackage.tests
python -m mypackage.tests.test_category_1
python -m mypackage.tests.test_category_1.tests_1a
Решение было настроить mypackage/tests/__init__.py
следующим образом:
import unittest
def prepare_load_tests_function (the__path__):
test_suite = unittest.TestLoader().discover(the__path__[0])
def load_tests (_a, _b, _c):
return test_suite
return load_tests
и настроить mypackage/tests/__main__.py
так:
import unittest
from . import prepare_load_tests_function, __path__
load_tests = prepare_load_tests_function(__path__)
unittest.main()
и скопировать и вставить пустой __init__.py
и следующие __main__.py
в каждый mypackage/tests/test_category_n/
:
import unittest
from .. import prepare_load_tests_function
from . import __path__
load_tests = prepare_load_tests_function(__path__)
unittest.main()
, а также добавить стандарт if __name__ == '__main__': unittest.main()
в каждый файл фактических испытаний.
(у меня работает на Python 3.3 под Windows, ymmv.)