2012-12-17 33 views
0

儘管我在單元測試中玩了一會兒,但我不能真正理解「單元」的概念,即單一功能。單元測試的概念,如果這些斷言被分解爲「單元」?

例如,我在newXxx形式測試組的魔術方法:

public function testMagicCreatorWithoutArgument() 
{ 
    $retobj = $this->hobj->newFoo(); 

    // Test that magic method sets the attribute 
    $this->assertObjectHasAttribute('foo', $this->hobj); 
    $this->assertInstanceOf(get_class($this->hobj), $this->hobj->foo); 

    // Test returned $retobj type 
    $this->assertInstanceOf(get_class($this->hobj), $retobj); 
    $this->assertNotSame($this->hobj, $retobj); 

    // Test parent property in $retobj 
    $this->assertSame($this->hobj, $retobj->getParent()); 
} 

正如你可以看到有三個斷言的「羣體」在這種測試方法。我是否應該將它們分成三種單一的測試方法,以便遵循「單元測試」原則?

分割會是這樣的:

public function testMagicCreatorWithoutArgumentSetsTheProperty() 
{ 
    $this->hobj->newFoo(); 

    $this->assertObjectHasAttribute('foo', $this->hobj); 
    $this->assertInstanceOf(get_class($this->hobj), $this->hobj->foo); 
} 

/** 
* @depends testMagicCreatorWithoutArgumentReturnsNewInstance 
*/ 
public function testMagicCreatorWithArgumentSetsParentProperty() 
{ 
    $retobj = $this->hobj->newFoo(); 

    $this->assertSame($this->hobj, $retobj->getParent()); 
} 

public function testMagicCreatorWithoutArgumentReturnsNewInstance() 
{ 
    $retobj = $this->hobj->newFoo(); 

    $this->assertInstanceOf(get_class($this->hobj), $retobj); 
    $this->assertNotSame($this->hobj, $retobj); 
} 
+1

根據我所理解的「單元測試」中的「單元」,指的是測試「單元」(作爲類和方法)與測試整個應用程序的對比。所以「單元」不需要你將它分成3種方法,但是確實需要你分離測試。 – zerkms

+0

@zerkms好吧,你認爲每個方法做出多個斷言是好的嗎? – gremo

+1

我沒有看到任何問題(我根據我的個人經驗和我讀過的內容來思考)。其實我會用完全相同的方式寫出來。儘可能多地使用 – zerkms

回答

4

您的測試方法,測試本:

$retobj = $this->hobj->newFoo(); 
在一個測試

,而這一次對象上執行多個斷言。這似乎並不合理。

如果您在一個測試中測試多個方法調用,我會更關心的。爲什麼?早期斷言會中止測試,不會對其他方法進行測試。在最好這意味着第二個方法並沒有進行測試,並在最壞它隱藏證據由第二測試顯示(證據可以幫助查明原因,或第一次失敗的範圍)

爲此,我儘量避免單元測試方法中的斷言太多。檢查一個空對象並不是不合理的,然後檢查(在同一個測試中)一個填充字段。儘管如此,我不會將這些斷言鏈接在一起,而是寧願有多個測試來測試同一個返回實體的不同功能。

和以往一樣,這裏有一定程度的實用性。

+0

「證據可以幫助確定首次失敗的原因或範圍」---和相反的觀點:一個小錯誤可能導致100次失敗測試的噪音。 – zerkms

+0

不知道你如何避免後者。你能澄清嗎? –

+0

我的意思是說多次測試有時候會造成更多的傷害而不是有用的,因爲如果他們測試的是緊密相關的東西 - 它們可能總是會失敗,因此會產生噪聲(如果您在單一測試方法中斷言,則不會產生噪聲) 。所以我同意你的答案:測試長度決定是一個實踐和經驗問題(這就是爲什麼我爲它+1了;-) – zerkms