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