是否可以在Python中进行代码覆盖率断言?

Pet*_*vaz 6 python code-coverage coverage.py python-coverage

当我编写测试或调试代码时,我希望能够添加一行Python,如果该行从未执行过,它将通知我.这可能吗?

例如,我希望能够编写如下代码:

def f(x):
   if x==0:
      check_covered()
      return 1
   elif x==1:
      check_covered()
      return 2
   else:
      check_covered()
   return 3

f(1)
f(2)
print_all_missing_cases()
Run Code Online (Sandbox Code Playgroud)

我希望输出告诉我其中一个分支从未被覆盖过.

我试过的

方法1

我可以使用装饰器执行此操作,如下所示:

missing_fns = set()

def covered(h):
    missing_fns.add(h.func_name)
    def h2(*args):
        missing_fns.remove(h.func_name)
        return h(*args)
    return h2 

@covered
def f(a):
    return a+1

@covered
def g(a):
    return a+2

f(0)
for x in missing_fns:
    print x,'is never called'
Run Code Online (Sandbox Code Playgroud)

但我正在努力寻找在编译函数时激活的东西,我可以将其挂钩.

方法2

如果我将递增值传递给每个实例(例如check_covered(0),check_covered(1),check_covered(2),...),这也很简单,但是当我复制或删除代码时,这会变得很混乱.

方法3

可以通过运行代码覆盖率工具来获取此信息,但如果可能的话,我更愿意使用一些我有机会理解的简单Python代码来完成此操作.

f.r*_*ues 5

我强烈建议使用该coverage模块.

有一个很好的教程,如何在这里获得最好的结果

用法很简单:

$ coverage run my_program.py arg1 arg2
Run Code Online (Sandbox Code Playgroud)

比看到结果 coverage report

$ coverage report -m
Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program                   20      4    80%   33-35, 39
my_other_module              56      6    89%   17-23
-------------------------------------------------------
TOTAL                        76     10    87%
Run Code Online (Sandbox Code Playgroud)