W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
單元測(cè)試主要是作為一種良好實(shí)踐來(lái)編寫的,它能幫助開發(fā)人員識(shí)別并修復(fù) bug、重構(gòu)代碼,還可以看作被測(cè)軟件單元的文檔。要實(shí)現(xiàn)這些好處,理想的單元測(cè)試應(yīng)當(dāng)覆蓋程序中所有可能的路徑。一個(gè)單元測(cè)試通常覆蓋一個(gè)函數(shù)或方法中的一個(gè)特定路徑。但是,測(cè)試方法并不一定非要是一個(gè)封裝良好的獨(dú)立實(shí)體。測(cè)試方法之間經(jīng)常有隱含的依賴關(guān)系暗藏在測(cè)試的實(shí)現(xiàn)方案中。
--Adrian Kuhn et. al.
PHPUnit支持對(duì)測(cè)試方法之間的顯式依賴關(guān)系進(jìn)行聲明。這種依賴關(guān)系并不是定義在測(cè)試方法的執(zhí)行順序中,而是允許生產(chǎn)者(producer)返回一個(gè)測(cè)試基境(fixture)的實(shí)例,并將此實(shí)例傳遞給依賴于它的消費(fèi)者(consumer)們。
生產(chǎn)者(producer),是能生成被測(cè)單元并將其作為返回值的測(cè)試方法。
Example?2.2, “用 @depends
標(biāo)注來(lái)表達(dá)依賴關(guān)系”展示了如何用 @depends
標(biāo)注來(lái)表達(dá)測(cè)試方法之間的依賴關(guān)系。
Example?2.2.?用 @depends
標(biāo)注來(lái)表達(dá)依賴關(guān)系
<?php
class StackTest extends PHPUnit_Framework_TestCase
{
public function testEmpty()
{
$stack = array();
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testEmpty
*/
public function testPush(array $stack)
{
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* @depends testPush
*/
public function testPop(array $stack)
{
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
?>
在上例中,第一個(gè)測(cè)試, testEmpty()
,創(chuàng)建了一個(gè)新數(shù)組,并斷言其為空。隨后,此測(cè)試將此基境作為結(jié)果返回。第二個(gè)測(cè)試,testPush()
,依賴于 testEmpty()
,并將所依賴的測(cè)試之結(jié)果作為參數(shù)傳入。最后,testPop()
依賴于 testPush()
。
Note
默認(rèn)情況下,生產(chǎn)者所產(chǎn)生的返回值將“原樣”傳遞給相應(yīng)的消費(fèi)者。這意味著,如果生產(chǎn)者返回的是一個(gè)對(duì)象,那么傳遞給消費(fèi)者的將是一個(gè)指向此對(duì)象的引用。如果需要傳遞對(duì)象的副本而非引用,則應(yīng)當(dāng)用
@depends clone
替代@depends
。
為了快速定位缺陷,我們希望把注意力集中于相關(guān)的失敗測(cè)試上。這就是為什么當(dāng)某個(gè)測(cè)試所依賴的測(cè)試失敗時(shí),PHPUnit 會(huì)跳過(guò)這個(gè)測(cè)試。通過(guò)利用測(cè)試之間的依賴關(guān)系,缺陷定位得到了改進(jìn),如Example?2.3, “利用測(cè)試之間的依賴關(guān)系”中所示。
Example?2.3.?利用測(cè)試之間的依賴關(guān)系
<?php
class DependencyFailureTest extends PHPUnit_Framework_TestCase
{
public function testOne()
{
$this->assertTrue(FALSE);
}
/**
* @depends testOne
*/
public function testTwo()
{
}
}
?>
phpunit --verbose DependencyFailureTest
PHPUnit 5.0.0 by Sebastian Bergmann and contributors.
FS
Time: 0 seconds, Memory: 5.00Mb
There was 1 failure:
1) DependencyFailureTest::testOne
Failed asserting that false is true.
/home/sb/DependencyFailureTest.php:6
There was 1 skipped test:
1) DependencyFailureTest::testTwo
This test depends on "DependencyFailureTest::testOne" to pass.
FAILURES!
Tests: 1, Assertions: 1, Failures: 1, Skipped: 1.
測(cè)試可以使用多個(gè) @depends
標(biāo)注。PHPUnit 不會(huì)更改測(cè)試的運(yùn)行順序,因此你需要自行保證某個(gè)測(cè)試所依賴的所有測(cè)試均出現(xiàn)于這個(gè)測(cè)試之前。
擁有多個(gè) @depends
標(biāo)注的測(cè)試,其第一個(gè)參數(shù)是第一個(gè)生產(chǎn)者提供的基境,第二個(gè)參數(shù)是第二個(gè)生產(chǎn)者提供的基境,以此類推。參見Example?2.4, “有多重依賴的測(cè)試”
Example?2.4.?有多重依賴的測(cè)試
<?php
class MultipleDependenciesTest extends PHPUnit_Framework_TestCase
{
public function testProducerFirst()
{
$this->assertTrue(true);
return 'first';
}
public function testProducerSecond()
{
$this->assertTrue(true);
return 'second';
}
/**
* @depends testProducerFirst
* @depends testProducerSecond
*/
public function testConsumer()
{
$this->assertEquals(
array('first', 'second'),
func_get_args()
);
}
}
?>
phpunit --verbose MultipleDependenciesTest
PHPUnit 5.0.0 by Sebastian Bergmann and contributors.
...
Time: 0 seconds, Memory: 3.25Mb
OK (3 tests, 3 assertions)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: