具有 doctests、覆盖率和并行性的 Python 测试发现

标签 python unit-testing discovery python-coverage

...还有一匹小马!不,认真的。我正在寻找一种组织“有效”测试的方法。大多数事情确实有效,但并非所有部分都能组合在一起。所以这就是我想要的:

  • 自动发现测试。这包括 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/

相关文章:

java - JMockit:如何在使用@Tested 注释时调试测试?

java - 如何发现给定接口(interface)背后的 NAT 类型

ios4 - 确定应用程序是否存在并在 iOS 上启动该应用程序

python - 如何在没有列名或行名的情况下选择 Pandas 中的列和行?

python - 如何在测试中为多个函数重用相同的模拟

.net - Linq 单元测试套件

由 C# 网络发现

python - 单击 QDockWidget 的选项卡时的通知?

长时间运行后python脚本崩溃

python - 在 Python 中从 SNMP 端口获取数据