測(cè)試的依賴關(guān)系

2018-02-24 15:41 更新

測(cè)試的依賴關(guān)系

單元測(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è)試方法。

  • 消費(fèi)者(consumer),是依賴于一個(gè)或多個(gè)生產(chǎn)者及其返回值的測(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)
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)