当我编写测试或调试代码时,我希望能够添加一行 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()
我希望输出告诉我其中一个分支从未被覆盖。
我尝试过的
方法一
我可以按如下方式使用装饰器对函数执行此操作:
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'
但我正在努力寻找在我能够 Hook 的函数编译期间激活的东西。
方法二
如果我将递增的值传递给每个实例(例如 check_covered(0)、check_covered(1)、check_covered(2)...),这也非常简单,但是当我复制或删除代码时,这会变得困惑。
方法三
可以通过运行代码覆盖工具来获取此信息,但如果可能的话,我更愿意使用一些我有机会理解的简单 Python 代码来执行此操作。
最佳答案
我强烈推荐使用 coverage
模块。
有一个关于如何获得最佳结果的很好的教程 here
用法很简单:
$ coverage run my_program.py arg1 arg2
然后使用覆盖率报告
查看结果
$ 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%
关于python - 是否可以在 Python 中进行代码覆盖断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32289376/