PHPUnit袖珍指南之自動(dòng)測(cè)試
最好的程序員也會(huì)犯錯(cuò)誤。好程序員和差程序員的區(qū)別在于:好程序員能通過(guò)測(cè)試盡可能的發(fā)現(xiàn)錯(cuò)誤。你越快測(cè)試錯(cuò)誤,你就越快發(fā)現(xiàn)它們,發(fā)現(xiàn)和修正的成本就越低。這解釋了為什么只在軟件發(fā)布前才測(cè)試的做法為什么問(wèn)題那么多。大多數(shù)錯(cuò)誤根本就沒(méi)有發(fā)現(xiàn)過(guò),修正發(fā)現(xiàn)的錯(cuò)誤是那么的高,以至于你不得不根據(jù)優(yōu)先級(jí)來(lái)決定只修正那些錯(cuò)誤,因?yàn)槟愀揪统惺懿黄鹑啃拚馁M(fèi)用。
相比你正在使用的方法,采用PHPUnit進(jìn)行測(cè)試并不是一個(gè)全然不同的東西。它們只是方法不同。兩者之間的不同在于,檢查程序行為是否符合正確是通過(guò)一批可以自動(dòng)測(cè)試的代碼片斷來(lái)進(jìn)行的。這些代碼片斷叫做單元測(cè)試。 在這一部分,我們先基于打印的測(cè)試代碼進(jìn)行自動(dòng)測(cè)試。假設(shè)我們要測(cè)試PHP的內(nèi)建數(shù)組Array。需要測(cè)試之一是函數(shù)sizeof(),對(duì)任何新創(chuàng)建的數(shù)組,sizeof()函數(shù)應(yīng)該返回 0。當(dāng)我們加入一個(gè)新數(shù)組成員,sizeof()應(yīng)該返回1。例1顯示了我們想測(cè)試什么。
例1. 測(cè)試數(shù)組和sizeof()
<?php $fixture = Array( ); // $fixture應(yīng)該為空。
$fixture[] = 'element'; // $fixture應(yīng)該包含一個(gè)數(shù)組成員。?>
最簡(jiǎn)單的測(cè)試方法是在加入數(shù)組成員前后打印sizeof()的運(yùn)算結(jié)果,如果返回0和1,說(shuō)明Array和sizeof()運(yùn)行正常。
例2. 采用打印語(yǔ)句測(cè)試Array和sizeof()
<?php $fixture = Array( ); print sizeof($fixture) . 'n';
$fixture[] = 'element'; print sizeof($fixture) . 'n';?>01
現(xiàn)在,我們讓測(cè)試程序從需要手工解釋變?yōu)樽詣?dòng)運(yùn)行。在例3中,我們比較了期望值和實(shí)際值,如果相等就打印ok。如果我們發(fā)現(xiàn)有的結(jié)果不是ok,我們就知道有問(wèn)題了。
例3. 比較Array和sizeof()的期望值和實(shí)際值
<?php $fixture = Array( ); print sizeof($fixture) == 0 ? 'okn' : 'not okn';
$fixture[] = 'element'; print sizeof($fixture) == 1 ? 'okn' : 'not okn';?>okok
我們現(xiàn)在引入一個(gè)新的要素,如果期望值和實(shí)際值不同,我們就拋出一個(gè)異常。這樣我們的輸出就更簡(jiǎn)單了。如果測(cè)試成功,什么也不做,如果有一個(gè)未處理異常,我們知道有問(wèn)題了。
例4.使用斷言函數(shù)來(lái)測(cè)試Array和sizeof()
<?php $fixture = Array( ); assertTrue(sizeof($fixture) = = 0);
$fixture[] = 'element'; assertTrue(sizeof($fixture) = = 1);
function assertTrue($condition) {if (!$condition) { throw new Exception('Assertion failed.');} }?>
現(xiàn)在測(cè)試完全自動(dòng)化了。和我們第一個(gè)版本不同,這個(gè)版本使得測(cè)試完全自動(dòng)化了。
使用自動(dòng)測(cè)試的目的是盡可能少的犯錯(cuò)誤。盡管你的代碼還不是完美的,用優(yōu)良的自動(dòng)測(cè)試,你會(huì)發(fā)現(xiàn)錯(cuò)誤會(huì)明顯減少。自動(dòng)測(cè)試給了你對(duì)代碼公正的信心。有這個(gè)信心,你可以在設(shè)計(jì)上有大膽的飛越,和你的團(tuán)隊(duì)伙伴關(guān)系更好,改善你和客戶(hù)之間的關(guān)系,每天安心入睡,因?yàn)槟憧梢宰C明由于你的努力,系統(tǒng)變得更好了。
