Python unittest分支覆盖似乎错过了zip

时间:2016-02-10 14:24:01

标签: python unit-testing code-coverage python-coverage

我不太明白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行仅部分覆盖({1}}在CLI输出上,“n↛exit[?]”在漂亮HTML报告)。

返回的dict清楚地打印出来,并且使用空列表执行仍会产生未覆盖的行。

我是否误解了覆盖范围输出?这闻起来像臭虫吗?

Python 3.5.1,Coverage 4.0.3

1 个答案:

答案 0 :(得分:3)

我已经对此进行了进一步调查,我认为这不是一个覆盖范围内的错误。当第一个生成器(c)终止时,zip()有效地不会从第二个生成器(d)收集更多值,因此分支覆盖率不会跟踪d运行完成,即使实际提取了每个元素。

如果您改为写:

def f(a, b):
    c = (i for i in a)
    d = tuple(j for j in b)  # Line of interest
    return dict(zip(c, d))

print(f(['a', 'b'], [1, 2]))

正如人们所期望的那样,即使输出相同,第二台发电机也会完成并且覆盖范围很快。

我不认为这有一个简单的方法,即使你把生成器表达式写成包含相同for循环的生成器函数,你得到一个(稍微更清楚)错误,执行从未跳过功能退出。

我认为这只是覆盖范围的限制和发电机的退出条件,因为它无法知道发电机是否应该退出,因此它会标记未覆盖的情况。