添加一个没什么用的models.py和设置数据库参数,看上去似乎对我来说没什么意义,但在某些情况下,这样的方式能够比较简单的解决之前的问题然后展开测试。 再细看文档时,其中还有提到的是,我们可以自己设置一个test runner,安装我们定义的方式去执行。听上去不错,这样我就可以不用去添加什么models.py和修改数据库设置了。django默认是会加载 django.test.simple.run_tests函数,我们需要做的就是一个自己写一个run_tests函数,通过设置 TEST_RUNNER属性,加载我们的test runner。
通过查看默认的test runner代码,大致了解了基本原理后,我对默认的test runner进行了大量的简化,去除了models.py的加载,去除了数据库的依赖。下面是我的test runner,代码很短:
import unittest
from django.conf import settings
from django.test.utils import setup_test_environment, teardown_test_environment
from django.test.testcases import OutputChecker, DocTestRunner, TestCase
TEST_MODULE = 'tests'
def build_suite(label):
suite = unittest.TestSuite()
try:
app_path = label + '.' + TEST_MODULE
test_module = __import__(app_path, {}, {}, TEST_MODULE)
except ImportError, e:
test_module = None
if test_module:
if hasattr(test_module, 'suite'):
suite.addTest(test_module.suite())
else:
suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_module))
return suite
def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]):
setup_test_environment()
settings.DEBUG = False
suite = unittest.TestSuite()
if test_labels:
for label in test_labels:
suite.addTest(build_suite(label))
for test in extra_tests:
suite.addTest(test)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
teardown_test_environment()
return len(result.failures) + len(result.errors)
不要忘记了设在TEST_RUNNER:
TEST_RUNNER = 'testdjango.testrunner.run_tests'