#### 1.安裝
PHPUnit如果使用PHAR安裝的話很簡單。Phar歸檔就像Java的Jar,可以直接被PHP解釋器執行。在*nix系統下,可以執行下面三條命令:
~~~
? wget https://phar.phpunit.de/phpunit.phar
? chmod +x phpunit.phar
? sudo mv phpunit.phar /usr/local/bin/phpunit
~~~
考慮到這次重構會引入比較多的類庫,選擇`Composer`做依賴管理。
在Ubuntu下安裝很順利,全局安裝Composer之后,在命令行執行
~~~
composer global require phpunit/phpunit
~~~
全局安裝`PHPUnit`。然后在`~/.bashrc`文件末尾加一行`PATH=$PATH:/home/feng/.composer/vendor/bin`(注意替換用戶名),來將`Composer`的`global bin`目錄加入`PATH`。
安裝過后運行`phpunit --version`看到版本信息則說明安裝成功。
另外,裝完以后我發現`Ubuntu`系統可以使用`apt-get install phpunit`來安裝,但我沒有試過。
在Windows下我用的是`XAMPP`環境,其中已經內置PHPUnit了。如果要在命令提示符下使用的話,可以修改環境變量中的PATH,在里面加上`C:\xampp\php`(或者你修改后的路徑)。再打開命令提示符,運行`phpunit --version`看一下。
#### 2.第一個測試
第一個`Tutorial`我使用的是`PHPUnit`官網上的`Getting Started`,這里寫的比它還要簡單一點。
項目的目錄結構如下:
├── phpunit.xml
├── src
│ ├── autoload.php
│ └── Money.php
└── tests
└── MoneyTest.php
第一個文件是項目代碼`src/Money.php`,內容如下:
~~~
<?php
class Money
{
private $amount;
public function __construct($amount)
{
$this->amount = $amount;
}
public function getAmount()
{
return $this->amount;
}
public function negate()
{
return new Money(-1*$this->amount);
}
}
~~~
與之對應的單元測試是tests目錄下的`MoneyTest.php`,注意單元測試文件名最好是`*Test.php`,這樣以后指定tests目錄便可以執行目錄下的所有測試。
~~~
<?php
class MoneyTest extends PHPUnit_Framework_TestCase
{
public function testCanBeNegated()
{
$a = new Money(1);
$b = $a->negate();
$this->assertEquals(-1, $b->getAmount());
}
}
~~~
代碼很簡單,`$this->assertEquals(-1, $b->getAmount());`即斷言后一個參數的執行結果與前一個參數相等,其他不解釋了。
現在,如果在MoneyTest.php里加一行`include_once('../src/Money.php');`。然后在項目根目錄下執行`phpunit tests/MoneyTest`,就可以看到執行結果了。
#### 3.自動載入
但是,逐個添加`include`的方式太不方便,最好是能自動`include`所需的文件,`PHPUnit`提供了一個參數`--bootstrap`,可以使用項目的`autoload`文件。這里我自己寫了一個最簡單的`autoload.php`,只要4行。這個文件并不是PHPUnit專用的,應該放在src目錄下。
~~~
<?php
function __autoload($class){
include $class.'.php';
}
spl_autoload_register('__autoload');
~~~
當需要Money類時,就去`include Money.php`。寫完`__autoload()`函數之后要用`spl_autoload_register()`注冊上。
現在就可以去掉`MoneyTest.php`中的`include`語句,使用`phpunit --bootstrap src/autoload.php tests/MoneyTest`來執行測試了。
雖然可以自動載入,但是要執行的命令更長了。我們還可以寫一個配置文件來為項目指定`bootstrap`,這樣就不用每次都寫在命令里了。
配置文件`phpunit.xml`放在項目根目錄下。PHPUnit默認會讀取當前目錄下的`phpunit.xml`配置文件,在里面包含了所需要用到的類(非PHPUnit的類),問題就解決了~
~~~
<phpunit bootstrap="src/autoload.php">
</phpunit>
~~~
如果要執行MoneyTest,在項目根目錄下執行:`phpunit tests/MoneyTest`
如果要執行tests目錄下的所有測試,在項目根目錄下執行:`phpunit tests`
* * * * *
http://www.bayescafe.com/php/getting-started-with-phpunit.html