設置場景 創建數組Fixtures [php] protected function setUp() { // 創建數組fixture。 $this->fixture = array(); } “套件級裝配器” 共享fixture即sharedFixture PHPUnit_Framework_TestSuite對象的$sharedFixture屬性在PHPUnit_Framework_TestSuite對象集合及PHPUnit_Framework_TestCase對象中都可用。 [php] protected function setUp() { $this->sharedFixture = new PDO( 'mysql:host=wopr;dbname=test', 'root', '' ); } provider數據提供者 使用數據提供者 組織測試套件 PHPUnit框架的PHPUnit_Framework_TestSuite類允許我們將一些測試組織在若干測試套件構成的一個層次結構中。讓我們通過一個例子看看PHPUnit特有的測試套件。 范例 7.1顯示一個刪節版本的Tests/AllTests.php,范例 7.2顯示一個刪節版本的Tests/Framework/AllTests.php。 第一級: [php] <?php if (!defined('PHPUnit_MAIN_METHOD')) { define('PHPUnit_MAIN_METHOD', 'AllTests::main'); } require_once 'PHPUnit/Framework.php'; require_once 'PHPUnit/TextUI/TestRunner.php'; require_once 'Framework/AllTests.php'; // ... class AllTests { public static function main() { PHPUnit_TextUI_TestRunner::run(self::suite()); } public static function suite() { $suite = new PHPUnit_Framework_TestSuite('PHPUnit'); $suite->addTest(Framework_AllTests::suite()); // ... return $suite; } } if (PHPUnit_MAIN_METHOD == 'AllTests::main') { AllTests::main(); } ?> 第二級: [php] <?php if (!defined('PHPUnit_MAIN_METHOD')) { define('PHPUnit_MAIN_METHOD', 'Framework_AllTests::main'); } require_once 'PHPUnit/Framework.php'; require_once 'PHPUnit/TextUI/TestRunner.php'; require_once 'Framework/AssertTest.php'; // ... class Framework_AllTests { public static function main() { PHPUnit_TextUI_TestRunner::run(self::suite()); } public static function suite() { $suite = new PHPUnit_Framework_TestSuite('PHPUnit Framework'); $suite->addTestSuite('Framework_AssertTest'); // ... return $suite; } } if (PHPUnit_MAIN_METHOD == 'Framework_AllTests::main') { Framework_AllTests::main(); } ?> 第三級: [php] <?php /** * PHPunit測試套件 * /tests/Framework/Framework/AssertTest.php * @anthor Chen Wei Han * @copyright 2011-7-6下午02:10:29 * @package phpunit * @todo */ //require_once 'PHPUnit/Framework.php'; class Framework_Framework_AssertTest extends PHPUnit_Framework_TestCase{ public function testNewArrayIsEmpty() { // 創建數組fixture。 $fixture = array(); // 斷言數組fixture的尺寸是0。 $this->assertEquals(0, sizeof($fixture)); } public function testArrayContainsAnElement() { // 創建數組fixture。 $fixture = array(); // 向數組fixture增加一個元素。 $fixture[] = 'Element'; //斷言數組fixture的尺寸是1。 $this->assertEquals(1, sizeof($fixture)); } } ?> 類Framework_AssertTest是個擴展了PHPUnit_Framework_TestCase的標准測試用例。 運行Tests/AllTests.php則使用TextUI測試啟動器運行全部測試,然而運行Tests/Framework/AllTests.php則只運行類PHPUnit_Framework_*的測試。 套件級裝配器 類PHPUnit_Framework_TestSuite提供兩個模板方法,setUp()和tearDown(),它們分別在測試套件的首個測試前和最後測試後被調用。 [php] <?php require_once 'MyTest.php'; class MySuite extends PHPUnit_Framework_TestSuite { public static function suite() { return new MySuite('MyTest'); } protected function setUp() { print "\nMySuite::setUp()"; } protected function tearDown() { print "\nMySuite::tearDown()"; } } ?> 未完成和跳過的測試 public function testSomething() { } 如果我們分別將成功的測試和失敗的必做綠燈和紅燈,我們還需要黃燈標記未完成或未實現的測試。PHPUnit_Framework_IncompleteTest是個標記接口,用於標記當測試結果為未完成或當前未實現時引發的異常。 [php] <?php require_once 'PHPUnit/Framework.php'; class SampleTest extends PHPUnit_Framework_TestCase { public function testSomething() { //可選:隨便測試什麼都可以。 $this->assertTrue(TRUE, 'This should already work.'); // 在這兒停住並將測試標記為未完成。 $this->markTestIncomplete( 'This test has not been implemented yet.' ); } } ?> 跳過的測試 特定的環境中並非所有的測試都能運行。考慮個例子,一個具有多個驅動以支持不同數據庫系統的數據庫提取層。MySQL驅動的測試當然只能在MySQL服務器上運行。 $this->markTestSkipped [php] <?php require_once 'PHPUnit/Framework.php'; class DatabaseTest extends PHPUnit_Framework_TestCase { protected function setUp() { if (!extension_loaded('mysqli')) { $this->markTestSkipped( 'The MySQLi extension is not available.' ); } } public function testConnection() { // ... } } ?> PHPUnit_Framework_TestResult 當你在運行所有這些測試時,你需要在某處存儲所有結果:運行了多少測試,哪個失敗了,以及他們耗時多久。 PHPUnit自帶兩個具體的測試裝飾者:PHPUnit_Extensions_RepeatedTest和PHPUnit_Extensions_TestSetup。前一個用於重復運行一個測試,並且只當所有迭代都成功時才算成功。後面一個在第 6 章中討論過。 要定制PHPUnit_Framework_TestResult,沒必要編寫它的整個子類。大多時候,實現一個新PHPUnit_Framework_TestListener(見表 22.14)並在運行測試前附在PHPUnit_Framework_TestResult對象上就夠了。 范例 23.4: 運行和觀測測試套件 [php] www.2cto.com <?php require_once 'PHPUnit/Framework.php'; require_once 'ArrayTest.php'; require_once 'SimpleTestListener.php'; // 創建一個包括測試套件,來自類ArrayTest的測試。 $suite = new PHPUnit_Framework_TestSuite('ArrayTest'); // 創建一個測試結果,並附上一個SimpleTestListener對象作為對它的觀測者。 $result = new PHPUnit_Framework_TestResult; $result->addListener(new SimpleTestListener); // 運行測試。 $suite->run($result); ?>