在单元测试中使用文档测试
我通常会在我的模块中写单元测试和文档测试。我想在运行测试套件时自动运行所有的文档测试。我觉得这应该是可以做到的,但我在语法上遇到了一些困难。
我有一个测试套件
import unittest
class ts(unittest.TestCase):
def test_null(self): self.assertTrue(True)
if __name__ == '__main__': unittest.main()
我想把模块 module1
中的所有文档测试都加到这个套件里。我该怎么做呢?我看过了Python文档,但还是没有找到解决办法。添加以下代码
import doctest
import module1
suite = doctest.DocTestSuite(module1)
并没有奏效。unittest.main()
会在当前文件的范围内搜索并运行它找到的每一个测试案例,对吧?但是 DocTestSuite 产生的是一个测试套件。我该如何让 unittest.main()
运行这个套件中的额外案例呢?还是说我只是搞混了,完全不明白?
再次感谢任何人能提供的帮助。
5 个回答
我建议你使用 pytest --doctest-modules
,而不需要任何负载测试的协议。你只需把你的普通pytest文件或目录和包含doctest的模块一起放到这个pytest命令里就可以了。
pytest --doctest-modules path/to/pytest/unittests path/to/modules
这样它会自动发现并运行所有的doctest。
关于这个老问题的更新:从Python 2.7版本开始,有了一个叫做load_tests协议,所以不再需要写自定义代码了。这个协议允许你添加一个叫做load_tests()
的函数,测试加载器会执行这个函数来更新当前模块的单元测试集合。
你可以在你的代码模块里放一个这样的函数,把模块自己的文档测试打包成一个unittest
的测试套件:
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite())
return tests
或者,你可以在你的单元测试模块里放一个这样的函数,把另一个模块(比如说package.code_module
)的文档测试添加到已经存在的测试套件里:
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(package.code_module))
return tests
当使用unittest.TestLoader
的方法loadTestsFromModule()
、loadTestsFromName()
或discover()
时,unittest会使用一个包含单元测试和文档测试的测试套件。
在这段代码中,我把从导入的模块中得到的单元测试和文档测试结合在了一起。
import unittest
class ts(unittest.TestCase):
def test_null(self):
self.assertTrue(True)
class ts1(unittest.TestCase):
def test_null(self):
self.assertTrue(True)
testSuite = unittest.TestSuite()
testSuite.addTests(unittest.makeSuite(ts))
testSuite.addTest(unittest.makeSuite(ts1))
import doctest
import my_module_with_doctests
testSuite.addTest(doctest.DocTestSuite(my_module_with_doctests))
unittest.TextTestRunner(verbosity = 2).run(testSuite)