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

我搜索了文档 ( https://coverage.readthedocs.io/en/coverage-4.4.1/ ) 并没有发现 doctests,但它似乎很奇怪,它没有某种方式包含它们,我觉得我一定错过了一些东西。

如果我是对的并且覆盖率不包括它们,我怎样才能在不将所有 doctests 更改为带有 unittest 的单元测试的情况下测量我的测试覆盖率(我不想这样做)?

最佳答案

想到了两种方法,要么让模块自己导入,要么从另一个模块加载模块。

让模块自行导入

在文件 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

关于python - 如何让python的覆盖库包含doctests,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45261772/

10-13 03:07