10

unittest-xml-reportingユニットテストから XML レポートを生成するために使用している Django アプリが動作しています。

ただし、プロジェクトは急速に成長しているため、テストを各アプリ内の個別のファイルに分割したいと考えています。したがって、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 レポートを生成するにはどうすればよいですか?

4

2 に答える 2

9

この質問が出されて以来、unittest-xml-reporting プロジェクトは新しい Djangoクラスのサポートを追加しました。DiscoverRunnerDjango 設定ファイルでテスト ランナーを設定するだけです。

TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'

wouldと同じテストを実行しDiscoverRunnerます。

于 2015-04-21T22:06:20.243 に答える
5

したがって、これに対する解決策は、私が予想していたよりもはるかに簡単であることがわかりました。これを行う可能性がある他のn00bsの場合:

手短に言えば、私は と によって提供された 2 つのテスト ランナーをカスタム テスト ランナーにまとめただけ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( のTEST_DISCOVER_PATTERNオプションで指定) を検出し、Bamboo の要求に応じて XML レポートを出力することができます。元のコードの作成者に感謝します。

ジャンゴ発見ランナー

unittest-xml-レポート

于 2013-02-25T03:39:44.693 に答える