如何将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()
让我们弄清楚发生了什么有
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所以我会深入其中的一个,而不是试图想出你自己的解决方案
pytest'现在被认为是Python测试的标准具,所以我建议检查一下。看起来它也支持doctests:http://doc.pytest.org/en/latest/doctest.html – yedpodtrzitko