【问题标题】:django-discover-runner and XML reports?django-discover-runner 和 XML 报告?
【发布时间】:2013-02-23 09:26:30
【问题描述】:

我有一个工作的 Django 应用程序,它已成功使用 unittest-xml-reporting 从我的单元测试中生成 XML 报告。

但是,该项目正在迅速发展,我想将我的测试分解为每个应用程序中的单独文件。因此我安装了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-runnerunittest-xml-reporting 来发现我的测试并生成 XML 报告?

【问题讨论】:

    标签: xml django unit-testing


    【解决方案1】:

    自从提出这个问题以来,unittest-xml-reporting 项目有 added support 用于新的 Django DiscoverRunner 类。您可以在 Django 设置文件中设置测试运行器:

    TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'
    

    它将运行与DiscoverRunner 相同的测试。

    【讨论】:

    • 谢谢!!配置它花了几秒钟
    【解决方案2】:

    事实证明,这个问题的解决方案比我预期的要容易得多。对于任何其他可能希望这样做的 n00b:

    简短的回答是,我只是将django-discover-runnerunittest-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-runnerTEST_DISCOVER_PATTERN 选项指定 - 并且仍然按照 Bamboo 的要求输出 XML 报告。非常感谢原始代码的作者:

    django-discover-runner

    unittest-xml-reports

    【讨论】:

      猜你喜欢
      • 2018-03-29
      • 2016-10-16
      • 2015-12-29
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2010-11-08
      相关资源
      最近更新 更多