单元测试

FuelPHP 以自动测试的想法建成,并且基於 PHPUnit 测试框架來包含测试和测试类別。

单元测试是什么?

单元测试是被寫來確保程式码单元(通常是一个函式或方法)是否有执行它原設計行为的自动测试。 这些测试也幫助开发者確保他們對系统所作的任何變更,不会破壞原有運作中的任何東西。 单元测试也是测试驅动开发(TDD)學問的關鍵原动力。

PHPUnit

你将需要本地安装的 PHPUnit,如果你想要傳送給 FuelPHP 运行测试,并且想要使用 Oil 來运行你的测试的話。 如果你還沒安装好 PHPUnit,請參考 PHPUnit 安装文件:http://www.phpunit.de/manual/current/en/installation.html

如果你對使用 FuelPHP 运行单元测试不感興趣,你就沒有必要安装 PHPUnit。

执行单元测试

FuelPHP 包含的命令列實用工具已经被配置來运行你的单元测试。 你可以從命令列使用 Oil 命令列實用工具,來运行所有在你 FuelPHP 專案中的测试:

$ php oil test

Tests Running...This may take a few moments.
PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from /home/user/sites/example/fuel/core/phpunit.xml

...............................................................  63 / 251 ( 25%)
............................................................... 126 / 251 ( 50%)
............................................................... 189 / 251 ( 75%)
..............................................................

Time: 6 seconds, Memory: 22.25Mb

OK (251 tests, 206 assertions)

建立单元测试

在 FuelPHP,测试位於 fuel/app/tests 目录及其子目录。 如果此目录不存在,前去建立它。 依照慣例,测试档案被放在之於 fuel/app/tests 的子路徑会與被测试类別之於 fuel/app/classes 的相同,所以一个對 fuel/app/classes/model/login.php 类別的测试会在 fuel/app/tests/model/login.php。

测试是擴充 TestCase 的类別。 TestCase 是 FuelPHP 對 PHPUnit 的 PHPUnit_Framework_TestCase 类別的擴充,这樣你将可以在你的测试中使用所有常見的 PHPUnit 主張(assertion)和方法。 依照慣例,测试类別在它們要测试的类別之後被命名,以 Test_ 前綴,所以一个测试 Model_Login 的类別会被命名为 Test_Model_Login。

class Test_Model_Login extends TestCase
{
	public function test_foo()
	{
	}
}

你可以在 PHPUnit 文件找到更進一步關於撰寫测试的資訊:http://www.phpunit.de/manual/current/en/writing-tests-for-phpunit.html

测试群組

如果你在开发階段只想运行测试的子群集,你可以使用测试群組。 运行 php oil test 帶著 --group= 命令開關。

$ php oil test --group=App

此命令将只运行 'App' 群組的测试。 你可以對文件區塊的 @group 屬性指派一个测试类別为一个或更多群組。

/**
 * @group App
 * @group Login
 */
class Test_Model_Login extends TestCase
{
	public function test_foo()
	{
	}
}

進階配置

如果你需要自訂 phpunit.xml 档案的內容,複製 fuel/core/phpunit.xml 到 fuel/app 目录中。 FuelPHP 将識別你的新配置档案代替在 fuel/core 的舊档案。

为模組单元测试

如果你正在用 FuelPHP 开发大型系统,建議作法是在模組开发。 但因为模組路徑试可配置的,模組路徑必須被配置在 phpunit.xml 让测试可被識別及运行。 例如,如果你正在 fuel/app/modules 开发模組,你会想要添加此测试套件到你的 phpunit 配置:

<testsuite name="modules">
    <directory suffix=".php">../app/modules/*/tests</directory>
</testsuite>

在一个改名的 fuel/ 目录中测试

如果你已经把你的 fuel 目录改为其他名稱,設定在 phpunit.xml 档案中的系统變数(文件根目录、核心路徑等。) 雖然在你根目录的 Oil 指令码變更路徑将有助於其他 Oil 命令,PHPUnit 載入它自己的环境,因此一个改名的 fuel 目录将破壞测试。 要修正这个問題,编輯在你的 app/ 目录中的 phpunit.xml 副本,并更新伺服器變数路徑來反映你的新档案結構。