如何将 doctests 与 unittest 的测试发现相结合?

How can I integrate doctests with unittest's test discovery?

我写了一个 python 脚本来自动为我完成所有测试,并生成一个 HTML 报告。前几天我发现 discover 用于单元测试,这让我可以 运行 给定目录中的所有单元测试而无需明确命名它们,我真的很想能够以相同的方式进行我的文档测试,而不是而不是必须显式导入每个模块。

我在 https://docs.python.org/2/library/doctest.html 找到了一些关于如何执行此操作的信息,但并没有真正理解。你能帮我在我的 doctests 中使用 discover 吗?

Python test discovery with doctests, coverage and parallelism 相关,但仍然没有回答我的问题。

coverage_module

import coverage
import doctest
import unittest
import os

# import test_module 
import my_module

cov = coverage.Coverage()
cov.start()

# running doctest by explicity naming the module
doctest.testmod(my_module)

# running unittests by just specifying the folder to look into
testLoad = unittest.TestLoader()
testSuite = testLoad.discover(start_dir=os.getcwd())
runner = unittest.TextTestRunner()
runner.run(testSuite)

cov.stop()
cov.save()
cov.html_report()
print "tests completed"

test_module

import unittest
import doctest

from my_module import My_Class


class My_Class_Tests(unittest.TestCase):
    def setUp(self):
        # setup variables

    def test_1(self):
        # test code

# The bit that should load up the doctests? What's loader, tests, and ignore though? 
# Is this in the right place?
def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(module_with_doctests))
    return tests

if __name__ == '__main__':
    unittest.main()

让我们弄清楚那里发生了什么

1) unittest.discovery

它没有 doctests 的线索,因为 doctests 是一个不同的框架。 所以 unittest 不应该开箱即用地发现 doctests。 这意味着你需要用手把它们粘在一起

2) doctest

它本质上是一个单独的框架,尽管它有一些粘合 类 可以将 doctests 转换为类似 unittests 的 TestCases。 https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

3) 发现

没明白discover你的意思,我想是

python -m unittest discover

如果不是,而你在谈论 https://pypi.python.org/pypi/discover 那么就忘掉它吧 - 它是 python

早期版本的反向移植

4) 做什么

按照此处所述 https://docs.python.org/2.7/library/doctest 在您的代码中散布大量 load_tests 挂钩.html#unittest-api 或者编写一个方法来收集你在一个地方拥有的所有模块并将它们转换成 DocTestSuite[s] https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

但老实说,这两种方法现在都没有任何意义,因为它归结为:

$ py.test --doctest-modules

$ nosetests --with-doctest

当然 coverage 这些框架还提供了很多花哨的功能,您可以继续使用 unittest.TestCase,甚至不需要创建 coverage_module 所以我会深入研究其中之一,而不是尝试提出自己的解决方案