4. 基境(fixture)

2018-02-23 16:23 更新

第 4 章?基境(fixture)

在編寫測試時,最費時的部分之一是編寫代碼來將整個場景設(shè)置成某個已知的狀態(tài),并在測試結(jié)束后將其復(fù)原到初始狀態(tài)。這個已知的狀態(tài)稱為測試的 基境(fixture)。

Example?2.1, “用 PHPUnit 測試數(shù)組操作”中,基境十分簡單,就是存儲在 $stack 變量中的數(shù)組。然而,絕大多數(shù)時候基境均遠(yuǎn)比一個簡單數(shù)組要復(fù)雜,用于建立基境的代碼量也會隨之增長。測試的真正內(nèi)容就被淹沒于建立基境帶來的干擾中。當(dāng)編寫多個需要類似基境的測試時這個問題就變得更糟糕了。如果沒有來自于測試框架的幫助,就不得不在寫每一個測試時都將建立基境的代碼重復(fù)一次。

PHPUnit 支持共享建立基境的代碼。在運(yùn)行某個測試方法前,會調(diào)用一個名叫 setUp() 的模板方法。setUp() 是創(chuàng)建測試所用對象的地方。當(dāng)測試方法運(yùn)行結(jié)束后,不管是成功還是失敗,都會調(diào)用另外一個名叫 tearDown() 的模板方法。tearDown() 是清理測試所用對象的地方。

Example?2.2, “用 @depends 標(biāo)注來表達(dá)依賴關(guān)系”中,我們在測試之間運(yùn)用生產(chǎn)者-消費者關(guān)系來共享基境。這并非總是預(yù)期的方式,甚至有時是不可能的。Example?4.1, “用 setUp() 建立棧的基境”展示了另外一個編寫測試 StackTest 的方式。在這個方式中,不再重用基境本身,而是重用建立基境的代碼。首先聲明一個實例變量,$stack,用來替代方法內(nèi)的局部變量。然后把 array 基境的建立放到 setUp() 方法中。最后,從測試方法中去除冗余代碼,在 assertEquals() 斷言方法中使用新引入的實例變量 $this->stack替代方法內(nèi)的局部變量 $stack。

Example?4.1.?用 setUp() 建立棧的基境

<?php
class StackTest extends PHPUnit_Framework_TestCase
{
    protected $stack;

    protected function setUp()
    {
        $this->stack = array();
    }

    public function testEmpty()
    {
        $this->assertTrue(empty($this->stack));
    }

    public function testPush()
    {
        array_push($this->stack, 'foo');
        $this->assertEquals('foo', $this->stack[count($this->stack)-1]);
        $this->assertFalse(empty($this->stack));
    }

    public function testPop()
    {
        array_push($this->stack, 'foo');
        $this->assertEquals('foo', array_pop($this->stack));
        $this->assertTrue(empty($this->stack));
    }
}
?>

測試類的每個測試方法都會運(yùn)行一次 setUp()tearDown() 模板方法(同時,每個測試方法都是在一個全新的測試類實例上運(yùn)行的)。

另外,setUpBeforeClass()tearDownAfterClass() 模板方法將分別在測試用例類的第一個測試運(yùn)行之前和測試用例類的最后一個測試運(yùn)行之后調(diào)用。

下面這個例子中展示了測試用例類中所有可用的模板方法。

Example?4.2.?展示所有可用模板方法的例子

<?php
class TemplateMethodsTest extends PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function setUp()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function assertPreConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public function testOne()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(TRUE);
    }

    public function testTwo()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(FALSE);
    }

    protected function assertPostConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function tearDown()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public static function tearDownAfterClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function onNotSuccessfulTest(Exception $e)
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        throw $e;
    }
}
?>
phpunit TemplateMethodsTest

PHPUnit 5.0.0 by Sebastian Bergmann and contributors.

TemplateMethodsTest::setUpBeforeClass
TemplateMethodsTest::setUp
TemplateMethodsTest::assertPreConditions
TemplateMethodsTest::testOne
TemplateMethodsTest::assertPostConditions
TemplateMethodsTest::tearDown
.TemplateMethodsTest::setUp
TemplateMethodsTest::assertPreConditions
TemplateMethodsTest::testTwo
TemplateMethodsTest::tearDown
TemplateMethodsTest::onNotSuccessfulTest
FTemplateMethodsTest::tearDownAfterClass

Time: 0 seconds, Memory: 5.25Mb

There was 1 failure:

1) TemplateMethodsTest::testTwo
Failed asserting that <boolean:false> is true.
/home/sb/TemplateMethodsTest.php:30

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號