什么是代码覆盖率的部分命中?

What is a partial hit in code coverage?

最近,当我的项目从 Coveralls 切换到 Codecov 时,覆盖率下降了几个百分点。这似乎是由于部分命中,这在 Coveralls 中被视为命中,但在 Codecov 中被视为未命中。

这是一个代码示例:

class Struct(object):                  # hit
    def __init__(self, content=None):  # hit            
        if content is not None:        # partial hit
            self.content = content     # missed

s = Struct()                           # hit

据我所知,if 语句完全由解释器求值。那为什么不算命中呢?

表示该行有分支语句,但其中一个分支从未执行。

从下一行可以明显看出,内容从未提供给该构造函数,因此您从未使用 Struct(content=something).

测试代码

另请注意,如果您不提供参数,则不会设置 self.content,因此如果尝试访问,将引发 AttributeError


虽然在这种情况下你可以从if中的语句推导出它,但真值是相反的,你看不到条件永远不会。再次考虑你的例子,稍作修改

class Struct(object):                  # hit
    def __init__(self, content=None):  # hit            
        if content is not None:        # partial hit
            self.content = content     # hit

    def print_content(self):           # hit
        print(self.content)            # hit

s = Struct('42')                       # hit
s.print_content()                      # hit

看起来一切都很好?如果你没有使用分支覆盖,if也会说"hit",你不会注意到在 content is not None False 的情况下,您从未测试过代码,这样就会出现未设置 self.content 属性的错误:以下程序:

s = Struct()
s.print_content()

当 运行 时,加注:

Traceback (most recent call last):
  File "foo.py", line 10, in <module>
    s.print_content()
  File "foo.py", line 7, in print_content
    print(self.content)
AttributeError: 'Struct' object has no attribute 'content'