pear的可执行程序安装在/usr/bin/pear
pear有个工作目录是/usr/share/pear,这个工作目录需要添加到php.ini中,如果让安装程序自动添加的话,将是这样的:
;***** Added by go-pear include_path=".:/usr/share/pear" ;*****
当我们在php使用require等包含其他文件的函数时,php其实除了搜索当前目录,还会搜索include_path。这样配置就表明,通过pear安装的程序代码将存放在工作目录,而且php能够找到,默认在工作目录下会有一个System.php,所以以下代码是可以工作的:
<?php require 'System.php'; ?>
使用composer安装
本来,phpunit可以通过pear来安装的,然而,时过境迁,在composer大行其道的时代,phpunit也宣布全面支持composer,并且放弃pear,原本通过pear的安装方式果然都不行了。最后逼不得已,只能上composer(话说包管理工具真是多的十个手指不够用了,将来有机会来个横向比较)。
首先安装composer,在翻墙状态下:
$ brew update $ brew tap josegonzalez/homebrew-php $ brew tap homebrew/versions $ brew install php55-intl $ brew install josegonzalez/php/composer
这样composer就装好了。
在项目的根目录下,创建一个composer.json,写入:
{ "require-dev": { "phpunit/phpunit": "4.7.*", "phpunit/php-invoker": "*", "phpunit/dbunit": ">=1.2", "phpunit/phpunit-selenium": ">=1.2", "phpunit/phpunit-story": "*" } }
上面的phpunit-selenium就是基于phpunit写的selenium客户端库,详见文后的参考资料。
然后在项目根目录下,执行
$ sudo composer install
composer会根据这个composer.json文件在根目录创建一个vendor目录,并将依赖的东西全部下载到这个目录中,其中vendor/bin下面有phpunit的可执行文件。
由于是Yii的项目,所以cd到/protected/tests目录下,执行如下命令即可启动默认的SiteTest.php里面的测试方法: (注意在执行前,保持selenium-server开启状态)
$ ../../vendor/bin/phpunit functional/SiteTest.php
会看到firefox会在执行过程中自动启动,并由如下日志输出:
PHPUnit 4.7.7 by Sebastian Bergmann and contributors. Warning: Deprecated configuration setting "selenium" used . Time: 11.52 seconds, Memory: 6.50Mb OK (1 test, 1 assertion)
phpunit工具程序会自动找到tests/phpunit.xml这个配置文件并根据此来进行某些配置,而Yii会利用phpunit和phpunit-selenium的框架来与selenium-server端通信,server端会启动浏览器,并将日志和结果等返回给客户端。整个过程大致就是这样的。
测试
测试是软件开发中必不可少的环节.无论我们是否意识到,在开发Web应用的时候,我们始终都是在测试的.例如, 当我们用PHP写了一个类时, 我们可能会用到一些注入 echo 或者 die 语句来显示我们是否正确地实现了某个方法;当我们实现了包含一套复杂的HTML表单的web页面时, 我们可能会试着输入一些测试数据来确认页面是否是按照我们的预期来交互的.更高级的开发者则会写一些代码来自动完成这个测试过程, 这样一来每当我们需要测试一些东西的时候, 我们只需要调用代码, 剩下来的就交给计算机了. 这就是所谓的 自动测试, 也是本章的主要话题.
Yii 提供的测试支持包括 单元测试 和 功能测试.
单元测试检验了代码的一个独立单元是否按照预期工作. 在面向对象编程中, 最基本的代码单元就是类. 因此, 单元测试的主要职责就是校验这个类所实现的每个方法工作都是正常的. 单元测试通常是由开发了这个类的人来编写.
功能测试检验了特性是否按照预期工作(如:在一个博客系统里的提交操作).与单元测试相比, 功能测试通常要高级一些, 因为待测试的特性常常牵涉到多个类. 功能测试通常是由非常了解系统需求的人编写.(这个人既可以是开发者也可以是质量工程师).
测试驱动开发
以下展示的便是所谓的 测试驱动开发 (TDD) 的开发周期:
创建一个涵盖要实现的特性的新的测试. 测试预计将在第一次执行的时候失败, 因为特性尚未实现.
执行所有测试,确保这个新的测试是失败的.
编写代码来使得测试通过.
执行所有测试,确保所有测试通过.
重构新编写的代码并确保这些测试仍然能够通过.
重复步骤1至5推进整体功能的实现.
构建测试环境
Yii 提供的测试支持需要 PHPUnit 3.5+ 和 Selenium Remote Control 1.0+.请参照他们提供的文档来安装 PHPUnit 和 Selenium Remote Control.
当我们使用 yiic webapp 控制台命令来创建一个新的 Yii 应用时, 它将会生成以下文件和目录供我们来编写和完成测试.