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

问题描述:

我写了一个python脚本为我自动完成所有测试,并生成一个HTML报告。前几天我发现了discover for unittests,它让我可以在给定的目录下运行所有​​的unittests,而不用明确地命名它们,我真的很希望能够以同样的方式来完成我的doctests,而不是必须明确地导入每个模块。如何将doctests与unittest的测试发现结合起来?

我在https://docs.python.org/2/library/doctest.html上发现了一些关于如何做到这一点的信息,但并没有真正得到它。你能帮我用discover与我的doctests?

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() 
+5

pytest'现在被认为是Python测试的标准具,所以我建议检查一下。看起来它也支持doctests:http://doc.pytest.org/en/latest/doctest.html – yedpodtrzitko

让我们弄清楚发生了什么有

1)unittest.discovery

它不具备doctests的线索,因为doctests是一个不同的框架。 所以unittest是不应该发现框外的doctests。 这意味着你将需要手动

2)文档测试

它本质上是一个独立的框架,虽然它有一些胶粘类文档测试转换成单元测试样的TestCase粘合在一起他们。 https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

3)发现

没得到什么discover你的意思,我想这是

python -m unittest discover 

如果不和你谈论https://pypi.python.org/pypi/discover然后忘掉它 - 这是python早期版本的backport

4)怎么办

要么撒了很多load_tests钩在您的代码如下描述https://docs.python.org/2.7/library/doctest.html#unittest-api或代码的方法来收集所有拥有的这些模块在同一个地方,并将其转换成DocTestSuite [S] https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

但说实话这两种方法时下,使任何意义,因为它归结为:

$ py.test --doctest-modules 

$ nosetests --with-doctest 

当然coverage和大量的钟声&口哨也由这些框架提供,你可能会坚持单元测试。TestCase,你甚至不需要创建一个coverage_module所以我会深入其中的一个,而不是试图想出你自己的解决方案