为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的测试环境,剩下的逻辑,就是一个测试驱动的组件开发过程,不管做什么功能,都先写测试用例,让测试用例执行失败,写代码,然测试用例成功。

通过Composer调用本地正在开发中的Package

第一步,在 composer.json 中配置本地 Package 的位置:
– type表明是本地目录
– 将packagist.org设置为false,理论就不会去远程抓取,实际还会的
– symlink设置为true以后,对package的修改都实时生效,不需要update,超级实用
– url是相对于当前项目的相对路径,指向 package 的 composer.json 所在的目录。

"repositories": [
    {
        "type": "path",
        "packagist.org": false,
        "symlink": true,
        "url": "../../Projects/cuimingda/truncate"
    },
    {
        "type": "path",
        "packagist.org": false,
        "symlink": true, 
        "url": "../../Projects/cuimingda/laravel-helpers"
    }
],

第二步,引用本地组件,如果直接使用命令行,就是下面这种,关键是版本号一定要写成 @dev :

composer require cuimingda/truncate:@dev --dev -vvv

当然也可以编辑 composer.json 来完成,效果一样:

"require-dev": {
    "cuimingda/truncate": "@dev",
    "cuimingda/laravel-helpers": "@dev",
},

在实际项目的开发过程中,本地调试组件,实时生效,调试完毕以后,提交到GitHub,并更新到Packagist上,那么在线上环境只要 composer update 就可以了。