W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在編寫測(cè)試時(shí),最費(fèi)時(shí)的部分之一是編寫代碼來(lái)將整個(gè)場(chǎng)景設(shè)置成某個(gè)已知的狀態(tài),并在測(cè)試結(jié)束后將其復(fù)原到初始狀態(tài)。這個(gè)已知的狀態(tài)稱為測(cè)試的 基境(fixture)。
在Example?2.1, “用 PHPUnit 測(cè)試數(shù)組操作”中,基境十分簡(jiǎn)單,就是存儲(chǔ)在 $stack
變量中的數(shù)組。然而,絕大多數(shù)時(shí)候基境均遠(yuǎn)比一個(gè)簡(jiǎn)單數(shù)組要復(fù)雜,用于建立基境的代碼量也會(huì)隨之增長(zhǎng)。測(cè)試的真正內(nèi)容就被淹沒(méi)于建立基境帶來(lái)的干擾中。當(dāng)編寫多個(gè)需要類似基境的測(cè)試時(shí)這個(gè)問(wèn)題就變得更糟糕了。如果沒(méi)有來(lái)自于測(cè)試框架的幫助,就不得不在寫每一個(gè)測(cè)試時(shí)都將建立基境的代碼重復(fù)一次。
PHPUnit 支持共享建立基境的代碼。在運(yùn)行某個(gè)測(cè)試方法前,會(huì)調(diào)用一個(gè)名叫 setUp()
的模板方法。setUp()
是創(chuàng)建測(cè)試所用對(duì)象的地方。當(dāng)測(cè)試方法運(yùn)行結(jié)束后,不管是成功還是失敗,都會(huì)調(diào)用另外一個(gè)名叫 tearDown()
的模板方法。tearDown()
是清理測(cè)試所用對(duì)象的地方。
在Example?2.2, “用 @depends
標(biāo)注來(lái)表達(dá)依賴關(guān)系”中,我們?cè)跍y(cè)試之間運(yùn)用生產(chǎn)者-消費(fèi)者關(guān)系來(lái)共享基境。這并非總是預(yù)期的方式,甚至有時(shí)是不可能的。Example?4.1, “用 setUp() 建立棧的基境”展示了另外一個(gè)編寫測(cè)試 StackTest
的方式。在這個(gè)方式中,不再重用基境本身,而是重用建立基境的代碼。首先聲明一個(gè)實(shí)例變量,$stack
,用來(lái)替代方法內(nèi)的局部變量。然后把 array
基境的建立放到 setUp()
方法中。最后,從測(cè)試方法中去除冗余代碼,在 assertEquals()
斷言方法中使用新引入的實(shí)例變量 $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));
}
}
?>
測(cè)試類的每個(gè)測(cè)試方法都會(huì)運(yùn)行一次 setUp()
和 tearDown()
模板方法(同時(shí),每個(gè)測(cè)試方法都是在一個(gè)全新的測(cè)試類實(shí)例上運(yùn)行的)。
另外,setUpBeforeClass()
與 tearDownAfterClass()
模板方法將分別在測(cè)試用例類的第一個(gè)測(cè)試運(yùn)行之前和測(cè)試用例類的最后一個(gè)測(cè)試運(yùn)行之后調(diào)用。
下面這個(gè)例子中展示了測(cè)試用例類中所有可用的模板方法。
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.
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)系方式:
更多建議: