原文链接http://drupal.org/node/811254。
注:本指南的代码由Examples for Developers module维护,也就是说:
- 从该模块中复制一份代码,编辑、修改然后进行测试.
- 报告所发现问题,进行修复,欢迎进行补丁修正和提出改进意见。
Simpletest通过DrupalWebTestCase提供了强大的测试功能,但有时你可能只想写一个传统而简单的单元测试。Simpletest也提供了这样的功能。在本页中我们就通过举例来介绍单元测试方法。
要测试什么呢?
单元测试的目的是要测试一段独立的功能,如函数或方法。例如:某个模块带有实现如下功能的函数。
<?php
function simpletest_example_empty_mysql_date($date_string) {
if (empty($date_string) || $date_string == '0000-00-00' || $date_string == '0000-00-00 00:00:00') {
$date_is_empty = true;
}
else {
$date_is_empty = false;
}
return $date_is_empty;
}
?>
我们应该在各种条件下来测试该函数。在上述例子中,我们仅测试一些值:NULL,空字符串, '0000-00-00',和一个有效的日期。
构建测试
首先我们需要来创建一个测试文件。在模块目录下,产生一个新的.test文件。在本例中,即simpletest_example.test文件。
为了让Drupal知道这个测试,需要在模块的.info文件中将你的测试文件加到'file[]’参数中。在本例中,我们在simpletest_example.info中添加:
files[] = simpletest_example.test
现在我们回到’simpletest_example/simpletest_example.test’文件,为单元测试产生一个类。这个类将扩展DrupalUnitTestCase.
<?php
class SimpletestUnitTestExampleTestCase extends DrupalUnitTestCase {
}
?>
像扩展DrupalWebTestCase一样,我们的SimpletestUnitTestExampleTestCase类需要通过getInfo()方法实现。该方法在simpletest页上有详细描述:
<?php
public static function getInfo() {
// Note: getInfo() strings should not be translated.
return array(
'name' => 'Simpletest Example unit tests',
'description' => 'Test that simpletest_example_empty_mysql_date works properly.',
'group' => 'Examples',
);
}
?>
我们写完getInfo()后,就可以正式写我们的单元测试。所有的单元测试方法应该以小写’test’开始。所有用这种方法开始的都自动被simpletest识别,然后按要求运行。尽管不同的判断语句可以放到不用的方法中,但是推荐一次性测试不同的判断语句,这可由如下方法实现:
<?php
function testEmptyMySQLDate() {
$result = simpletest_example_empty_mysql_date(NULL);
// Note: Test output messages should not be translated.
$message = 'A NULL value should return TRUE.';
$this->assertTrue($result, $message);
$result = simpletest_example_empty_mysql_date('');
$message = 'An empty string should return TRUE.';
$this->assertTrue($result, $message);
$result = simpletest_example_empty_mysql_date('0000-00-00');
$message = 'An "empty" MySQL DATE should return TRUE.';
$this->assertTrue($result, $message);
$result = simpletest_example_empty_mysql_date(date('Y-m-d'));
$message = 'A valid date should return FALSE.';
$this->assertFalse($result, $message);
}
?>
好,以上就是我们的全部测试代码。很明显,在语句前你需要做复杂的安装,但是单元测试还是比由DrupalWebTestCase提供的全面性的功能测试简单的多。
写完单元测试,清空缓存后,对Drupal6和Drupal7分别进入如下目录来运行测试。