如何让Python的coverage.py收集导入模块的覆盖率?
我最近在玩一个叫做coverage.py的工具,但我就是无法让它收集到__main__
模块的覆盖率数据。
我在Windows系统上,喜欢用IDLE来编写脚本。每次编辑完代码按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()
有没有人有什么想法?我尝试了各种coverage的选项,但都没有效果。看起来IDLE创建的环境对coverage不太友好,因为sys.modules['__main__']
指向的是一个idle.pyw文件,而不是它正在运行的文件。
1 个回答
1
你没有说你遇到了什么情况,但我预计在CodeUnderTest中的两行代码会被标记为已覆盖,而文件中的其他行则不会。因为Coverage.py无法测量在它启动之前执行的代码,而在这里,它是在模块执行完后才启动的。例如,import coverage
这一行在coverage启动时已经执行过了。此外,一旦coverage启动,真正的测量要等到下一个函数调用才开始。
运行coverage.py最简单的方法是通过命令行来使用。这样你可以确保它尽早启动:
$ coverage run my_prog.py arg1 arg2 ...
如果你必须以编程方式使用它,确保你的文件安排得当,让你感兴趣的所有执行都发生在一个在coverage启动后被调用的函数内部。