2011-04-19 249 views
2

假設我正在使用一個名爲Animal的框架。單元測試:測試父對象方法有意義嗎?

class Animal(object): 
    def speak(self): 
     logging.info(self.sound) 

我要繼承這個對象爲了使用它,它可能是這個樣子:

class Dog(Animal): 
    def __init__(self): 
     self.sound = 'Woof Woof' 

我看到它,我可以做兩件事情的方式。第一個是這樣的:

dog = Dog() 
assert dog.sound == 'Woof Woof' 

第二個選項是模擬出logging.info並檢查它是否被調用。我對他們兩人有着複雜的感受。

第一個感覺就像我只是測試我的配置,第二個感覺就像我沒有真正測試我想要的對象。

我使用這個簡單的例子,因爲也許那些不使用Django的人可以給我一些指針。我遇到的真正問題涉及Django通用視圖。

例如,我可以有這個模板視圖:

class HomeView(TemplateView): 
    template_name = 'home.html' 

難道我只是測試,如果TEMPLATE_NAME具有正確的價值還是我使用測試客戶端做一個更高的水平測試,測試的完整視圖?

回答

5

不,請確保父對象已正確測試(必要時模仿)並分別測試子對象方法。這符合封裝的概念(使本地事情變得重要)。

如果你不這樣做,一個包含很多類的大型項目會耗盡你所有的編碼資源,因爲沒有附加價值。

+0

所以你說我應該兩個都做? – Pickels 2011-04-19 20:18:51

+0

@皮克爾:是的。分別測試父母和孩子。 – 2011-04-19 20:20:29

+0

我開始回答這個問題,但被退出了。我同意你的回答,但只是爲了闡述。當我們測試孩子課時,你的問題可以改寫爲:我應該測試從父類派生的功能。 如果我的理解是正確的,那麼你需要確保所有的組件都經過測試。因此,有一個父類的測試用例和一個用於子類的測試用例。您不需要在子項中測試父項功能,除非您的功能過載。 – 2011-04-19 20:20:49

3

在你的簡單例子中,我可能會測試父方法。但在你的Django案例中,這將意味着測試Django。這不是你的工作! ;-)對我來說,這是單元測試的重大問題之一:不要測試其他人的代碼或第三部分庫。確保你的部分是正確的。聽起來很明顯,但在現實生活中並不那麼容易 - 至少在我的經驗中。

1

您顯示的測試是完全正確的 - 您在測試中重複字符串文字'Woof Woof'

你可以有一個類似的測試Animal

animal = Animal() 
animal.sound = 'sound' 
animal.speak() 
# test that detects log contains 'sound' 

你也可以有一個測試,採取動物名單,如[Dog, Cat, ...]並檢測每個實例講它的聲音。

for animalClass in AnimalList: 
    animal = animalClass() 
    animal.speak() 
    # test that detects log contains animal.sound