技术开发 频道

django单元测试历险记

  添加一个没什么用的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'

0
相关文章