【发布时间】:2017-04-01 22:34:50
【问题描述】:
假设我的项目中有两个 Python 模块:
/project
/module1
__init__.py [Empty]
class1.py
/module2
__init__.py [Empty]
class2.py
Class1 有一些功能,但最重要的是doEverythingAndGetData()。让我们假设它在执行几个内部函数时返回一个数字。
现在假设Class2 使用Class1,然后实现了进一步的功能。 Class2 只有两个功能 - __init__ 和 foo()。
def foo(self):
#Create an instance of Class1
class1 = Class1()
#Get some information using class1
data = class1.doEverythingAndGetData()
#Do some logic on the data, it doesn't matter
result = (data + 10) * 2
#Return the result
return result
现在我想为 Class2 编写一个单元测试,涵盖 foo()。
def test_Class2_foo():
#Create the Class2 object
class2 = Class2()
#Get the result
bar = class2.foo()
#Compare the value
expectedBar = 1337
assert expectedBar == bar, "Mismatch! {} != {}".format(expectedBar, bar)
这个单元测试是为项目编写的唯一一个。我们运行单元测试并生成代码覆盖率报告。
检查代码覆盖率报告后,我们将看到Class2 被很好地覆盖,因为我们已经进行了单元测试并且它正在做它应该做的事情。太棒了!
然而,我们也注意到Class1 也被很好地覆盖,因为单元测试也 覆盖了class1.doEverythingAndGetData() 及其任何底层功能。我们的报告显示了整个项目的精彩报道!将它发送给 PO,让我们早日度过一个周末!
虽然这具有误导性。我真正希望报告显示的是 Class2 被覆盖,因为我们已经编写了一个可靠地覆盖模块的单元测试。我不希望它显示 Class1 被覆盖,因为我们没有任何单元测试来检查它的内部功能。它只是假设 Class1 工作正常,如果单元测试失败,如果 Class1 出错,它的描述将不会很有帮助也不透明。
所以,为了简化:
-
Class2已通过单元测试适当覆盖 -
Class1没有直接覆盖,使项目面临风险 - 运行单元测试并生成代码覆盖率报告时,它错误地显示两个模块都经过测试
- 相反,我希望报告显示
Class2被覆盖,因为foo()被测试显式调用,而Class1未被覆盖,因为它的函数在Class2.foo()中被调用
这导致我提出以下问题:
- 有没有办法防止在报道报告中发生这种情况?
- 如果有的话,用什么术语来指代这种类型的保险?
- 是否有特定的编码模式有助于防止此问题?
谢谢!
【问题讨论】:
-
您需要向
class1.doEverythingAndGetData()提供一个假号码。因此,doEverythingAndGetData()函数永远不会被调用,它只是返回一个值。这称为unittest.mock
标签: python unit-testing report code-coverage