从谷歌搜索和实验来看,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/