什么是代码覆盖率的部分命中?
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'
最近,当我的项目从 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'