2013-02-23 33 views
5

Tôi có một ứng dụng Django đang hoạt động đã được sử dụng thành công unittest-xml-reporting để tạo báo cáo XML từ các lần hủy của tôi.django-discovery-runner và các báo cáo XML?

Tuy nhiên, dự án đang phát triển nhanh chóng và tôi muốn chia nhỏ các thử nghiệm của mình thành các tệp riêng biệt trong từng ứng dụng. Do đó, tôi đã cài đặt django-discover-runner tìm tất cả các tệp thử nghiệm của mình và chạy chúng thành công.

Tuy nhiên, django-discover-runner không tạo báo cáo XML mà tôi cần (đối với Bamboo).

Tôi đã thấy điều này:

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

và đã cố gắng thực hiện điều đó gợi ý (trong mỗi file test.py của tôi), nhưng không có XML được tạo ra.

Tôi làm cách nào để sử dụng cả hai django-discover-runnerunittest-xml-reporting để khám phá các thử nghiệm của mình và tạo báo cáo XML?

Trả lời

3

Vì vậy, hóa ra giải pháp này dễ hơn tôi mong đợi. Đối với bất kỳ n00bs khác, những người có thể tìm kiếm để làm điều này:

Câu trả lời ngắn gọn là tôi chỉ đơn giản là gom góp hai người chạy thử nghiệm được cung cấp bởi django-discover-runnerunittest-xml-reporting thành một Á hậu kiểm tra tùy chỉnh:

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) 

này cần được được lưu ở đâu đó phù hợp trong dự án của bạn. Trong tập tin cài đặt thử nghiệm của bạn (test_settings.py - theo django-discover-runner hướng dẫn), thiết lập các Runner thử nghiệm:

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

Sau đó, bạn sẽ sử dụng (một lần nữa, theo django-discover-runner hướng dẫn):

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

Giải pháp này cho phép tôi sử dụng các tính năng của django-discover-runner để khám phá tất cả các tệp thử nghiệm trong dự án của tôi - được chỉ định theo tùy chọn'TEST_DISCOVER_PATTERN - và vẫn xuất báo cáo XML theo yêu cầu của Bamboo. Big nhờ các tác giả của mã ban đầu:

django-discover-runner

unittest-xml-reports

3

Kể từ khi câu hỏi này được hỏi, các dự án unittest-xml-báo cáo có added support cho lớp Django DiscoverRunner mới. Bạn chỉ có thể đặt người thử nghiệm trong tệp cài đặt Django của bạn:

TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' 

Nó sẽ chạy các kiểm tra tương tự như DiscoverRunner.

Các vấn đề liên quan