PHPUnit简介

PHPUnit简介

大家应该都听说过单元测试。具体单元测试有啥用也是老生常谈了,我也就不去大段大段的复制粘贴了。在PHP开发中,经常使用的,就是PHPUnit了

安装

首先,把PHP目录和phar的目录(新建一个)都加入到环境变量中

Path

然后,从官网下载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。我之所以不写太多,是因为没必要对文档进行一遍遍的复制粘贴。很多内容,大家都可以在官方文档中找到。

有朋友可能会问,我应该怎样编写单元测试。我认为,单元测试宜小不宜大。也就是说,尽可能的对单个功能编写测试,而不是对一连串功能编写测试。

希望以后可以养成编写测试的好习惯

表情