Как собрать django TestCases в TestSuites и запустить их? - PullRequest
2 голосов
/ 10 июня 2011

С этим вопросом Я решил, как разбить мои тесты на несколько файлов. Итак, теперь в каждом файле / модуле у меня есть серия классов TestCase.

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

./manage.py test api.TokenGeneratorTestCase api.ViewsTestCase

Вместо того, чтобы вызывать связанные TestCase по отдельности, теперь я думаю, что было бы неплохо сгруппировать связанные TestCases в наборы, а затем вызвать весь набор из командной строки; надеюсь, не теряя возможности вызывать все комплекты в приложении сразу.

Я видел этот материал на Python о люксах, а также этот материал о django о люксах, но понять, как сделать то, что я хочу, трудно Я думаю, что я хочу сказать что-то вроде:

./manage.py test api.NewSeedsImportTestCase api.NewSeedsExportTestCase
./manage.py test api.NewSeedsSuite
./manage.py test api.NewRoomsSuite
./manage.py test api

Кто-нибудь организовал свои тестовые наборы Django в комплекты и может показать мне, как?

1 Ответ

1 голос
/ 10 июня 2011

Один из возможных подходов - написать собственный бегун, который расширил бы django.test.simple.DjangoTestSuiteRunner и переопределил бы метод build_suite.Вот где Django генерирует набор, используемый командой test.

Получает аргумент test_labels, который соответствует аргументам командной строки, переданным команде.Вы можете расширить его функциональность, разрешив передавать дополнительные пути к модулям, из которых следует загружать тесты.Что-то вроде этого должно сработать (это просто для демонстрации подхода, я не тестировал код):

from django.test.simple import DjangoTestSuiteRunner
from django.utils import unittest
from django.utils.importlib import import_module


class MyTestSuiteRunner(DjangoTestSuiteRunner):

    def build_suite(self, test_labels, extra_tests=None, *args, **kwargs):
        if test_labels:
            extra_test_modules = [label.lstrip('module:')
                                  for label in test_labels
                                  if label.startswith('module:')]
            extra_tests = extra_tests or []
            for module_path in extra_test_modules:
                # Better way to load the tests here would probably be to use
                # `django.test.siple.build_suite` as it does some extra stuff like looking for doctests.
                extra_tests += unittest.defaultTestLoader.loadTestsFromModule(import_module(module_path))

            # Remove the 'module:*' labels
            test_labels = [label for label in test_labels if not label.startswith('module:')]

        # Let Django do the rest
        return super(MyTestSuiteRunner, self).build_suite(test_labels, extra_tests, *args, **kwargs)

Теперь вы сможете запускать команду test точно так же, как и раньше,за исключением того, что любая метка, которая выглядит следующим образом module:api.test.extra, приведет к тому, что все тесты / наборы из модуля будут добавлены в окончательный набор.

Обратите внимание, что метки 'module:' не являются метками приложения, поэтомудолжен быть полный путь Python к модулю.

Вам также нужно будет указать свои настройки TEST_RUNNER для вашего нового бегуна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...