本文目的
本文介紹了phpunit通用函數用法,整體架構,和如何使用TestSuite來管理項目的所有的測試用例。
批量運行
當配置好phpunit后,可以使用“phpunit someTestCase”命令執行單個用例,使得用例的執行很方便。但是如果testcase分散到多個文件中,一個一個的執行phpunit就變得很麻煩了。好在,phpunit命令提供了一些可選參數,可以使得批量處理Test Case變得容易,可以直接執行phpunit查看這些可選參數,如下所示:
上圖中,紅圈標注的地方就是用於批量運行測試用例的參數,同時,phpunit也可以默認的執行指定目錄下*Test.php文件中的測試用例,並且是迭代的遍歷所有子目錄,如下面的例子:
在test/UnitTestDemo目錄下面四個文件,只有兩個文件是以*Test.php格式結尾,所以運行“phpunit test”命令可以批量的運行這些符合要求的用例。如果你希望更細粒度的控制執行特定用例,可以使用“--filter”參數,該參數通過過濾用例文件名稱來執行特定文件中的測試用例。
命名約定
PHPUnit中默認的命令規則,可以使得運行測試用例變得十分方便。列舉如下:
- 自動執行每個TestCase類中test***形式的方法
- 自動執行目錄下*Test.php形式命名中的用例
一旦遵守了這些命名約定,編寫單元測試將會更加便捷。
setUp和tearDown
setUp和tearDown可以幫助我們搭建和清理測試環境,TestCase和TestSuite兩個類均有這對函數,可以共用戶重載。但是,需要注意這兩對函數調用的時機不一樣,在TestCase中,每一次test***方法調用前均會調用setUp方法,調用后均會調用tearDown方法。但是,在TestSuite中,只會在第一個testCase調用之前調用setup,最后一個testCase調用后,調用tearDown。可以通過下面的例子,了解整個調用過程。
代碼如下:
MySuite.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()"; } } ?>
MyTest.php
<?php class MyTest extends PHPUnit_Framework_TestCase { protected function setUp() { print "\nMyTest::setUp()"; }
protected function tearDown() { print "\nMyTest::tearDown()"; } public function testOne() { print "\nMyTest::testOne()"; } public function testTwo() { print "\nMyTest::testTwo()"; } } ?>
PHPUnit系統架構
上圖展示的PHPUnit庫的架構,看起來是不是似曾相識?如果你了解設計模式,應該不難發現PHPUnit的整體架構采用的“組合設計模式”,定義如下:
(組合設計模式將對象以樹形結構組織起來,以達成“部分-整體”的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性.組合設計模式比較容易理解,它就是一個樹形結構圖。組合體內這些對象都有共同接口,當組合體一個對象的方法被調用執行時,組合設計模式將遍歷整個樹形結構,尋找同樣包含這個方法的對象並實現調用執行。可以用牽一動百來形容。組合設計模式好處:1.使客戶端調用簡單,客戶端可以一致的使用組合結構或其中單個對象,用戶就不必關心自己處理的是單個對象還是整個組合結構,這就簡化了客戶端代碼。2.更容易在組合體內加入對象部件. 客戶端不必因為加入了新的對象部件而更改代碼。)
注意:為了簡潔,描述上圖對象時,均省略掉“PHPUnit2_Framework_”前綴。所以,使用Test作為統一的接口, TestCase是測試用用例,繼承於Assert,這樣可以方便的調用Assert中的各種斷言函數。TestSuite,是一個Test的集合,他可以包含任意的TestCase或TestSuite。這樣設計的好處不言而喻——方便的組織測試用例和測試套件,客戶代碼不必關執行的是單個測試用例還是一整套測試套件或是更為復雜的測試用例樹。
使用testsuite管理所有測試用例
有了上面的知識,現在就可以使用TestSuite對象管理和組織你的測試用例了。我們有如下四個測試用例需要組織:
希望將Stack相關的測試一起運行,其他用例一起運行,並且在需要時,所有的用例可以全部運行,那么就創建如下三個測試套件對象。
上面的測試套件只添加Stack相關的測試,運行結果如下:
上面的測試套件只添加其他測試用例,運行結果如下:
如果希望運行所有的套件,可以使用上面的測試套件進行組織,運行結果如下:
通過上面代碼中畫圈的部分,可以發現一些共性:
1) 測試套件類集成與PHPUnit_Framework_TestSuite類;
2) 測試套件類必須實現public static function suite(){/*必須返回測試套件對象*/}接口;
3) 通過addTestSuite(‘Test Case Class Name’),將具體的測試用例添加到測試套件中。
如果在真實的項目中,可以以模塊為單位組織測試套件。如過模塊過大,可以在模塊內部繼續划分測試套件,這樣,形成一個樹裝結構,需要運行那部分測試用例,只需要敲入一行命令“phpunit XXXXTestSuite.php”,就可以輕松執行(上面的代碼見附件)。合理的使用測試套件,可以簡潔有效的組織所有測試用例。
參考文獻