为Composer Package配置PHPUnit测试环境

由于Package主要是提供给其他人使用,而且可能会有多人协作修改的情况,完整的单元测试是必不可少的,一个新创建的Package,首先需要引入PHPUnit,因为这东西只有开发时候用,所以不要忘了–dev

composer require phpunit/phpunit --dev -vvv

然后创建一个默认的配置文件 phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="./vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
</phpunit>

创建 tests 目录,并且在里面新增一个测试文件,比如这个例子就是 HelpersTest.php,文件名要以Test.php结尾:

<?php

use PHPUnit\Framework\TestCase;

final class HelpersTest extends TestCase
{
    public function testSomeMethod()
    {
        $input = "abc";
        $expectedResult = "def";

        $this->assertEquals($expectedResult, someMethod($input));
    }
}

因为我要测试的是全局函数,所以可以通过文件的形式,将这些函数加载到autoload里,修改 composer.json

"autoload": {
    "files": ["src/Helpers.php"],
},

而如果不是全局函数,是一些class的话,那么可以用下面这种方式

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

每一次修改 composer.json 的 autoload 小结,记得都要重新生成一遍 autoload 文件:

composer dump-autoload

最后一步,就是执行测试用例,在其他的文章中介绍的,还需要传入各种参数,实际上这些参数都在phpunit.xml中配置好了,最后只需要这一句:

phpunit

至此,已经在Composer Package中配置好了PHPUnit的测试环境,剩下的逻辑,就是一个测试驱动的组件开发过程,不管做什么功能,都先写测试用例,让测试用例执行失败,写代码,然测试用例成功。