使用doctests,coverage和parallelism进行Python测试发现

Hel*_*hne 7 python unit-testing discovery python-coverage

......还有一匹小马!不,真的.我正在寻找一种方法来组织"正常工作"的测试.大多数事情都有效,但并非所有部分都适合.所以这就是我想要的:

  • 自动发现测试.这包括doctests.请注意,doctests的总和不得显示为单个测试.(即不是py.test --doctest-modules所做的)
  • 能够并行运行测试.(像xdist中的py.test -n之类的东西)
  • 生成覆盖率报告.
  • 做好python setup.py test工作.

我目前的方法涉及tests目录和load_tests协议.包含的所有文件都命名为test_*.py.python -m unittest discover如果我test_doctests.py使用以下内容创建文件,这只会起作用.

import doctest
import mymodule1, mymodule2
def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(mymodule1))
    tests.addTests(doctest.DocTestSuite(mymodule2))
    return tests
Run Code Online (Sandbox Code Playgroud)

这种方法也有可以使用setuptools和供应的好处setup(test_suite="unittest2.collector").

然而,这种方法存在一些问题.

  • coverage.py希望运行一个脚本.所以我不能在这里使用unittest2发现.
  • py.test不运行load_tests函数,因此它找不到doctests而且--doctest-modules选项是crap.
  • nosetests运行load_tests函数,但不提供任何参数.这看起来完全打破了鼻子的一面.

如何让事情比这更好或解决上面的一些问题?

kaa*_*orm 1

我用鼻子,当我遇到同样的问题时发现你的问题。

我最终得到的结果并不漂亮,但它确实运行了测试。

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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它将模块中的所有文档测试作为单个测试运行。但如果出现问题,至少我知道从哪里开始寻找。失败会导致 DocTestFailure,并显示一条有用的消息:

DocTestFailure: <DocTest mymodule1.myfunc from /path/to/mymodule1.py:63 (4 examples)>
Run Code Online (Sandbox Code Playgroud)