烧瓶测试 - 为啥覆盖不包括导入语句和装饰器?
Posted
技术标签:
【中文标题】烧瓶测试 - 为啥覆盖不包括导入语句和装饰器?【英文标题】:Flask Testing - why does coverage exclude import statements and decorators?烧瓶测试 - 为什么覆盖不包括导入语句和装饰器? 【发布时间】:2015-06-09 13:16:01 【问题描述】:我的测试清楚地执行了每个功能,也没有未使用的导入。然而,根据覆盖率报告,62% 的代码从未在以下文件中执行:
谁能指出我做错了什么?
这是我初始化测试套件和覆盖范围的方法:
cov = coverage(branch=True, omit=['website/*', 'run_test_suite.py'])
cov.start()
try:
unittest.main(argv=[sys.argv[0]])
except:
pass
cov.stop()
cov.save()
print "\n\nCoverage Report:\n"
cov.report()
print "html version: " + os.path.join(BASEDIR, "tmp/coverage/index.html")
cov.html_report(directory='tmp/coverage')
cov.erase()
【问题讨论】:
【参考方案1】:这是coverage.py FAQ中的第三个问题:
问:为什么函数(或类)的主体显示为已执行,但是 def 行没有?
发生这种情况是因为在函数完成后才开始覆盖 定义。定义行在没有覆盖的情况下执行 测量,然后开始覆盖,然后调用函数。 这意味着身体被测量,但功能的定义 本身不是。
要解决此问题,请尽早开始覆盖。如果您使用命令行 在覆盖范围内运行您的程序,那么您的整个程序将是 被监控。如果您使用 API,则需要调用 coverage.start() 在导入定义函数的模块之前。
最简单的做法是在覆盖范围内运行测试:
$ coverage run -m unittest discover
您的自定义测试脚本并没有超出覆盖命令行的功能,使用命令行会更简单。
【讨论】:
【参考方案2】:要排除导入语句,您可以在 .coveragerc 中添加以下行
[report]
exclude_lines =
# Ignore imports
from
import
但是当我尝试为装饰器添加'@'时,装饰器范围内的源代码被排除在外。覆盖率是错误的。 可能还有其他一些方法可以排除装饰器。
【讨论】:
以上是关于烧瓶测试 - 为啥覆盖不包括导入语句和装饰器?的主要内容,如果未能解决你的问题,请参考以下文章