原文:Drupal SimpleTest coding standards http://drupal.org/node/325974 编写测试代码时,您应遵守这些命名约定的。
命名约定
Drupal 8
namespace Drupal\$module\Tests;
use Drupal\simpletest\[Web|Unit|DrupalUnit]TestBase;
Foo[Unit]Test extends [Web|Unit|DrupalUnit]TestBase
Drupal的6/7
Foo[Unit]Test extends [Web|Unit]TestCase
文件名称
- 对于模块,通常讲,如果是一个单独的test文件([module name].test),它应被直接放在模块文件夹中。
- 对于核心部分(core facilities)(所有的API函数,在文件夹“ includes/”下),测试文件应命名为:”[facility name].test“。被放在 ”modules/system/tests“文件夹。
- 如果测试代码,还需要其它文件(例如,隐藏模块,XML文件,图像等),他们应该被放在当前模块文件夹内的“/tests/”子文件夹下。
模拟模块
- 如果测试时,需要定义hooks,它可以创建一个模拟模块(mock module)。
- 这个模块应该被命名为[test file name]_test.module(及其相关的info文件,应该命名为:[test file name]_test.info)。
- 在.info文件中,添加属性为:“hidden= TRUE” ,以防止模块在界面列表中被激活。
测试函数命名
所有测试函数名称都应有前缀“test”。
拆分你的测试
当你正在对一个单独的函数做单元测试 (而不是进行模块页面功能测试), 每个测试函数应该专注在特定的函数操作方面而进行单元测试。 大而全的测试( "kitchen sink" )是常用于测试核心代码,但现在这不是一个好的的做法。测试应达到两个目的:
- 确保代码是以确定的方式在操作
- 提供一个可运行的代码使用案例
整体测试一般会失败,因为一旦一个部分的测试失败,在后面的测试因为级联也会失败。这使得它很难以隔离出错误所在的确切位置。为了独立的测试代码,你可以复制一些代码。但如果你复制的代码在大部分测试重复应用,应该创建一个setup()函数来重复调用这部分代码。但你必须为这个函数进行一个独立的测试。 下面是几个好的方面在编写较少的测试代码:
- 每个测试就变得非常简单,自我独立的例子。如何使用该功能时,可以试着回答这个问题:“鉴于这些输入,我可以期待什么样的行为?”
- 由于每次测试只着眼于一个单一的方面,你会发现,你更愿意去测试外围边缘的代码部分。与大而全的测试不同,你将不必担心用一个额外的测试去中断。
测试模版
在PHP的开始标签后,注释标签第一个空行后,用@file来描述文件:
<?php
/**
* @file
* Tests for Aggregator module.
*/
?>
或者
<?php
/**
* @file
* Tests for common.inc.
*/
?>
这个@file描述,应该是对这个测试文件的一个简单的概述。 无论是模块文件或其它文件,都可以使用。
<?php
/**
* Functional tests for the Kitten Basket.
*/
class KittenBasketTestCase extends DrupalWebTestBase {
?>
以上的类的注释是必须的,也就是一个改写的getInfo()函数的名称(“kitty猫篮子的功能' - >'功能测试kitty猫篮子”)。
<?php
public static function getInfo() {
return array(
'name' => 'Kitten basket functionality',
'description' => 'Move kittens in and out of their basket and assert that none of them were hurt in the process.',
'group' => 'Kitten basket',
);
}
?>
- 最先开始的函数必须是getInfo()。
- 'name','description' 和'group'是不用使用 t()函数。
- 'name',名称应简短,不应包含任何句号。它应该是子系统被测试的简单描述; 例如,“用户访问规则”或“创建/删除菜单链接”。
- 'description',描述应该为一个动词来描述这个测试。结尾应该有句号。
- 'group',组应该是可读的模块名称(节点,统计),或Drupal的可读名称(Form API或XML-RPC)。
- 因为采用继承的方法,这个函数是没有PHPDoc的。
<?php
public function setUp() {
parent::setUp('kitten_module', 'basket_module');
// Setup tasks go here.
}
?>
- setUp()函数是可选的。如果您的测试是针对特定模块,确保传递每个模块的名称作为参数去setUp()函数,它会自动启用。如果该模块不执行任何特定的设置,它不应该被定义。
- 在每个测试函数被调用之前和之后,setUp()和tearDown()函数都会被调用。
- 因为采用继承的方法,这个函数是没有PHPDoc的。
<?php
public function tearDown() {
// Teardown tasks go here.
parent::tearDown();
}
?>
- 除非在非常特殊的情况下,tearDown()函数一般不应该被使用。 SimpleTest将删除掉测试数据库,所以在setUp()中,你不是必须去撤消安装执行任务。
- 在每个测试函数被调用之前和之后,setUp()和tearDown()函数都会被调用。有没有此功能的PHPDoc的,因为它是一种遗传性的方法。
- 因为采用继承的方法,这个函数是没有PHPDoc的。
<?php
/**
* One-sentence description of what test entails.
*/
public function testExampleThing() {
// Assertions, etc. go here.
}
/**
* One-sentence description of what test entails.
*/
public function testNextExampleThing() {
// Assertions, etc. go here.
}
// Can have many more testFoo functions.
}
?>