如何使python的覆盖库包括doctests

时间:2017-07-23 05:22:28

标签: python testing python-import doctest coverage.py

从谷歌搜索和实验,似乎python的coverage库在其计算中不包括doctests。有没有办法让它这样做?

我搜索了文档(https://coverage.readthedocs.io/en/coverage-4.4.1/)并且没有提到doctests,但它似乎很奇怪,它不会有一些包含它们的方式我觉得我必须遗漏一些东西。

如果我是正确的并且覆盖范围不包括它们,我怎样才能测量我的测试覆盖率而不用unittest将我的所有doctests改为单元测试(我不想这样做) ?

2 个答案:

答案 0 :(得分:2)

可以想到两种方式,要么自己导入模块,要么从另一个模块加载模块。

让模块自行导入

在档案a.py中:

def linear(a, b):
    ''' Solve ax + b = 0

        >>> linear(3, 5)
        -1.6666666666666667

    '''
    if a == 0 and b != 0:
        raise ValueError('No solutions')
    return -b  / a

if __name__ == '__main__':
    import doctest
    import a

    print(doctest.testmod(a))

在命令行:

$ coverage run a.py
$ coverage annotate
$ cat a.py,cover

这会产生:

> def linear(a, b):
>     ''' Solve ax + b = 0

>         >>> linear(3, 5)
>         -1.6666666666666667

>     '''
>     if a == 0 and b != 0:
!         raise ValueError('No solutions')
>     return -b  / a

> if __name__ == '__main__':
>     import doctest
>     import a

>     print(doctest.testmod(a))

从单独的模块运行测试

或者,您可以将导入和 testmod()移出a.py并将它们放在单独的模块中。

在档案b.py

import doctest
import a

print(doctest.testmod(a))

在命令行:

$ coverage run b.py
$ coverage annotate
$ cat a.py,cover

这会产生:

> def linear(a, b):
>     ''' Solve ax + b = 0

>         >>> linear(3, 5)
>         -1.6666666666666667

>     '''
>     if a == 0 and b != 0:
!         raise ValueError('No solutions')
>     return -b  / a

答案 1 :(得分:-1)

模块的doctests可以转换为unittest的测试套件

import mymodule
suite = doctest.DocTestSuite(mymodule)