def build_suite(app_module): "Create a complete Django test suite for the provided application module" suite = unittest.TestSuite() # Load unit and doctests in the models.py file suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(app_module)) try: suite.addTest( doctest.DocTestSuite(app_module, checker=doctestOutputChecker, runner=DocTestRunner)) except ValueError: # No doc tests in models.py pass # Check to see if a separate 'tests' module exists parallel to the # models module try: app_path = app_module.__name__.split('.')[:-1] test_module = __import__('.'.join(app_path + [TEST_MODULE]), {}, {}, TEST_MODULE) suite.addTest( unittest.defaultTestLoader.loadTestsFromModule(test_module)) try: suite.addTest( doctest.DocTestSuite(test_module, checker=doctestOutputChecker, runner=DocTestRunner)) except ValueError: # No doc tests in tests.py pass except ImportError, e: # Couldn't import tests.py. Was it due to a missing file, or # due to an import error in a tests.py that actually exists? import os.path from imp import find_module try: mod = find_module(TEST_MODULE, [os.path.dirname(app_module.__file__)]) except ImportError: # 'tests' module doesn't exist. Move on. pass else: # The module exists, so there must be an import error in the # test module itself. We don't need the module; so if the # module was a single file module (i.e., tests.py), close the file # handle returned by find_module. Otherwise, the test module # is a directory, and there is nothing to close. if mod[0]: mod[0].close() raise
def build_suite(app_module): """ Create a complete Django test suite for the provided application module. """ suite = unittest.TestSuite() # Load unit and doctests in the models.py module. If module has # a suite() method, use it. Otherwise build the test suite ourselves. if hasattr(app_module, 'suite'): test = app_module.suite() if len(test._tests) > 0: suite.addTests(test._tests) else: test = unittest.TestLoader().loadTestsFromModule(app_module) if len(test._tests) > 0: suite.addTests(test._tests) try: test = doctest.DocTestSuite(app_module, checker=doctestOutputChecker, runner=DocTestRunner) if len(test._tests) > 0: suite.addTests(test._tests) except ValueError: # No doc tests in models.py pass # Check to see if a separate 'tests' module exists parallel to the # models module test_module = get_tests(app_module) if test_module: # Load unit and doctests in the tests.py module. If module has # a suite() method, use it. Otherwise build the test suite ourselves. if hasattr(test_module, 'suite'): test = test_module.suite() if len(test._tests) > 0: suite.addTests(test._tests) else: test = unittest.TestLoader().loadTestsFromModule(test_module) if len(test._tests) > 0: suite.addTests(test._tests) try: test = doctest.DocTestSuite(test_module, checker=doctestOutputChecker, runner=DocTestRunner) if len(test._tests) > 0: suite.addTests(test._tests) except ValueError: # No doc tests in tests.py pass return suite
def get_suite(self, modules, tests): # Prepare suite suite = unittest.TestSuite() # Add import tests suite.addTests([ImportTestCase(m) for m in modules]) # Add doctests output_checker = OutputChecker() for m in modules: try: suite.addTests(doctest.DocTestSuite(m, checker=output_checker, runner=DocTestRunner)) except ValueError: # No tests continue # Add unittests for m in tests: try: mo = __import__(m, {}, {}, "*") except (ImportError, AssertionError): suite.addTest(ImportTestCase(m)) continue t = [] for name in dir(mo): obj = getattr(mo, name) if (isinstance(obj, (type, types.ClassType)) and issubclass(obj, unittest.TestCase)): if obj.__module__ == m: t += [unittest.defaultTestLoader.loadTestsFromTestCase(obj)] suite.addTest(unittest.TestSuite(t)) # Add beef tests for path in self.beef: suite.addTests(self.get_beef(path)) self.info("Test suite build: %d test cases are found" % suite.countTestCases()) return suite
def load_module_doctests(self, module): """Load the doctests for the specified module. Check if a __fixtures__ param exists within the module, and load fixtures if defined. """ self.load_fixtures(module.__fixtures__) return doctest.DocTestSuite(module, checker=OutputChecker(), runner=DocTestRunner)
def build_suite(app_module): "Create a complete Django test suite for the provided application module" from django.test import _doctest as doctest from django.test.testcases import OutputChecker, DocTestRunner doctestOutputChecker = OutputChecker() suite = unittest.TestSuite() # Load unit and doctests in the models.py module. If module has # a suite() method, use it. Otherwise build the test suite ourselves. if hasattr(app_module, 'suite'): suite.addTest(app_module.suite()) else: suite.addTest( unittest.defaultTestLoader.loadTestsFromModule(app_module)) try: suite.addTest( doctest.DocTestSuite(app_module, checker=doctestOutputChecker, runner=DocTestRunner)) except ValueError: # No doc tests in models.py pass # Check to see if a separate 'tests' module exists parallel to the # models module test_module = get_tests(app_module) if test_module: # Load unit and doctests in the tests.py module. If module has # a suite() method, use it. Otherwise build the test suite ourselves. if hasattr(test_module, 'suite'): suite.addTest(test_module.suite()) else: suite.addTest( unittest.defaultTestLoader.loadTestsFromModule(test_module)) try: suite.addTest( doctest.DocTestSuite(test_module, checker=doctestOutputChecker, runner=DocTestRunner)) except ValueError: # No doc tests in tests.py pass return suite
def build_suite(self, test_labels, extra_tests=None, **kwargs): old_suite = super(DjangoWithDoctestTestRunner, self).build_suite(test_labels, extra_tests, **kwargs) for label in test_labels: parts = label.split('.') for module in find_modules(get_app(parts[0])): try: test_obj = doctest.DocTestSuite(module, runner=DocTestRunner) except ValueError: continue else: old_suite.addTest(test_obj) return old_suite
def build_test(label): """ Construct a test case with the specified label. Label should be of the form model.TestClass or model.TestClass.test_method. Returns an instantiated test or test suite corresponding to the label provided. """ parts = label.split('.') if len(parts) < 2 or len(parts) > 3: raise ValueError("Test label '%s' should be of the form app.TestCase " "or app.TestCase.test_method" % label) # # First, look for TestCase instances with a name that matches # app_module = get_app(parts[0]) test_module = get_tests(app_module) TestClass = getattr(app_module, parts[1], None) # Couldn't find the test class in models.py; look in tests.py if TestClass is None: if test_module: TestClass = getattr(test_module, parts[1], None) try: if issubclass(TestClass, (unittest.TestCase, real_unittest.TestCase)): if len(parts) == 2: # label is app.TestClass try: return unittest.TestLoader().loadTestsFromTestCase( TestClass) except TypeError: raise ValueError( "Test label '%s' does not refer to a test class" % label) else: # label is app.TestClass.test_method return TestClass(parts[2]) except TypeError: # TestClass isn't a TestClass - it must be a method or normal class pass # # If there isn't a TestCase, look for a doctest that matches # tests = [] for module in app_module, test_module: try: doctests = doctest.DocTestSuite(module, checker=doctestOutputChecker, runner=DocTestRunner) # Now iterate over the suite, looking for doctests whose name # matches the pattern that was given for test in doctests: if test._dt_test.name in ( '%s.%s' % (module.__name__, '.'.join(parts[1:])), '%s.__test__.%s' % (module.__name__, '.'.join(parts[1:]))): tests.append(test) except ValueError: # No doctests found. pass # If no tests were found, then we were given a bad test label. if not tests: raise ValueError("Test label '%s' does not refer to a test" % label) # Construct a suite out of the tests that matched. return unittest.TestSuite(tests)
def make_doctest(module): return doctest.DocTestSuite(module, checker=doctestOutputChecker, runner=DocTestRunner, )