什么是PHPUnit
PHPUnit是一個(gè)輕量級(jí)的PHP測(cè)試框架。它是在PHP5下面對(duì)JUnit3系列版本的完整移植,是xUnit測(cè)試框架家族的一員(它們都基于模式先鋒Kent Beck的設(shè)計(jì))
單元測(cè)試是幾個(gè)現(xiàn)代敏捷開發(fā)方法的基礎(chǔ),使得PHPUnit成為許多大型PHP項(xiàng)目的關(guān)鍵工具。這個(gè)工具也可以被Xdebug擴(kuò)展用來(lái)生成代碼覆蓋率報(bào)告 ,并且可以與phing集成來(lái)自動(dòng)測(cè)試,合它還可以和Selenium整合來(lái)完成大型的自動(dòng)化集成測(cè)試。 [編輯本段]如何部署PHPUnit 方法一 使用Pear
運(yùn)行 pear channel-discover pear.phpunit.de;
pear install phpunit/PHPUnit
方法二 手動(dòng)安裝
1 從http://pear.phpunit.de/get/下載軟件包并解壓
2 把解壓后的目錄加入php.ini中的include_path
3 將腳本pear-phpunit改名為phpunit
4 將phpunit腳本中的@php_bin@替換成php可執(zhí)行腳本的路徑
5 為phpunit腳本增加可執(zhí)行權(quán)限并加入$PATH
6 將PHPUnit/Runner/Version.php中的@package_version@替換成3位
PHPUnit版本號(hào) [編輯本段]下面的例子用來(lái)測(cè)試sizeof函數(shù)工作的正確性 <?php 鼠標(biāo)
require_once 'PHPUnit/Framework.php';
class ArrayTest extends PHPUnit_Framework_TestCase {
public function testNewArrayIsEmpty() {
/*Create the Array fixture*/
$fixture = array();
/* Assert that the size of the Array * fixture is 0*/
$this->assertEquals(0, sizeof($fixture));
}
public function testArrayContainsAnElement() {
/* Create the Array fixture*/
$fixture = array();
/*Add an element to the Array * fixture*/
$fixture[] = 'Element';
/*Assert that the size of the * Array fixture is 1*/
$this->assertEquals(1, sizeof($fixture));
}
}
?>
要點(diǎn):
1 編寫的測(cè)試用例是一個(gè)php腳本
2 require_once 'PHPUnit/Framework.php'是必須的,另外,你需要在測(cè)
試用例腳本中包含你需要測(cè)試的代碼
3 測(cè)試用例的主體必須寫在類中,類名必須和文件名保持一致,還必須是
PHPUnit_Framework_TestCase的子類
4 每一個(gè)測(cè)試用例都是一個(gè)public的成員函數(shù),必須以test開頭
5 程序的輸出使用assert*系列函數(shù)來(lái)進(jìn)行驗(yàn)證
該用例需要在Shell下鍵入phpunit ArrayTest.php來(lái)運(yùn)行。結(jié)果如下示:
[username@machine xx]$ phpunit ArrayTest.php
PHPUnit 3.1.3 by Sebastian Bergmann.
..
Time: 0 seconds
OK (2 tests)
結(jié)果中重要的用紅色標(biāo)出的結(jié)果,點(diǎn)號(hào) 代表一個(gè)用例通過(即assert系列函數(shù)都通過)。如果將上面的測(cè)試用例testArrayContainsAnElement用例assertEquals函數(shù)中的1改為0,則運(yùn)行結(jié)果為:
PHPUnit 3.1.3 by Sebastian Bergmann.
.F
Time: 0 seconds
There was 1 failure:
1) testArrayContainsAnElement(ArrayTest)
Failed asserting that <integer:1> matches expected value <integer:0>.
/home/wiki/apache/htdocs1.5.0/ArrayTest.php:29
FAILURES!
Tests: 2, Failures: 1.
可以很明顯看出結(jié)果由原來(lái)的 .. 變?yōu)?.F ,F(xiàn)表示第二個(gè)測(cè)試用例未通
過,并且具體與哪一條驗(yàn)證不符都在后有詳細(xì)說明。
除了F外,一個(gè)測(cè)試用例還有I(未完成),S (跳過),E (錯(cuò)誤)三種狀態(tài),詳見http://www.phpunit.de/pocket_guide/3.2/en/textui.html [編輯本段]PHPUnit如何保證測(cè)試的準(zhǔn)確性 測(cè)試用例之間必須保證他們之間是不互相影響的,即這些測(cè)試用例無(wú)論以任何順序執(zhí)行,他們的結(jié)果都應(yīng)該一樣。PHPUnit提供了兩個(gè)可供重寫的函數(shù)來(lái)滿足此要求。
成員函數(shù)setUp在每一個(gè)測(cè)試用例開始之前執(zhí)行,用來(lái)創(chuàng)建用于測(cè)試的環(huán)境。tearDown則在每個(gè)測(cè)試用例結(jié)束時(shí)調(diào)用,用于還原測(cè)試用例對(duì)環(huán)境帶來(lái)的影響。
上示的測(cè)試用例中$fixture = array()可以放在setUp中完成 [編輯本段]PHPUnit還支持哪些高級(jí)功能 結(jié)合XDebug生成代碼覆蓋率報(bào)告
如何測(cè)試你的測(cè)試用例設(shè)計(jì),答案是代碼覆蓋率。代碼覆蓋率即當(dāng)你的
一套測(cè)試用例執(zhí)行完畢時(shí),有多少比例的代碼分支被覆蓋到。
PHPUnit的代碼覆蓋率報(bào)告需要另一個(gè)的Extension——XDebug
。╤ttp://www.xdebug.org )支持。當(dāng)執(zhí)行完測(cè)試用例后,得出的結(jié)果類似