单元测试
对PHP开发者来说,单元测试这个名词也许有些陌生,但是实际上我们却常常在自发的进行着单元测试。
如果你总是一边添加代码一边不断地在
刷新着页面,那么,单元测试早已融入了你的开发中。是的,单元测试其实就是通过尽可能早尽可能快的进行测试来把错误扼杀在摇篮中的,不过使用的,是自动化
的工具。根据TDD(测试驱动开发)的思想,我们在一个功能开始之前就可以创建它的测试代码,然后通过不断的测试、和添加功能来不断的完善它,在这个过程
中,我们对需求和编码的理解会变得更为深入。
PHP开发者的单元测试工具包
在PHP领域,单元测试的工具主要有
PHPUNIT,PHPUNIT2和SimpleTest三种。其中PHPUNIT在功能上很简单,不算完善;PHPUNIT2是专门为PHP5写的单元
测试工具,在结构和功能上都向Junit看齐;而SimpleTest则是一套非常实用的测试工具,其中的webTest支持对web程序界面的测试,是
Easy最为推荐的一款测试工具。在本文中,我们选择SimpleTest进行介绍。
相关知识:PHPUNIT2也是一款很好的工具,尤其是架构上有很多值得圈点之处,希望将来能有机会在专门的文章中和大家分享。
SimpleTest:就是这么Simple
安装SimpleTest很简单,上sf.net上下载一个源码包,然后解压到web目录下就可以使用了,这里就不多说。
下面我们先来看个例子:编写一个测试,检查一个网站是否可以访问。
首先我们引入要用到的文件:
代码列表:
require_once("../simpletest/unit_tester.php");
require_once("../simpletest/web_tester.php");
require_once("../simpletest/reporter.php");
然后我们创建一个测试类:
代码列表:
class TestOfSite extends WebTestCase
{
function TestOfSite()
{
$this->WebTestCase("测试");
}
function testSite()
{
$this->get("http://howgo.net/prettyface/display.php");
$this->assertTitle(".: facebook :.");
}
}
首先我们扩展了webTestCase类,这样我们就可以自动获得测试web的能力,然后在构造函数中我们直接使用基类的,只是把标题传给它。接着我们就该写测试方法了,测试方法都是以‘test"开头的,用以识别在我们运行测试的时候,类中哪些方法要进行调用。
而$this->get将取得网页的内容,我们指定它的标题为 ".: facebook :.", 接着我们要做的就是实例化这个类的对象,并运行它。
代码列表:
$test = &new TestOfSite();
$test->run(new HtmlReporter());
下边是运行结果:
如果测试出错则会出现下边的界面:
到这里一个简单的测试就算完成了。
实战演习 – 一个Login测试
下面我们进入实战,在这个基础上完成一个login的测试。这次我们先贴出完整的代码:
代码列表:
require_once("../simpletest/unit_tester.php");
require_once("../simpletest/web_tester.php");
require_once("../simpletest/reporter.php");
class TestOfLogin extends WebTestCase
{
function TestOfLogin()
{
$this->WebTestCase("Login测试");
}
function testLoginOk()
{
// 取得页面
$this->get("http://howgo.net/prettyface/login.php");
// 添加测试表项
$this->setField("name","Easy");
$this->setField("pass","******");
// 提交
$this->clickSubmit("提交");
// 察看提交后返回页面是否正确
$this->assertWantedPattern("/成功登录/");
// 点击页面链接
$this->clickLink("点击这里进入管理页面");
// 察看指定页面标题和关键内容
$this->assertTitle("ADMINCP");
$this->assertWantedPattern("/请选择要进行的任务/");
// 退出登陆
$this->clickLink("退出管理");
$this->clickLink
}
}