9

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

  • 自动发现测试。这包括文档测试。请注意,doctest 的总和不得作为单个测试出现。(即不是 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

这种方法还有一个好处是可以使用 setuptools 和 supply setup(test_suite="unittest2.collector")

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

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

我怎样才能让事情比这更好地工作或解决上面的一些问题?

4

2 回答 2

2

这是一个老问题,但对于我们中的一些人来说,这个问题仍然存在!我只是在研究它,并找到了一个类似于 kaapstorm 的解决方案,但输出要好得多。我曾经py.test运行它,但我认为它应该在测试运行器之间兼容:

import doctest
from mypackage import mymodule

def test_doctest():
    results = doctest.testmod(mymodule)
    if results.failed:
        raise Exception(results)

在失败情况下,我最终得到的是打印的 stdout 输出,您可以通过手动运行 doctest 获得,另外还有一个如下所示的异常:

Exception: TestResults(failed=1, attempted=21)

正如 kaapstrom 所提到的,它没有正确计算测试(除非有失败),但我发现这并不值得,只要覆盖率高 :)

于 2015-12-16T03:11:47.457 回答
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)

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

DocTestFailure: <DocTest mymodule1.myfunc from /path/to/mymodule1.py:63 (4 examples)>
于 2013-12-10T13:30:51.993 回答