你在这里

Simpletest 的单元测试

原文链接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分别进入如下目录来运行测试。