Check your PHP code at every level with unit tests
来自 IBM 的文:Check your PHP code at every level with unit tests。此文建议对 PHP 的模块、数据库操作、用户界面等各个层次都进行单元测试,文中使用的当然是 PHPUnit 了,呵呵。
Test-driven development and unit tests are the latest way to make sure your code is behaving as you expect through changes and refactoring. Find out how to unit test your PHP code at the module, database, and user interface (UI) level.
有时候数据库操作的测试并不是那么容易进行,因为至少需要有测试数据库,如果是团队开发的话,还需要保证测试数据不会被多人同时操作,否则测试结果就会多变,最好是能够创建自己独自使用的数据库来进行测试。另外,测试之后必须保证数据恢复原样,或者是在测试之前对数据库进行一定的数据初始化工作,使其趋于稳定,以免同一测试脚本多次测试的结果不一致。
UI 测试是比较头疼的,测试原理是通过访问特定地址,获取页面 HTML 源代码(本文中用 HTTP_Client 获取),然后使用正则表达式来对其进行检查。为了方便测试,通常会对需要测试的目标数据添加规范化的 HTML 标签,以至于正在表达式能够较为容易地将其匹配出来进行检查。使用正则表达式匹配有一个重要的环节就是检测匹配数目是否唯一,比如同一个页面中,不小心对两个或多个测试检测目标使用了完全相同的标签代码,这样匹配出来的结果就会有多个,而我们习惯使用第一个进行检测,而这个未必就是我们想要的那个。所以对于正则表达式的匹配结果,最好进行一下匹配数目的检查,比如此文中的一个例子就疏忽了这一点:
<?php
function test_add()
{
$page = TestPage::get_page( 'http://localhost/unit/add.php?a=10&b=20' );
$this->assertTrue( strlen( $page ) > 0 );
$this->assertTrue( preg_match( '/<html>/', $page ) == 1 );
preg_match( '/<span id="result">(.*?)</span>/', $page, $out );
$this->assertTrue( $out[1]=='30' );
}
?>
就应该对
<?php preg_match( '/<span id="result">(.*?)</span>/', $page, $out ); ?>
增加一项匹配数目的测试检查:
<?php $this->assertTrue( preg_match( '/<span id="result">(.*?)</span>/', $page, $out ) == 1 ); ?>
