使用doctest、覆盖率和并行性的Python测试发现
。。。还有一匹小马!不,说真的。我正在寻找一种方法来组织“正常工作”的测试。大多数东西都能工作,但不是所有的部分都能装配在一起。这就是我想要的:使用doctest、覆盖率和并行性的Python测试发现,python,unit-testing,discovery,python-coverage,Python,Unit Testing,Discovery,Python Coverage,。。。还有一匹小马!不,说真的。我正在寻找一种方法来组织“正常工作”的测试。大多数东西都能工作,但不是所有的部分都能装配在一起。这就是我想要的: 自动发现测试。这包括博士学位。请注意,doctest的总和不能作为单个测试出现。(即不是py.test——doctest模块所做的) 能够并行运行测试。(类似于xdist中的py.test-n) 生成覆盖率报告 让python setup.py测试正常运行 我目前的方法包括测试目录和。包含的所有文件都命名为test.*.py。如果我创建一个包含以下
- 自动发现测试。这包括博士学位。请注意,doctest的总和不能作为单个测试出现。(即不是py.test——doctest模块所做的)
- 能够并行运行测试。(类似于xdist中的py.test-n)
- 生成覆盖率报告
- 让python setup.py测试正常运行
测试
目录和。包含的所有文件都命名为test.*.py
。如果我创建一个包含以下内容的文件test\u doctests.py
,这就使得python-m unittest discover
可以正常工作
import doctest
import mymodule1, mymodule2
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(mymodule1))
tests.addTests(doctest.DocTestSuite(mymodule2))
return tests
这种方法还有一个好处,即可以使用setuptools并提供设置(test_suite=“unittest2.collector”)
然而,这种方法存在一些问题
- coverage.py希望运行脚本。所以我不能在这里使用unittest2发现
- py.test不运行load_tests函数,因此它找不到doctests,
选项是垃圾--doctest modules
- nosetests运行
功能,但不提供任何参数。这似乎完全打破了一侧的鼻子load\u测试
我怎样才能使事情比这更好地进行,或者解决上面的一些问题?我使用nose,在遇到同样的问题时发现了您的问题 我最终得到的结果并不漂亮,但它确实运行了测试
import doctest
import mymodule1, mymodule2
def test_mymodule1():
assert doctest.testmod(mymodule1, raise_on_error=True)
def test_mymodule2():
assert doctest.testmod(mymodule2, raise_on_error=True)
不幸的是,它将模块中的所有doctest作为单个测试运行。但如果事情出了差错,至少我知道从哪里开始寻找。失败将导致DocTestFailure,并显示一条有用的消息:
DocTestFailure: <DocTest mymodule1.myfunc from /path/to/mymodule1.py:63 (4 examples)>
DocTestFailure:
这是一个老问题,但对于我们中的一些人来说,这个问题仍然存在!我刚刚研究了一下,找到了一个类似于kaapstorm的解决方案,但输出更好。我使用py.test
来运行它,但我认为它应该在测试运行程序之间兼容:
import doctest
from mypackage import mymodule
def test_doctest():
results = doctest.testmod(mymodule)
if results.failed:
raise Exception(results)
在一个失败案例中,我最终得到的是打印的标准输出,您将从手动运行doctest中获得该输出,另外一个异常如下所示:
Exception: TestResults(failed=1, attempted=21)
正如kaapstrom所提到的,它不能正确地计算测试(除非有失败),但我发现如果覆盖率很高的话,它就不值得这么做:)当它使用nose时,失败消息现在完全是废话。依我看,这是非常有用的。我认为这个解决方案不如现有的方案好。你的问题正是我想要的答案。:-)关于coverage.py:使用
coverage-m unittest2 discover应该可以工作(至少对于Py2.7中的unittest
)。