Python测试发现与doctest、coverage和parallelism

2024-09-25 00:34:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 自动发现测试。这包括医生考试。注意,doctest的总和不能作为单个测试出现。(即不是什么py.测试--doctest模块需要)
  • 能够并行运行测试。(有点像py.测试-n来自xdist)
  • 生成覆盖率报告。在
  • 使python setup.py test正常工作。在

我当前的方法涉及tests目录和load_tests protocol。包含的所有文件都命名为test_*.py。如果我用下面的内容创建一个文件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并提供setup(test_suite="unittest2.collector")。在

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

  • 在覆盖率.py期望运行脚本。所以我不能在这里使用unittest2发现。在
  • 在py.测试不运行加载测试函数,因此它找不到doctests,--doctest-modules选项是垃圾。在
  • nosetests运行load_tests函数,但不提供任何参数。鼻子侧面看起来完全断了。在

我怎样才能让事情变得更好呢?或者解决上面的一些问题?在


Tags: 文件方法pytestimportsetup覆盖率load
2条回答

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

我最后要做的并不漂亮,但它确实能运行测试。在

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,并显示一条有用的消息:

^{pr2}$

这是一个老问题,但这个问题对我们中的一些人来说仍然存在!我正在研究它,找到了一个类似于kaapstorm的解决方案,但是输出效果更好。我使用py.test来运行它,但我认为它应该在测试运行程序之间兼容:

import doctest
from mypackage import mymodule

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

在失败的情况下,我最后得到的是手动运行doctest将得到的打印stdout输出,但还有一个异常,如下所示:

^{pr2}$

正如kaapstrom所提到的,它不能正确地计算测试(除非有失败),但是我发现如果覆盖率恢复到很高的水平,这是不值得的:)

相关问题 更多 >