Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用doctest、覆盖率和并行性的Python测试发现_Python_Unit Testing_Discovery_Python Coverage - Fatal编程技术网

使用doctest、覆盖率和并行性的Python测试发现

使用doctest、覆盖率和并行性的Python测试发现,python,unit-testing,discovery,python-coverage,Python,Unit Testing,Discovery,Python Coverage,。。。还有一匹小马!不,说真的。我正在寻找一种方法来组织“正常工作”的测试。大多数东西都能工作,但不是所有的部分都能装配在一起。这就是我想要的: 自动发现测试。这包括博士学位。请注意,doctest的总和不能作为单个测试出现。(即不是py.test——doctest模块所做的) 能够并行运行测试。(类似于xdist中的py.test-n) 生成覆盖率报告 让python setup.py测试正常运行 我目前的方法包括测试目录和。包含的所有文件都命名为test.*.py。如果我创建一个包含以下

。。。还有一匹小马!不,说真的。我正在寻找一种方法来组织“正常工作”的测试。大多数东西都能工作,但不是所有的部分都能装配在一起。这就是我想要的:

  • 自动发现测试。这包括博士学位。请注意,doctest的总和不能作为单个测试出现。(即不是py.test——doctest模块所做的)
  • 能够并行运行测试。(类似于xdist中的py.test-n)
  • 生成覆盖率报告
  • 让python setup.py测试正常运行
我目前的方法包括
测试
目录和。包含的所有文件都命名为
test.*.py
。如果我创建一个包含以下内容的文件
test\u 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
这种方法还有一个好处,即可以使用setuptools并提供
设置(test_suite=“unittest2.collector”)

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

  • coverage.py希望运行脚本。所以我不能在这里使用unittest2发现
  • py.test不运行load_tests函数,因此它找不到doctests,
    --doctest modules
    选项是垃圾
  • nosetests运行
    load\u测试
    功能,但不提供任何参数。这似乎完全打破了一侧的鼻子

我怎样才能使事情比这更好地进行,或者解决上面的一些问题?

我使用nose,在遇到同样的问题时发现了您的问题

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

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

DocTestFailure: <DocTest mymodule1.myfunc from /path/to/mymodule1.py:63 (4 examples)>
DocTestFailure:

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

import doctest
from mypackage import mymodule

def test_doctest():
    results = doctest.testmod(mymodule)
    if results.failed:
        raise Exception(results)
在一个失败案例中,我最终得到的是打印的标准输出,您将从手动运行doctest中获得该输出,另外一个异常如下所示:

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

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

当它使用nose时,失败消息现在完全是废话。依我看,这是非常有用的。我认为这个解决方案不如现有的方案好。你的问题正是我想要的答案。:-)关于coverage.py:使用
coverage-m unittest2 discover应该可以工作(至少对于Py2.7中的
unittest
)。