отчеты django-discover-runner и XML?
у меня есть рабочее приложение Django, которое успешно использует unittest-xml-reporting
для создания XML-отчетов из моих unittests.
однако проект быстро растет, и я хочу разбить свои тесты на отдельные файлы в каждом приложении. Поэтому я установил django-discover-runner
, который находит все мои тестовые файлы и запускает их успешно.
однако, django-discover-runner
не создает XML-отчеты, которые мне нужны (для Bamboo).
я нашел это:
http://www.stevetrefethen.com/blog/Publishing-Python-unit-test-results-in-Jenkins.aspx
и попытались реализовать это предложение (в каждом из моих test.py файлы), но XML не создается.
как я могу использовать оба django-discover-runner
и unittest-xml-reporting
чтобы обнаружить мои тесты и создавать XML-отчеты?
2 ответов
поскольку этот вопрос был задан, проект unittest-xml-reporting имеет добавлена поддержка для нового Django DiscoverRunner
класса. Вы можете просто установить тестовый бегун в файле настроек Django:
TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'
Он будет работать те же тесты, что и DiscoverRunner
would.
Итак, оказывается, что решение этого намного проще, чем я ожидал. Для любых других n00bs, которые могут искать, чтобы сделать это:
короткий ответ заключается в том, что я просто собрал два тестовых бегуна, предоставленных django-discover-runner
и unittest-xml-reporting
в пользовательских тестов:
from django.conf import settings
from django.test.utils import setup_test_environment, teardown_test_environment
import xmlrunner
from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase
from django.test.simple import DjangoTestSuiteRunner, reorder_suite
from django.utils.importlib import import_module
try:
from django.utils.unittest import defaultTestLoader
except ImportError:
try:
from unittest2 import defaultTestLoader # noqa
except ImportError:
raise ImproperlyConfigured("Couldn't import unittest2 default "
"test loader. Please use Django >= 1.3 "
"or go install the unittest2 library.")
### CUSTOM RUNNER NAME
class myTestRunner(DjangoTestSuiteRunner):
### THIS SECTION FROM UNITTESTS-XML-REPORTING
def build_suite(self, test_labels, extra_tests=None, **kwargs):
suite = None
root = getattr(settings, 'TEST_DISCOVER_ROOT', '.')
top_level = getattr(settings, 'TEST_DISCOVER_TOP_LEVEL', None)
pattern = getattr(settings, 'TEST_DISCOVER_PATTERN', 'test*.py')
if test_labels:
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
root = import_module(test_labels[0]).__path__[0]
if suite is None:
suite = defaultTestLoader.discover(root,
pattern=pattern, top_level_dir=top_level)
if extra_tests:
for test in extra_tests:
suite.addTest(test)
return reorder_suite(suite, (TestCase,))
###THIS SECTION FROM DJANGO-DISCOVER-RUNNER
def run_tests(self, test_labels, extra_tests=None, **kwargs):
"""
Run the unit tests for all the test labels in the provided list.
Labels must be of the form:
- app.TestClass.test_method
Run a single specific test method
- app.TestClass
Run all the test methods in a given class
- app
Search for doctests and unittests in the named application.
When looking for tests, the test runner will look in the models and
tests modules for the application.
A list of 'extra' tests may also be provided; these tests
will be added to the test suite.
Returns the number of tests that failed.
"""
setup_test_environment()
settings.DEBUG = False
verbosity = getattr(settings, 'TEST_OUTPUT_VERBOSE', 1)
if isinstance(verbosity, bool):
verbosity = (1, 2)[verbosity]
descriptions = getattr(settings, 'TEST_OUTPUT_DESCRIPTIONS', False)
output = getattr(settings, 'TEST_OUTPUT_DIR', '.')
suite = self.build_suite(test_labels, extra_tests)
old_config = self.setup_databases()
result = xmlrunner.XMLTestRunner(
verbosity=verbosity, descriptions=descriptions,
output=output).run(suite)
self.teardown_databases(old_config)
teardown_test_environment()
return len(result.failures) + len(result.errors)
это должно быть сохранено где-то подходящий в вашем проекте. В файле настроек теста (test_settings.py
- а в django-discover-runner
- инструкции), набор тест Бегун:
TEST_RUNNER = '<your-django-project>.customTestRunner.myTestRunner'
затем вы будете использовать (опять же, согласно django-discover-runner
инструкции):
django-admin.py test --settings=myapp.test_settings
это решение позволяет мне использовать django-discover-runner
функции, чтобы обнаружить все тестовые файлы в моем проекте-указано django-discover-runner
' s TEST_DISCOVER_PATTERN
опция-и по-прежнему выводить XML-отчеты, как требуется Bamboo. Большое спасибо авторам оригинального кода: