после просмотра нескольких презентаций о тестировании django я хочу написать свой собственный TestRunner, чтобы пропустить тесты django и создать лучшие структуры пакетов для своих тестов.
Проблема в том, что мы изменили структуру проекта, и программа запуска тестов не может найти правильный путь для обнаружения тестов. Вот так выглядит мой проект:
project/
-src/
- project_name/
- apps/
- test/ # Not a good name, i know, will change it
- some_app/
- test_models.py
- manage.py
- development.db
Теперь, чтобы проверить test_models.py
, я хочу сделать это:
$ cd project/src/
$ python manage.py test some_app.test_models
Проблема в том, что средство запуска тестов не может найти этот пакет (some_app
) и модуль (test_models.py
). Оно меняется, если я жестко запрограммирую имя в программе запуска тестов, но мне не нравится это делать. Вот что я делаю, чтобы заставить его работать.
test_labels = ["%s.%s" % ("project_name.test", l)
for l in test_labels
if not l.startswith("project_name.test")]
Итак, если вы делаете
$ python manage.py test some_app.test_models
Он будет переписан на:
$ python manage.py test project_name.test.some_app.test_models
И это прекрасно работает.
Я пытался сделать sys.path.append("(...)/project_name/test)
, но тоже не работает.
Это код моего TestRunner:
class DiscoveryDjangoTestSuiteRunner(DjangoTestSuiteRunner):
"""A test suite runner that uses unittest2 test discovery.
It's better than the default django test runner, becouse it
doesn't run Django tests and let you put your tests in different
packages, modules and classes.
To test everything in there:
$ ./manage.py test
To test a single package/module:
$ ./manage.py test package
$ ./manage.py test package.module
To test a single class:
$ ./manage.py test package.module.ClassName
"""
def build_suite(self, test_labels, extra_tests=None, **kwargs):
suite = None
discovery_root = settings.TEST_DISCOVERY_ROOT
if test_labels:
# This is where I append the path
suite = defaultTestLoader.loadTestsFromNames(test_labels)
# if single named module has no tests, do discovery within it
if not suite.countTestCases() and len(test_labels) == 1:
suite = None
discovery_root = import_module(test_labels[0]).__path__[0]
if suite is None:
suite = defaultTestLoader.discover(
discovery_root,
top_level_dir=settings.BASE_PATH,
)
if extra_tests:
for test in extra_tests:
suite.addTest(test)
return reorder_suite(suite, (TestCase,))