2007-05-31 21:18:12 +08:00
|
|
|
import unittest
|
2006-08-27 20:24:59 +08:00
|
|
|
from django.conf import settings
|
2007-05-31 21:18:12 +08:00
|
|
|
from django.test import _doctest as doctest
|
2006-09-02 17:26:24 +08:00
|
|
|
from django.test.utils import setup_test_environment, teardown_test_environment
|
2006-08-27 20:24:59 +08:00
|
|
|
from django.test.utils import create_test_db, destroy_test_db
|
|
|
|
from django.test.testcases import OutputChecker, DocTestRunner
|
|
|
|
|
|
|
|
# The module name for tests outside models.py
|
|
|
|
TEST_MODULE = 'tests'
|
|
|
|
|
|
|
|
doctestOutputChecker = OutputChecker()
|
|
|
|
|
|
|
|
def build_suite(app_module):
|
|
|
|
"Create a complete Django test suite for the provided application module"
|
|
|
|
suite = unittest.TestSuite()
|
|
|
|
|
2007-07-20 21:57:49 +08:00
|
|
|
# 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
|
2006-08-27 20:24:59 +08:00
|
|
|
|
|
|
|
# Check to see if a separate 'tests' module exists parallel to the
|
|
|
|
# models module
|
|
|
|
try:
|
|
|
|
app_path = app_module.__name__.split('.')[:-1]
|
2006-10-31 04:50:27 +08:00
|
|
|
test_module = __import__('.'.join(app_path + [TEST_MODULE]), {}, {}, TEST_MODULE)
|
2006-08-27 20:24:59 +08:00
|
|
|
|
2007-07-20 21:57:49 +08:00
|
|
|
# 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
|
2006-09-09 22:58:46 +08:00
|
|
|
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
|
2007-05-10 20:07:34 +08:00
|
|
|
# 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()
|
2006-09-09 22:58:46 +08:00
|
|
|
raise
|
|
|
|
|
2006-08-27 20:24:59 +08:00
|
|
|
return suite
|
|
|
|
|
2007-07-23 20:14:32 +08:00
|
|
|
def run_tests(module_list, verbosity=1, interactive=True, extra_tests=[]):
|
2006-08-27 20:24:59 +08:00
|
|
|
"""
|
|
|
|
Run the unit tests for all the modules in the provided list.
|
|
|
|
This testrunner will search each of the modules in the provided list,
|
|
|
|
looking for doctests and unittests in models.py or tests.py within
|
|
|
|
the module. A list of 'extra' tests may also be provided; these tests
|
|
|
|
will be added to the test suite.
|
2007-02-26 20:52:01 +08:00
|
|
|
|
|
|
|
Returns the number of tests that failed.
|
2006-08-27 20:24:59 +08:00
|
|
|
"""
|
2006-09-02 17:26:24 +08:00
|
|
|
setup_test_environment()
|
2006-08-27 20:24:59 +08:00
|
|
|
|
|
|
|
settings.DEBUG = False
|
|
|
|
suite = unittest.TestSuite()
|
|
|
|
|
|
|
|
for module in module_list:
|
|
|
|
suite.addTest(build_suite(module))
|
|
|
|
|
|
|
|
for test in extra_tests:
|
|
|
|
suite.addTest(test)
|
|
|
|
|
2006-08-31 22:29:47 +08:00
|
|
|
old_name = settings.DATABASE_NAME
|
2007-07-23 20:14:32 +08:00
|
|
|
create_test_db(verbosity, autoclobber=not interactive)
|
2007-02-26 20:52:01 +08:00
|
|
|
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
|
2006-08-27 20:24:59 +08:00
|
|
|
destroy_test_db(old_name, verbosity)
|
2006-09-02 17:26:24 +08:00
|
|
|
|
|
|
|
teardown_test_environment()
|
2007-02-26 20:52:01 +08:00
|
|
|
|
2007-03-29 19:59:31 +08:00
|
|
|
return len(result.failures) + len(result.errors)
|
2007-02-26 20:52:01 +08:00
|
|
|
|