...还有一匹小马!不,认真的。我正在寻找一种组织“有效”测试的方法。大多数事情确实有效,但并非所有部分都能组合在一起。所以这就是我想要的:
- 自动发现测试。这包括 doctests。请注意,doctest 的总和不得作为单个测试出现。 (即不是 py.test --doctest-modules 所做的)
- 能够并行运行测试。 (类似于 xdist 中的 py.test -n)
- 生成覆盖率报告。
- 使
python setup.py test
正常工作。
我当前的方法涉及一个tests
目录和load_tests protocol .包含的所有文件都命名为 test_*.py
。如果我创建一个包含以下内容的文件 test_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
这种方法还有一个好处,那就是可以使用设置工具并提供 setup(test_suite="unittest2.collector")
。
但是这种方法有一些问题。
- coverage.py 期望运行一个脚本。所以我不能在这里使用 unittest2 发现。
- py.test 不运行 load_tests 函数,因此它找不到 doctests 并且
--doctest-modules
选项是废话。 - nosetests 运行
load_tests
函数,但不提供任何参数。这看起来在 Nose 的一侧完全坏了。
我怎样才能使事情比这更好地工作或解决上面的一些问题?
最佳答案
这是一个老问题,但这个问题对我们中的一些人来说仍然存在!我刚刚完成它并找到了一个类似于 kaapstorm 的解决方案,但输出更好。我使用 py.test
来运行它,但我认为它应该在测试运行器之间兼容:
import doctest
from mypackage import mymodule
def test_doctest():
results = doctest.testmod(mymodule)
if results.failed:
raise Exception(results)
在失败情况下,我最终得到的是手动运行 doctest 时打印的 stdout 输出,还有一个额外的异常,如下所示:
Exception: TestResults(failed=1, attempted=21)
正如 kaapstrom 所提到的,它没有正确计算测试(除非有失败),但我发现如果覆盖率很高的话,这并不值得:)
关于具有 doctests、覆盖率和并行性的 Python 测试发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16982514/