从谷歌搜索和实验,似乎python的coverage
库在其计算中不包括doctests。有没有办法让它这样做?
我搜索了文档(https://coverage.readthedocs.io/en/coverage-4.4.1/)并且没有提到doctests,但它似乎很奇怪,它不会有一些包含它们的方式我觉得我必须遗漏一些东西。
如果我是正确的并且覆盖范围不包括它们,我怎样才能测量我的测试覆盖率而不用unittest
将我的所有doctests改为单元测试(我不想这样做) ?
答案 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)