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

标签 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()

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

我尝试过的

方法一

我可以按如下方式使用装饰器对函数执行此操作:

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/

相关文章:

code-coverage - 工作服不适用于 Appveyor

python - Django 覆盖 ModuleNotFoundError : No module named 'django_extensions'

python 在永无止境的进程上运行覆盖

python - pytest 覆盖率 - 一行的命中数

python - Python 中的 "thread local storage"是什么,我为什么需要它?

python - 在 matplotlib 中绘制矢量化文本文档?

java - Android:Java 与 Python

python - 如何在python中实现一个好的__hash__函数

.net - OpenCover 未涵盖实际源代码

node.js - 使用 Q promises 的 node.js 项目的代码覆盖率