使用Pytest-cov时未检测到类属性覆盖的问题求助
问题:pytest-cov未检测到类属性的覆盖
我定义了如下Toto类:
class Toto: me = 0 def good(self): return "OK"
使用pytest及pytest-cov插件执行测试,测试用例如下:
def test_attr_class(): assert Toto.me == 0 # True assert Toto().good() == "OK"
测试脚本执行正常,但coverage未检测到Toto类中的me属性覆盖,请问问题出在哪里?
原因分析
coverage工具的核心是追踪可执行代码语句的执行路径,类体中的属性静态赋值(比如me = 0)不属于它默认统计的“可执行语句”范畴。你在测试中访问Toto.me只是读取该属性的值,并没有触发任何和这个属性定义相关的可执行代码逻辑,因此pytest-cov不会将其标记为“已覆盖”。
验证与解决思路
如果需要让类属性的赋值逻辑被coverage统计,可以把属性的初始化逻辑放到可执行的代码块中,比如类方法或者__init__方法里:
方案1:移至实例初始化方法
class Toto: def __init__(self): self.me = 0 # 此处赋值属于可执行语句,会被coverage统计 def good(self): return "OK"
方案2:用类方法初始化类属性
class Toto: me = 0 @classmethod def init_class_attr(cls): cls.me = 0 # 此处赋值会被coverage统计 def good(self): return "OK"
测试时调用Toto.init_class_attr(),coverage就会记录这个方法内的赋值语句被执行。
内容的提问来源于stack exchange,提问作者general03
相关产品推荐
相关产品推荐

