原:php composer包开发及phpunit使用


composer

刚开始接触composer的是一直不明觉厉。自从开始使用composer安装各种第三方包,越来越喜欢php的这个特性,以前的时候从没想过php也能实现这种效果。最近突然产生一种冲动,想把自己编写的功能做成一个工具包,单独的放在composer包中方便再次使用。

我先把composer文档稍微细致地看了一遍,然后明白了如何开发第三方包,与平常的php程序编写基本一致,唯一不同的是要维护一个composer.json的配置文件,用于管理当前包的目录结构,依赖包,命名空间等信息。
看一个比较简单的包配置(来自curl/curl):

{
  "name": "curl/curl",
  "description": "cURL class for PHP",
  "keywords": ["dot", "curl"],
  "homepage": "https://github.com/php-mod/curl",
  "type": "library",
  "license": "MIT",
  "authors": [
    {
      "name": "php-curl-class",
      "homepage": "https://github.com/php-curl-class"
    },
    {
      "name": "Hassan Amouhzi",
      "email": "hassan@anezi.net",
      "homepage": "http://hassan.amouhzi.com"
    },
    {
      "name": "user52",
      "homepage": "https://github.com/user52"
    }
  ],
  "require": {
    "php": ">=5.3.0",
    "ext-curl": "*"
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*",
    "squizlabs/php_codesniffer": "~2.1"
  },
  "autoload": {
    "psr-0": {
      "Curl": "src/"
    }
  }
}

composer.json的个字段解释在官方文档中有详细介绍:https://getcomposer.org/doc/04-schema.md

phpunit

开发第三方包必然存在一个客观的问题,如何调试程序。最后程序是要集成到别的项目里面才能运行的。这也是我接触php以来,总萦绕在我心里的大问题,那就是单元测试。平常做web开发基本都不使用单元测试,即使抽象了一些函数或方法,也要等到程序合龙时,能够在网页打印结果的时候才能验证函数或方法的有效性。一直如此,似乎我遇到的人也是如此。大家都不用单元测试,于是羊群效应开始蔓延,我也不用,哈哈....大家都不用不代表就是合适的。我一直想尝试使用单元测试来提高程序健壮性。终于迎来了这个契机。

开发composer包的时候,每次都在一个web项目里测试效率未免太低下,可能真正开发的时间还不如测试的时间多。

幸好看的这个curl/curl项目中都添加了phpunit的配置。在composer中可以通过require-dev引入phpunit。vendor/bin中就会出现phpunit的可执行文件。当然也可以自己手动配置全局的phpunit环境。官方文档中给出了安装教程:

像在curl/curl项目根目录直接执行phpunit就可以自动测试各种功能了。原因是项目根目录存在一个针对phpunit的配置文件phpunit.xml.dist,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="true"
         verbose="false"
         bootstrap="vendor/autoload.php"
>
    <php>
      <ini name="display_errors" value="on"/>
    </php>

    <testsuites>
        <testsuite name="PHP MP4Box Tests Suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>

</phpunit>

官方文档也给出了这个用法的解释:用 XML 配置来编排测试套件当然还可以直接在命令行中运行测试,我觉得这种方式更加统一在多人合作的时候更方便。命令行运行方式

总结

经过这次研究,对composer的认识更加深刻,可以开发自己的composer包了。最令我高兴的是可以使用phpunit进行开发了。phpunit确实好用且好配置。对于phpunit的一些使用细节在开发过程中再进一步研究。

Archives