2013-02-23 10 views
5

私は単体テストからXMLレポートを生成するために、unittest-xml-reportingを使用して正常に動作しているDjangoアプリを持っています。django-discover-runnerとXMLレポート?

しかし、プロジェクトが急速に拡大しており、テストごとに各アプリ内で別々のファイルに分割したいと考えています。私はdjango-discover-runnerをインストールして、すべてのテストファイルを見つけ出し、正常に実行しました。

しかし、django-discover-runnerは私が必要とする(Bamboo用の)XMLレポートを生成しません。

http://www.stevetrefethen.com/blog/Publishing-Python-unit-test-results-in-Jenkins.aspx

をして(私のtest.pyファイルのそれぞれで)その提案を実装しようとしましたが、何のXMLは生成されません:

私はこれを見つけました。

django-discover-runnerunittest-xml-reportingの両方を使用してテストを見つけ、XMLレポートを作成するにはどうすればよいですか?

答えて

3

だから、これに対する解決策は私が予想していたよりはるかに簡単だということが分かりました。これを行うために探してすることができる任意の他のn00bsについて:

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) 

これは次のようになります。

短い答えは、私は単純に一緒にカスタムのテストランナーにdjango-discover-runnerunittest-xml-reportingが提供する2人のテストランナーを石畳のことですプロジェクト内のどこかに保存してください。テストの設定が(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のDiscoverRunnerクラスの

django-discover-runner

unittest-xml-reports

3

この質問を頼まれたので、unittestの-XML-報告プロジェクトが持つadded support。あなたは自分のDjangoの設定ファイルのテストランナーを設定することができます。

TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' 

DiscoverRunnerと同じようにそれは同じテストを実行します。

関連する問題