我不太明白Python的分支覆盖统计数据试图告诉我什么 . 给出表单的代码
def f(a, b):
c = (i for i in a)
d = (j for j in b) # Line of interest
return dict(zip(c, d))
print(f(['a', 'b'], [1, 2]))
在单元测试期间导入的,Python的标准分支覆盖率告诉我 # Line of interest
行仅部分覆盖(CLI输出 n->-n
,漂亮的html报告中"n ↛ exit [?]") .
返回的dict清楚地打印出来,并且使用空列表执行仍会产生未覆盖的行 .
我是否误解了覆盖范围输出?这闻起来像臭虫吗?
Python 3.5.1,Coverage 4.0.3
1 回答
我认为这是一个覆盖范围内的错误 . 当第一个生成器(
c
)终止时,zip()
有效地不会从第二个生成器(d
)中收集更多值,因此即使实际提取了每个元素,分支覆盖也不会跟踪d
作为运行完成 .如果你反而写:
正如人们所期望的那样,即使输出相同,第二台发电机也会完成并且覆盖范围很快 .
我不认为这有一个简单的方法,即使你把生成器表达式写成包含相同for循环的生成器函数,你得到一个(稍微更清楚)错误,执行永远不会跳转到函数exit .
我认为这只是覆盖范围的限制和发电机的退出条件,因为它无法知道发电机是否应该退出,因此它标记了未覆盖的情况 .