前段時(shí)間的一個(gè)項(xiàng)目中,由于開(kāi)發(fā)工程師時(shí)間比較緊,沒(méi)時(shí)間進(jìn)行單元測(cè)試。所以我臨時(shí)替補(bǔ)作單元測(cè)試。個(gè)人對(duì)phpunit了解不是很深入,本文只是對(duì)phpunit框架做簡(jiǎn)要介紹并寫(xiě)一些使用的體驗(yàn)。有誤之處還請(qǐng)多多指證。
和其他的Xunit測(cè)試框架一樣,phpunit框架主要分為以下部分:
TestCase --測(cè)試用例
TestSuite --測(cè)試套件(我習(xí)慣稱(chēng)其為測(cè)試用例集)
Assert--斷言(我習(xí)慣稱(chēng)其為驗(yàn)證方式)
TestResult--測(cè)試結(jié)果
對(duì)于testcase,phpunit中除了一般的testcase,還包含了Incompletetestcase(未完成的)和skiptestcase(跳過(guò)的測(cè)試用例)。
testcase是單元測(cè)試的基本組成部分,每個(gè)testcase均包含以下部分:
Setup()---測(cè)試前的初始化,執(zhí)行每個(gè)testMethod前均會(huì)執(zhí)行
Teardown()--測(cè)試完成后恢復(fù),執(zhí)行完每個(gè)testMethod后均會(huì)執(zhí)行
testMethod()--測(cè)試方法(測(cè)試點(diǎn))
寫(xiě)phpunit測(cè)試腳本時(shí),可以通過(guò)phpunit Skeleton 生成單元測(cè)試的腳本結(jié)構(gòu),然后在結(jié)構(gòu)中填寫(xiě)測(cè)試用例。
如果不用skeleton生成,自己寫(xiě)也很方便。
phpunit的測(cè)試文件包含以下部分:
引入必要的文件
require 'x.php'--被測(cè)試的php文件
rquire 'phpunitpathphpunitframework'--- phpunit的framewok文件
創(chuàng)建一個(gè)從phpunit frame繼承的類(lèi)
class XXtest extends PHPUnit_Framework_TestCase
[初始化公共的參數(shù)]
public $para1='';
public $para2='';
寫(xiě)setup和teardown函數(shù)
public function setUp() {}
public function tearDown() {}
注意,每運(yùn)行一個(gè)test的函數(shù),均會(huì)首先運(yùn)行setup,每運(yùn)行完一個(gè)函數(shù),均會(huì)運(yùn)行teardown. 寫(xiě)這2個(gè)函數(shù)時(shí)需要注意。
下一步是寫(xiě)測(cè)試函數(shù)了,比如測(cè)試
public function sum(a,b)
{return a+b;}
寫(xiě)測(cè)試函數(shù)時(shí)和測(cè)試用例是對(duì)應(yīng)的,我們首先測(cè)試正常情況下求和是否正確,testXX函數(shù)可以如下:
public function testSumNormal ()
{
coding....
assertSame(expectresult,actualcode,message)
}
所有的測(cè)試函數(shù)均已test開(kāi)頭,一般通過(guò)assert..驗(yàn)證結(jié)果是否正確。
寫(xiě)完單元測(cè)試腳本后,下一步是執(zhí)行測(cè)試,簡(jiǎn)單的命令是:phpunit xxx.php 更加詳細(xì)的命令如下: phpunit --log-xml(log 文件格式) 文件路徑/文件名 --coverage-html(代碼覆蓋文件格式) 文件路徑/文件名 單元測(cè)試用例類(lèi) 單元測(cè)試文件 如:phpunit --log-xml path/createAlbumlog --coverage-html path/logs/ createAlbumtest createAlbum.php 命令執(zhí)行過(guò)程中,.--表示成功,e--代表error, f--代表失敗, 執(zhí)行完成后會(huì)顯示測(cè)試用例成功、失敗和出錯(cuò)情況。也可以通過(guò)查看log查看測(cè)試情況,coverage文件可以查看單元測(cè)試腳本對(duì)測(cè)試文件代碼覆蓋率情況。
自己感覺(jué)單元測(cè)試過(guò)程中需注意以下幾個(gè)方面:
1、各測(cè)試用例(testXXX)的數(shù)據(jù)耦合度要低。如果耦合度較高的話(huà),如果前一個(gè)測(cè)試用例失敗的話(huà),之后的測(cè)試用例會(huì)出現(xiàn)error,無(wú)法繼續(xù)。
2、測(cè)試用例盡量覆蓋各邏輯分支,保證測(cè)試覆蓋率。
3、測(cè)試用例設(shè)計(jì)和非單元測(cè)試的用例設(shè)計(jì)方法一致,針對(duì)一個(gè)方法測(cè)試需包含:正常測(cè)試、異常測(cè)試和邊界測(cè)試等。
4、合理的利用setUp合tearDown, 每執(zhí)行一個(gè)testXX時(shí),都首先運(yùn)行setUP,執(zhí)行完testXX后,都會(huì)運(yùn)行tearDown, 因此可以把各個(gè)測(cè)試用例開(kāi)始都需要初始化且初始化值一樣的參數(shù)放到setUP中,而執(zhí)行完后需要unset的參數(shù)放到tearDown函數(shù)中。
5、用phpunit skelon 生成測(cè)試框架時(shí),只有.php文件才可以,測(cè)試其他格式的文件如 inc格式文件無(wú)法生成的?梢孕薷奈募笤谏。