到目前為止,我們只有兩個對Array和內建函數sizeof()的測試。當我們開始測試大量的array_*()函數時,每個都需要一個測試。我們可以每個都從頭寫起。但是,更好的方法是一次寫好一個測試基礎架構,以後就只用寫每個測試不同的部分。 PHPUnit就是這樣一個基礎架構。
例5展示如何用PHPUnit重寫例4中的兩個測試。
例5. 用PHPUnit測試Array和sizeof().
<?php
require_once 'PHPUnit2/Framework/TestCase.php';
class ArrayTest extends PHPUnit2_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));
}
}
?>
例5告訴我們用PHPUnit來寫測試的基本步驟是:
1.類別Class的測試類別是ClassTest。
2. ClassTest一般繼承PHPUnit2_ Framework_TestCase。
3.測試是公有方法,沒有參數,名字是test*。
4.在測試方法中,斷言函數,如assertEquals()(見表6)用於斷言實際值是否符合期望值。
一個如PHPUnit的框架需要解決一系列問題,有些看起來互相衝突。測試必須同時滿足以下條件:
易學
測試必須容易學,否則,開發人員不會去學
易開發
測試必須容易開發,否則,開發人員不會去開發
易讀
測試程式碼必須沒有外部關係,這樣測試本身就不會在雜亂無章中迷失。
容易執行
測試應該很容易執行,執行的結果以一種清楚和明確的格式表達出來。
快速執行
測試應該執行的很快,這樣每天才能執行上千次。
程式碼隔離
測試之間不能互相影響,測試順序的改變不應該影響結果。
可組合的
我們應該可以以任何組合來執行測試,這是程式碼隔離的一個必然結果。
這些約束條件有兩個主要的衝突:
易學vs易開發
測試通常不需要應用到程式設計全部的彈性。許多測試工具提供了它們自己的測試腳本語言,這些語言只有書寫測試所需特性的最小集,因為沒有噪聲來幹擾你的測試內容,寫出來的測試易讀易寫。但是學習一種新的編織郵件和一套工具還是不方便的,容易混淆視聽。
程式碼隔離vs快速執行
如果你想要一個測試的結果不影響另一個,每個測試在開始運行的階段,都需要創建測試的全專題,返回後又要恢復運行之前的狀態。可是,設定狀態所需的時間很長(如,連接到資料庫,用真實資料初始化到一個已知狀態)
PHPUnit解決這個問題的方法是採用PHP作為測試語言。有時,全功能的PHP對於書寫短小的,直接的測試是過於強大了,不過,我們利用的程式設計師已經有使用PHP的全部經驗。因為我們需要說服勉強的測試人員,降低書寫這些初步測試的門檻是及其重要的。