#### 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