2013-02-23 12 views
5

Mam działającą aplikację Django, która z powodzeniem używa unittest-xml-reporting do generowania raportów XML z moich unittests.django-discover-runner i raporty XML?

Jednak projekt szybko rośnie i chcę rozbić moje testy na osobne pliki w ramach każdej aplikacji. Zainstalowałem więc django-discover-runner, który znajduje wszystkie moje pliki testowe i uruchamia je z powodzeniem.

Jednak django-discover-runner nie generuje raportów XML, których potrzebuję (dla Bamboo).

Znalazłem to:

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

i próbowali realizować tę sugestię (w każdym z moich test.py plików), ale nie XML jest produkowany.

Jak mogę użyć obu django-discover-runner i unittest-xml-reporting, aby odkryć moje testy i wygenerować raporty XML?

Odpowiedz

3

Okazuje się, że rozwiązanie tego problemu jest znacznie łatwiejsze niż się spodziewałem. Dla innych n00bs którzy mogą być patrząc na to:

Krótka odpowiedź jest taka, że ​​ja po prostu brukowanych razem dwóch biegaczy badawczych przewidzianych przez django-discover-runner i unittest-xml-reporting do biegacza zwyczaj testu:

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) 

ten powinien być zapisane gdzieś w twoim projekcie. W pliku ustawień Test (test_settings.py - jak za django-discover-runner instrukcji), ustawić Runner testu:

TEST_RUNNER = '<your-django-project>.customTestRunner.myTestRunner' 

byłoby wtedy użyć (znowu, jak za django-discover-runner instrukcje):

django-admin.py test --settings=myapp.test_settings 

Rozwiązanie to pozwala mi korzystać z funkcji django-discover-runner, aby odkryć wszystkie pliki testowe w moim projekcie - określone przez opcję django-discover-runner 's TEST_DISCOVER_PATTERN - i nadal generować raporty XML zgodnie z wymaganiami Bamboo. Wielkie podziękowania dla autorów oryginalnego kodu:

django-discover-runner

unittest-xml-reports

3

Ponieważ to pytano, projekt unittest-xml-sprawozdawczych added support nowego Django DiscoverRunner klasie. można po prostu ustawić zawodnik testowy w pliku ustawień Django:

TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' 

To będzie działać te same testy jak DiscoverRunner będzie.

Powiązane problemy