PHPUnit袖珍指南之命令行測(cè)試工具
PHPUnit命令行測(cè)試工具是通過(guò)phpunit命令調(diào)用的。如下代碼顯示如何通過(guò)PHPUnit命令行測(cè)試工具運(yùn)行測(cè)試。
phpunit ArrayTestPHPUnit 2.3.0 by Sebastian Bergmann.
Time: 0.067288
OK (2 tests)
對(duì)每個(gè)測(cè)試,PHPUnit命令行測(cè)試工具打印一個(gè)字符表示進(jìn)程:
·測(cè)試成功打印“.”。
·運(yùn)行測(cè)試方法是發(fā)生了斷言失敗打印“F”。
·運(yùn)行測(cè)試方法是發(fā)生了錯(cuò)誤打印“E”。
·測(cè)試沒(méi)有完成或測(cè)試沒(méi)有實(shí)現(xiàn)打印“I”(見(jiàn)本書(shū)后“未完成的測(cè)試”一章)。
PHPUnit可以區(qū)分失敗和錯(cuò)誤。一個(gè)失敗是PHPUnit的斷言違例,錯(cuò)誤是一個(gè)意料外的異常或一個(gè)PHP錯(cuò)誤。有時(shí)候這種差別是有用的,因?yàn)殄e(cuò)誤相比失敗更容易修正。如果你有一大串問(wèn)題列表,最好先解決所有錯(cuò)誤,然后看看有沒(méi)有失敗遺留下來(lái)。
讓我們看看如下一些代碼命令行測(cè)試工具的選項(xiàng):
phpunit --helpPHPUnit 2.3.0 by Sebastian Bergmann.
Usage: phpunit [switches] UnitTest [UnitTest.php]--coverage-data <file> Write code-coverage data in raw format to file.--coverage-html <file> Write code-coverage data in HTML format to file.--coverage-text <file> Write code-coverage data in text format to file.--testdox-html <file> Write agile documentation in HTML format to file.--testdox-text <file> Write agile documentation in Text format to file.--log-xml <file> Log test progress in XML format to file.--loader <loader> TestSuiteLoader implementation to use.--skeleton Generate skeleton UnitTest class for Unit in Unit.php.--wait Waits for a keystroke after each test.--help Prints this usage information.--version Prints the version and exits.
phpunit UnitTest
運(yùn)行類(lèi)UnitTest提供的測(cè)試,該類(lèi)應(yīng)該定義在源文件UnitTest.php中。
類(lèi)UnitTest必須繼承PHPUnit2_Framework_TestCase類(lèi),或是提供了公有靜態(tài)方法suite,并返回PHPUnit2_ Framework_Test對(duì)象的類(lèi)(例如,類(lèi)PHPUnit2_Framework_TestSuite的一個(gè)實(shí)例)
phpunit UnitTest UnitTest.php
運(yùn)行類(lèi)UnitTest提供的測(cè)試,該類(lèi)要定義在命令指定的源文件(UnitTest.php)中。
--coverage-data, --coverage-html, and --coverage-text
控制運(yùn)行測(cè)試的代碼覆蓋信息的分析和集合(參見(jiàn)本書(shū)后代碼覆蓋分析一節(jié))
--testdox-html and --testdox-text
以HTML或普通文本格式生成運(yùn)行測(cè)試的敏捷文檔(參見(jiàn)本書(shū)后的“測(cè)試的其他用途”一章)
--log-xml
生成運(yùn)行測(cè)試的XML格式的日志文件。
下一個(gè)例子顯示為ArrayTest中的測(cè)試生成的XML日志文件。
<?xml version='1.0' encoding='UTF-8'?> <testsuites> <testsuite name='ArrayTest' tests='2' failures='0' errors='0' time='0.020026'> <testcase name='testNewArrayIsEmpty' time='0.014449'/> <testcase name='testArrayContainsAnElement' time='0.005577'/> </testsuite> </testsuites>
下面的XML日志文件是為名為FailureErrorTest的測(cè)試類(lèi)兩個(gè)測(cè)試生成的,一個(gè)是testFailure,一個(gè)是testError。這顯示了失敗和錯(cuò)誤是如何分別表示的。
<?xml version='1.0' encoding='UTF-8'?> <testsuites> <testsuite name='FailureErrorTest' tests='2' failures='1' errors='1' time='0.013603'> <testcase name='testFailure' time='0.011872'> <failure message='' type='PHPUnit2_Framework_AssertionFailedError'></failure></testcase><testcase name='testError' time='0.001731'> <error message='' type='Exception'></error> </testcase></testsuite></testsuites>--loader
指定將要使用的測(cè)試套件加載器。
標(biāo)準(zhǔn)測(cè)試套件加載器會(huì)在當(dāng)前工作目錄和PHP的include_path configuration指令定義的路徑中尋找源文件。按照PEAR的命名規(guī)則,形如Project_Package_Class的類(lèi)名會(huì)映射到的源文件為Project/Package/Class.php。
--skeleton
為類(lèi)Unit(在文件Unit.php中)生成一個(gè)名為UnitTest(在文件UnitTest.php中)的測(cè)試用例類(lèi)的框架。對(duì)原始類(lèi)的每個(gè)方法,在生成的測(cè)試用例類(lèi)中提供了一個(gè)未完成的測(cè)試用例(見(jiàn)本書(shū)后的“未完成測(cè)試”部分)。
下面的例子顯示了如何為一個(gè)名為Sample的類(lèi)生成一個(gè)測(cè)試類(lèi)的框架。
phpunit --skeleton Sample PHPUnit 2.3.0 by Sebastian Bergmann.Wrote test class skeleton for Sample to SampleTest.php.phpunit SampleTestPHPUnit 2.3.0 by Sebastian Bergmann.ITime: 0.007268There was 1 incomplete test case:1) testSampleMethod(SampleTest)OK, but incomplete test cases!!!Tests run: 1, incomplete test cases: 1.
當(dāng)你為現(xiàn)有代碼書(shū)寫(xiě)測(cè)試時(shí),你不得不重復(fù)很多相同的代碼片斷,如:
public function testSampleMethod( ) {}
PHPUnit能幫助你分析現(xiàn)有代碼,生成測(cè)試用例類(lèi)的框架。
--wait
每個(gè)測(cè)試結(jié)束時(shí),等待一次擊鍵。這很有用,特別是你在一個(gè)只有測(cè)試一直運(yùn)行在打開(kāi)的窗口中運(yùn)行測(cè)試時(shí)。
提示 當(dāng)被測(cè)試代碼中有PHP語(yǔ)法錯(cuò)誤時(shí),文本界面的測(cè)試會(huì)直接退出,不輸出任何錯(cuò)誤信息。標(biāo)準(zhǔn)的測(cè)試套件加載器會(huì)檢查測(cè)試套件的源文件的PHP語(yǔ)法錯(cuò)誤,但是,它不會(huì)檢查測(cè)試套件包含的源文件的語(yǔ)法錯(cuò)誤。PHPUnit的未來(lái)版本會(huì)用在砂箱中PHP解釋器類(lèi)解決這個(gè)問(wèn)題。
