我写了一个python脚本来自动为我做所有的测试,并生成一个HTML报告。前几天我发现discover
用于单元测试,它允许我在给定目录中运行所有单元测试而不明确命名它们,我真的希望能够以相同的方式执行我的doctests,而不是必须导入每个模块都明确。
我在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()
答案 0 :(得分:7)
让我们弄清楚那里发生了什么
1) unittest.discovery
它没有doctests的线索,因为doctests是一个不同的框架。
所以unittest
不应该发现开箱即用的doctests。
这意味着您需要手动将它们粘合在一起
2) doctest
它本质上是一个单独的框架,虽然它有一些粘合类可以将doctests转换为类似单元测试的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)该怎么做
在您的代码中分散了很多load_tests
个钩子,如https://docs.python.org/2.7/library/doctest.html#unittest-api所述,或者编写方法来收集您在一个地方拥有的所有模块并将它们转换为DocTestSuite [s] {{ 3}}
但老实说,现在这两种方法都没有任何意义,因为它归结为:
$ py.test --doctest-modules
或
$ nosetests --with-doctest
当然coverage
和许多钟声和&口哨也是由这些框架提供的,你可能会继续坚持使用unittest.TestCase,你甚至不需要创建一个 coverage_module 所以我会深入研究其中一个而不是试图想出来你自己的解决方案