🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 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