Skip to main content
 首页 » 编程设计

python之让 Python 的 coverage.py 收集导入它的模块的覆盖率

2025年05月04日9qlqwjy

我一直在玩弄 coverage.py,但似乎无法让它为 __main__ 模块收集覆盖率。

我在 Windows 上,喜欢使用 IDLE 破解脚本。 edit-hit-F5 循环非常方便、快速且有趣。不幸的是,coverage.py 似乎无法(或不愿意)收集主模块的覆盖率——在下面的代码中,它报告没有收集到任何数据。我的代码如下所示:

import coverage 
cov = coverage.coverage() 
cov.start() 
 
def CodeUnderTest(): 
  print 'do stuff' 
  return True 
 
assert CodeUnderTest() 
 
cov.stop() 
cov.save() 
cov.html_report() 

有人有什么想法吗?我尝试了各种覆盖选项,但无济于事。 IDLE 创建的环境似乎对覆盖不是很友好,因为 sys.modules['__main__'] 指向一个 idle.pyw 文件,而不是它正在运行的文件。

请您参考如下方法:

你没有说你看到了什么行为,但我希望 CodeUnderTest 中的两行显示为已覆盖,但文件中的其他行都没有。 Coverage.py 无法衡量在它开始之前发生的执行情况,并且在这里直到模块执行之后它才开始。例如,import coverage 行在覆盖开始时已经执行。此外,一旦开始覆盖,直到下一个函数调用才真正开始测量。

运行 coverage.py 的最简单方法是从命令行使用它。这样,您就知道它会尽早开始:

$ coverage run my_prog.py arg1 arg2 ... 

如果您必须以编程方式使用它,请安排您的文件,以便您感兴趣的所有执行都发生在覆盖开始后调用的函数内。