PHPUnitphp
http://www.ltesting.net/ceshi/open/kydycsgj/phpunit/html
是在PHP5下面對JUnit3系列版本的完整移植 (JUnit - Kent Beck)mysql
require_once 'PHPUnit/Framework.php'是必須的,另外,你須要在測試用例腳本中包含你須要測試的代碼git
除了F外,一個測試用例還有I(未完成),S (跳過),E (錯誤)三種狀態github
PHPUnit的代碼覆蓋率報告須要另外一個優秀的Extension——XDebug(http://www.xdebug.org )支持。正則表達式
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.
點號 表明一個用例經過(即assert系列函數都經過),F表示第二個測試用例未通sql
http://phpunit.de/manual/3.7/zh_cn/index.html數據庫
第 1 章 自動化測試apache
使用自動化測試的目的是少犯錯。編程
第 2 章 PHPUnit 的目標
PHPUnit 側重於相互隔離而非執行快速。
測試應當有良好的粒度劃分,每一個測試應當只測試一個對象的一個方面。
第 3 章 安裝 PHPUnit
第 4 章 編寫 PHPUnit 測試
基本慣例與步驟:
Class
的測試寫在類 ClassTest
中。ClassTest
(一般)繼承自 PHPUnit_Framework_TestCase
。test*
的公用方法。另外,你能夠在方法的文檔註釋塊(docblock)中使用 @test
標註將其標記爲測試方法。
assertEquals()
(參見「斷言」一節)這樣的斷言方法用來對實際值與預期值的匹配作出斷言。測試的依賴關係
PHPUnit支持對測試方法之間的顯式依賴關係進行聲明。用@depends標註來表達依賴關系
/**
* @depends testOne
*/
測試可使用多於一個 @depends 標註。PHPUnit 不會更改測試的運行順序,所以你須要自行保證某個測試所依賴的全部測試均出現於這個測試以前。
擁有多個 @depends 標註的測試,其第一個參數是第一個生產者提供的基境fixture,第二個參數是第二個生產者提供的基境,以此類推。
數據供給器
@dataProvider 標註來指定使用哪一個數據供給器方法。數據供給器方法必須聲明爲 public,其返回值要麼是一個數組,其每一個元素也是數組;要麼是一個實現了 Iterator 接口的對象,在對它進行迭代時每步產生一個數組。
/**
* @dataProvider provider
*/
若是測試同時從 @dataProvider 方法和一個或多個 @depends 測試接收數據,那麼來自於數據供給器的參數將先於來自所依賴的測試的。來自於所依賴的測試的參數對於每一個數據集都是同樣的。
對異常進行測試
用 @expectedException 標註來測試被測代碼中是否拋出了異常。能夠將 @expectedExceptionMessage 和 @expectedExceptionCode 與 @expectedException 聯合使用,來對異常的訊息與代號進行測試
/**
* @expectedException InvalidArgumentException
* @expectedExceptionMessage Right Message
* @expectedExceptionCode 20
*/
能夠用 setExpectedException() 方法來設定所預期的異常
對 PHP 錯誤進行測試
默認狀況下,PHPUnit 將測試在執行中觸發的 PHP 錯誤、警告、通知都轉換爲異常。PHP 的 error_reporting 運行時配置會對 PHPUnit 將哪些錯誤轉換爲異常有所限制。PHPUnit_Framework_Error_Notice 和 PHPUnit_Framework_Error_Warning 分別表明 PHP 通知與 PHP 警告。對異常進行測試是越明確越好的。對太籠統的類進行測試有可能致使不良反作用。所以,再也不容許用 @expectedException 或 setExpectedException() 對 Exception 類進行測試。
對輸出進行測試
PHPUnit_Framework_TestCase
類使用 PHP 的 輸出緩衝 特性來爲此提供必要的功能。xpectOutputString() 方法來設定所預期的輸出。
表4.2. 用於對輸出進行測試的方法
方法 |
含義 |
void expectOutputRegex(string $regularExpression) |
設定輸出預期與 $regularExpression 正則表達式匹配。 |
void expectOutputString(string $expectedString) |
設定輸出預期與 $expectedString 字符串相等。 |
bool setOutputCallback(callable $callback) |
設定回調函數,用於,好比說,將實際輸出規範化。 |
斷言
對於每一個測試的運行,PHPUnit 命令行工具輸出一個字符來指示進展:
. 當測試成功時輸出。
F 當測試方法運行過程當中一個斷言失敗時輸出。
E 當測試方法運行過程當中產生一個錯誤時輸出。
S 當測試被跳過期輸出。
I 當測試被標記爲不完整或未實現時輸出。
PHPUnit 區分 失敗(failure) 與 錯誤(error)。失敗指的是被違背了的 PHPUnit 斷言,例如一個失敗的 assertEquals() 調用。錯誤指的是意料以外的異常(exception)或 PHP 錯誤。
phpunit --help
PHPUnit 3.7.0 by Sebastian Bergmann.
Usage: phpunit [switches] UnitTest [UnitTest.php]
phpunit [switches] <directory>
--log-junit <file> Log test execution in JUnit XML format to file.
--log-tap <file> Log test execution in TAP format to file.
--log-json <file> Log test execution in JSON format.
--coverage-clover <file> Generate code coverage report in Clover XML format.
--coverage-html <dir> Generate code coverage report in HTML format.
--coverage-php <file> Serialize PHP_CodeCoverage object to file.
--coverage-text=<file> Generate code coverage report in text format.
Default to writing to the standard output.
--testdox-html <file> Write agile documentation in HTML format to file.
--testdox-text <file> Write agile documentation in Text format to file.
--filter <pattern> Filter which tests to run.
--testsuite <pattern> Filter which testsuite to run.
--group ... Only runs tests from the specified group(s).
--exclude-group ... Exclude tests from the specified group(s).
--list-groups List available test groups.
--test-suffix ... Only search for test in files with specified
suffix(es). Default: Test.php,.phpt
--loader <loader> TestSuiteLoader implementation to use.
--printer <printer> TestSuiteListener implementation to use.
--repeat <times> Runs the test(s) repeatedly.
--tap Report test execution progress in TAP format.
--testdox Report test execution progress in TestDox format.
--colors Use colors in output.
--stderr Write to STDERR instead of STDOUT.
--stop-on-error Stop execution upon first error.
--stop-on-failure Stop execution upon first error or failure.
--stop-on-skipped Stop execution upon first skipped test.
--stop-on-incomplete Stop execution upon first incomplete test.
--strict Run tests in strict mode.
-v|--verbose Output more verbose information.
--debug Display debugging information during test execution.
--process-isolation Run each test in a separate PHP process.
--no-globals-backup Do not backup and restore $GLOBALS for each test.
--static-backup Backup and restore static attributes for each test.
--bootstrap <file> A "bootstrap" PHP file that is run before the tests.
-c|--configuration <file> Read configuration from XML file.
--no-configuration Ignore default configuration file (phpunit.xml).
--include-path <path(s)> Prepend PHP's include_path with given path(s).
-d key[=value] Sets a php.ini value.
-h|--help Prints this usage information.
--version Prints the version and exits.
PHPUnit 支持共享創建基境的代碼。PHPUnit 支持共享創建基境的代碼。在運行某個測試方法前,會調用一個名叫 setUp() 的模板方法。 setUp() 是建立測試所用對象的地方。當測試方法運行結束後,不論是成功仍是失敗,都會調用另一個名叫 tearDown() 的模板方法。tearDown() 是清理測試所用對象的地方。setUpBeforeClass() 與 tearDownAfterClass() 模板方法將分別在測試用例類的第一個測試運行以前和測試用例類的最後一個測試運行以後調用。
PHPUnit 用一種對全局變量與超全局變量($GLOBALS, $_ENV, $_POST, $_GET, $_COOKIE, $_SERVER, $_FILES, $_REQUEST)進行更改不會影響到其餘測試的方式來運行全部測試。能夠選擇將這種隔離擴展到類的靜態屬性。
注意
對類的靜態屬性的備份與還原操做其實現方案須要 PHP 5.3(或更高版本).
對全局變量和類的靜態屬性的備份與還原操做其實現方案使用了 serialize() 與 unserialize()。
某些 PHP 自身提供的類,好比 PDO ,其實例對象沒法序列化,所以若是把這樣一個對象存放在好比說 $GLOBALS 數組內時,備份操做就會出問題。
把全部測試用例源文件放在一個測試目錄中。經過對測試目錄進行遞歸遍歷,PHPUnit 能自動發現並運行測試。
<phpunit>
<testsuites>
<testsuite name="Object_Freezer">
<directory>Tests</directory>
<file>Tests/Freezer/StorageTest.php</file>
</testsuite>
</testsuites>
</phpunit>
pear install phpunit/DbUnit
DbUnit 目前支持 MySQL、PostgreSQL、Oracle 和 SQLite。經過集成 Zend Framework 或者 Doctrine 2,能夠訪問其餘數據庫系統,好比 IBM DB2 或者 Microsoft SQL Server。
PHPUnit_Framework_IncompleteTest 是一個標記接口,用於將異常(由測試方法拋出)標記爲測試不完整或目前還沒有實現而致使的結果。PHPUnit_Framework_IncompleteTestError 是這個界面的標準實現。
表 9.1. 用於不完整的測試的 API
方法 |
含義 |
void markTestIncomplete() |
將當前測試標記爲不完整。 |
void markTestIncomplete(string $message) |
將當前測試標記爲不完整,並用 $message 做爲說明信息。 |
表 9.2. 用於跳過測試的 API
方法 |
含義 |
void markTestSkipped() |
將當前測試標記爲跳過。 |
void markTestSkipped(string $message) |
將當前測試標記爲不完整,並用 $message 做爲說明信息。 |
除了上述方法,還能夠用 @requires
標註來表達測試用例的一些常見前提條件。
/**
* @requires extension mysqli
*/
/**
* @requires PHP 5.3
*/
PHPUnit 的代碼覆蓋率功能使用了 PHP_CodeCoverage 組件,這反過來又利用了 Xdebug 擴展爲 PHP 提供的語句覆蓋率功能。
PHPUnit 骨架生成器(Skeleton Generator)是用來從成品代碼類中生成骨架測試類(或反之)的工具。能夠用以下命令安裝:
pear install phpunit/PHPUnit_SkeletonGenerator
PHPUnit 所生成的測試結果 XML 日誌文件是基於 JUnit task for Apache Ant 所使用的 XML 日誌的。
Test Anything Protocol (TAP) 是 Perl 與測試模塊之間所使用的簡單的基於文本的接口。
JavaScript 對象表示法(JSON)是輕量級的數據交換格式。
PHPUnit 所生成的 XML 格式代碼覆蓋率信息日誌記錄是不嚴格地基於 Clover 所使用的 XML 日誌的。
以易於常人瞭解(human-readable)的格式生成代碼覆蓋率,輸出到命令行或保存成文本文件。
表 A.1列出了全部斷言種類。
所謂標註,是指某些編程語言中容許加在源代碼中的一種特殊形式的語法元數據。本附錄列出了 PHPUnit 所支持的全部標註種類。
<phpunit> 元素的屬性用於配置 PHPUnit 的核心功能。