如何让 django 的 unittest TestLoader 找到并 运行 我的 doctests?

How to get django's unittest TestLoader to find and run my doctests?

在 Django 中,我的测试是 my_django_app/tests/ 中的一组 test_foo.py 文件,每个文件都包含一个 TestCase 子 class,django 会自动查找和 运行s.

我有一堆带有简单文档测试的实用程序模块,我想将它们包含在我的测试套件中。我尝试使用 doctest.DocTestSuite()my_django_app/tests/test_doctests.py 中定义测试套件,但是 django 的测试 运行ner 没有在那个模块中找到新的测试。

有没有一种方法可以创建一个调用我的 doctest 的测试用例 class,或者以其他方式定义一个新的 tests/test_foo.py 模块来 运行 这些测试?

我通过创建一个新模块 my_django_app/tests/test_doctests.py 解决了这个问题,它看起来像:

import doctest
import unittest

# These are my modules that contain doctests:
from util import bitwise
from util import text
from util import urlutil
DOCTEST_MODULES = (
  bitwise,
  text,
  urlutil,
)

# unittest.TestLoader will call this when it finds this module:
def load_tests(*args, **kwargs):
  test_all_doctests = unittest.TestSuite()
  for m in DOCTEST_MODULES:
    test_all_doctests.addTest(doctest.DocTestSuite(m))
  return test_all_doctests

Django 使用内置单元测试 TestLoader,在测试发现期间,它会在您的测试模块上调用 load_tests()。所以我们定义 load_tests 它从所有的 doctests 中创建一个测试套件。

Django 的 automagic unittests 发现在您的 test_foo 模块中查找 load_tests 函数并将 运行 它。所以你可以使用它来将你的 doctests 添加到测试套件中......

import doctest
import module_with_doctests

def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(module_with_doctests))
    return tests

此外,由于 unittest 中的错误(?),您的 load_tests 函数将不会是 运行,除非您的 test_foo 模块也定义了 TestCase-派生 class 像这样:

class DoNothingTest(TestCase):
    """Encourage Django unittests to run `load_tests()`."""
    def test_example(self):
        self.assertTrue(True)