跳转到主要内容
toto多背一公斤 提交于 9 February 2013

原文: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. } ?>