摘要
本文向你介绍测试驱动开发的概念,并用一个简单的示例项目来做示范。
介绍xml:lang="en-us">
开发PHP产品有很多不同的方法。我们大多数倾向于从一个简单的脚本开始,逐步向前推进。 或许我们可以预先列出我们的脚本,但是我们往往是停留在开发阶段,在需要测试的时候不会真正的去开始测试。基本上,我们是先开发后测试。
但是这样做或许不是最好的办法,可能会在今后带来问题。这就是为什么一些开发者提倡一种不同的开发方式,叫做测试驱动开发(TDD)的原因- 就是先测试后开发。
你可能会疑惑这样该怎么做,而这正是本文将讨论的。我将带领你们通过一个真实的简单项目去示范TDD如何工作。本文和示例项目都基于Noel Darlow(“McGruff”)在论坛中向另一个论坛成员演示TDD如何工作的讨论。
我们的示例项目是一个Biter类,它通过使用正则表达式可以“咬掉”字符串中的片段,就象这样:
bite ('/pattern/');?>
我们的类也将修改原始的字符串,把匹配的部分去除(所以我们叫它“吞噬者”)。
让我们从设置测试框架开始。
设置测试框架
由于我们从测试出发,我们需要有一些测试框架。我将使用SimpleTest 框架,仅仅因为我最熟悉它。
下载一份SimpleTest的拷贝,把它安装在你本机或者你的服务器上。然后创建一个叫做"test_biter.php"的新文件,里面写下面的代码:
require_once 'simpletest/unit_tester.php';
require_once 'simpletest/reporter.php';
class BiterTestCase extends UnitTestCase {
function testSetup () {
$this->assertTrue(false);
}
}
$test = new BiterTestCase('TDD Biter Test');
$test->run(new HtmlReporter());
?>
让我们分析一下这个例子。首先我们包含了一些SimpleTest框架的文件(你要确认一下路径是否和你的一样)。接着我们建立了一个叫做 BiterTestCase的新类,它将用来测试我们的Biter类。象你看到的一样,BiterTestClase类继承于UnitTestCase 类,这个意味着BiterTestClass是我们第一个真正意义上的测试用例。
BiterTestClass类只有一个方法调用叫做'testSetup'。任何以“test”开头的方法都会被SimpleTest框架自动执行,因此它们应该是被用来测试项目中的某个部分。在上面的例子中,我们通过调用assertTrue()方法来确认框架被正确设置。
例子中的后面两行是建立一个测试用例的实例,然后运行所有测试。如果所有设置都正确的话,你会得到下面的输出: