PHPUnit 的目標之一是測試應當可組合:我們希望能將任意數(shù)量的測試以任意組合方式運行,例如,整個項目的所有測試,或者項目中的某個組件內的所有類的測試,又或者僅僅某單個類的測試。
PHPUnit 支持好幾種不同的方式來組織測試以及將它們編排組合成測試套件。本章介紹了最常用的方法。
編排測試套件的各種方式中,最簡單的大概就是把所有測試用例源文件放在一個測試目錄中。通過對測試目錄進行遞歸遍歷,PHPUnit 能自動發(fā)現(xiàn)并運行測試。
現(xiàn)在來看看 sebastianbergmann/money 這個庫的測試套件。在這個項目的目錄結構中,可以看到 ?tests
?目錄下的測試用例類鏡像了 ?src
?目錄下被測系統(tǒng)(SUT,System Under Test)的包(package)與類(class)的結構:
src tests
`-- Currency.php `-- CurrencyTest.php
`-- IntlFormatter.php `-- IntlFormatterTest.php
`-- Money.php `-- MoneyTest.php
`-- autoload.php
要運行這個庫的全部測試,將 PHPUnit 命令行測試執(zhí)行器指向測試目錄:
$ phpunit --bootstrap src/autoload.php tests
PHPUnit latest.0 by Sebastian Bergmann and contributors.
.................................
Time: 636 ms, Memory: 3.50Mb
OK (33 tests, 52 assertions)
當 PHPUnit 命令行測試執(zhí)行器指向一個目錄時,它會在目錄下查找? *Test.php
? 文件。
如果只想運行在 ?CurrencyTest
?文件中的 t?ests/CurrencyTest.php
? 測試用例類中聲明的測試,可以使用如下命令:
$ phpunit --bootstrap src/autoload.php tests/CurrencyTest.php
PHPUnit latest.0 by Sebastian Bergmann and contributors.
........
Time: 280 ms, Memory: 2.75Mb
OK (8 tests, 8 assertions)
如果想要對運行哪些測試有更細粒度的控制,可以使用 ?--filter
? 選項:
$ phpunit --bootstrap src/autoload.php --filter testObjectCanBeConstructedForValidConstructorArgument tests
PHPUnit latest.0 by Sebastian Bergmann and contributors.
..
Time: 167 ms, Memory: 3.00Mb
OK (2 test, 2 assertions)
這種方法的缺點是無法控制測試的運行順序。這可能導致測試的依賴關系方面的問題。
PHPUnit的 XML 配置文件也可以用于編排測試套件。示例 5.1 展示了一個最小化的 ?phpunit.xml
? 例子,它將在遞歸遍歷 ?tests
?時添加所有在 ?*Test.php
? 文件中找到的 ?*Test
? 類。
示例 5.1 用 XML 配置來編排測試套件
<phpunit bootstrap="src/autoload.php">
<testsuites>
<testsuite name="money">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
要運行測試套件,用 ?--testsuite
? 選項:
$ phpunit --bootstrap src/autoload.php --testsuite money
PHPUnit latest.0 by Sebastian Bergmann and contributors.
..
Time: 167 ms, Memory: 3.00Mb
OK (2 test, 2 assertions)
如果 ?phpunit.xml
? 或 ?phpunit.xml.dist
?(按此順序)存在于當前工作目錄并且未使用 ?--configuration
?,將自動從此文件中讀取配置。
可以明確指定測試的執(zhí)行順序:
示例 5.2 用 XML 配置來編排測試套件
<phpunit bootstrap="src/autoload.php">
<testsuites>
<testsuite name="money">
<file>tests/IntlFormatterTest.php</file>
<file>tests/MoneyTest.php</file>
<file>tests/CurrencyTest.php</file>
</testsuite>
</testsuites>
</phpunit>
更多建議: