假設我在我的項目中的兩個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
現在我想寫一個包含foo()
的Class2的單元測試。
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()
和任何它的基礎功能。我們的報告展示了整個項目的精彩內容!將它發送給採購訂單,讓我們儘早週末吧!
雖然這是誤導。我真的想要報告顯示Class2
被覆蓋,因爲我們已經編寫了一個可靠地覆蓋模塊的單元測試。我不要希望它顯示Class1
被覆蓋,因爲我們沒有任何單元測試,檢查它的內部功能。它只是假設Class1
正常工作,如果單元測試失敗,它的描述將不會很有幫助,也不透明,如果Class1
是錯誤的。
因此,要簡化:
Class2
通過單元測試適當覆蓋Class1
有沒有直接覆蓋,並把該項目在風險- 當單元測試運行,並且代碼覆蓋率報告生成,它不正確地顯示都模塊以及測試
- 而是,我想報告顯示t帽子
Class2
覆蓋,爲foo()
明確由測試調用,Class1
不是蓋的,因爲它的功能範圍內Class2.foo()
這使我對以下問題稱爲:
- 是否有一個方法來防止在覆蓋報告中發生這種情況?
- 什麼,如果有的話,是用來指稱這種類型的覆蓋?
- 有沒有特定的編碼模式可以幫助防止這個問題?
謝謝!
您需要爲'class1.doEverythingAndGetData()'提供一個虛擬號碼。因此,'doEverythingAndGetData()'函數永遠不會被調用,它只是返回一個值。這叫做'unittest.mock' – martianwars