大家应该都听说过单元测试。具体单元测试有啥用也是老生常谈了,我也就不去大段大段的复制粘贴了。在PHP开发中,经常使用的,就是PHPUnit了
安装
首先,把PHP目录和phar的目录(新建一个)都加入到环境变量中
然后,从官网下载phar包,放到phar目录下,再新建一个phpunit.cmd,内容为:
@php "%~dp0phpunit.phar" %*
基本使用
建立phpunit.xml
虽然phpunit.xml并不是必需品,但是有phpunit.xml会让你省不少事。这是phpunit的配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="tests/init.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/Suite</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">application/</directory>
</whitelist>
</filter>
</phpunit>
简单说说配置文件:
tests/init.php
这里是用于启动的文件。你可以在其中注册一些基本的内容,例如autoload。<testsuites>
里面可以包含很多条测试用例,在这里,我只写了一条./tests/Suite
,代表PHPUnit会到这里去寻找测试用例<whitelist>
我倒是不知道到底有啥用,有兴趣的可以研究研究
编写测试用例
接下来就到了编写测试用例的时候了。例如,我们在tests/Suite
下面新建一个RouterTest.php
用来测试我们的路由函数:
<?php
class RouterTest extends PHPUnit_Framework_TestCase {
public function testMap() {
//Some test codes here
}
}
可以看到,我们编写了一个RouterTest
类,继承自PHPUnit_Framework_TestCase
。在这个类里,所有以test开头的方法均会被依次调用,进行测试。
那么,如何知道我们的代码运行结果到底和预期的是否一样呢?这时候就需要“断言”了。我们可以在某个方法中这样写:
$result = ['test' => 'test'];
$this->assertEquals($result, Router::parse($uri));
它将会把Router::parse($uri)
的结果与$result
对比,如果一样,就证明测试通过。
这里有一点小建议:如果可以的话,尽量让测试数据是随机生成的。如果没办法这样做,那么建议多编写几条测试语句。
当然,如果仅仅是比较一下相等,PHPUnit未免也显得太简陋了一点。因此,PHPUnit提供了很多断言,有最常见的大小比较,还有文件系统方面的等等。具体大家可以去看看文档
总结
这篇文章只是简单介绍一下PHPUnit。我之所以不写太多,是因为没必要对文档进行一遍遍的复制粘贴。很多内容,大家都可以在官方文档中找到。
有朋友可能会问,我应该怎样编写单元测试。我认为,单元测试宜小不宜大。也就是说,尽可能的对单个功能编写测试,而不是对一连串功能编写测试。
希望以后可以养成编写测试的好习惯