迷惘的码农。
分类:
2008-03-27 13:20:38
当你在处理一个新的测试用例类时,可能想由编写空测试方法开始,像这样:
public function testSomething()
{
}
以明了要编写哪些测试。空测试方法的问题是PHPUnit框架把它们解释为成功。这个误解导致测试报告实效-你没法判断测试是实际上成功了还是仍未完成。在未实现的测试方法中调用$this->fail()
也没有帮助,因为此后测试将被解释为失败。这将同解释未实现的测试为成功一样都是错误的。
如果我们分别将成功的测试和失败的必做绿灯和红灯,我们还需要黄灯标记未完成或未实现的测试。PHPUnit_Framework_IncompleteTest
是个标记接口,用于标记当测试结果为未完成或当前未实现时引发的异常。PHPUnit_Framework_IncompleteTestError
是该接口的标准实现。
先是一个测试用例类,SampleTest
,它含有一个测试方法testSomething()
。通过在该方法中调用方便的markTestIncomplete()
方法(自动引发PHPUnit_Framework_IncompleteTestError
异常),我们把这个测试标记为未完成。
范例 10.1: 标记测试为未完成
require_once 'PHPUnit/Framework.php';
class SampleTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
//可选:随便测试什么都可以。
$this->assertTrue(TRUE, 'This should already work.');
// 在这儿停住并将测试标记为未完成。
$this->markTestIncomplete(
'This test has not been implemented yet.'
);
}
}
?>
在PHPUnit命令行测试启动器的输出中,未完成的测试由I
表示,如下面的例子所示:
phpunit --verbose SampleTest
PHPUnit 3.2.10 by Sebastian Bergmann.
SampleTest
I
Time: 0 seconds
There was 1 incomplete test:
1) testSomething(SampleTest)
This test has not been implemented yet.
/home/sb/SampleTest.php:14
OK, but incomplete or skipped tests!
Tests: 1, Incomplete: 1.
显示用于将测试标记为未完成的API。
表 10.1. 未完成测试的API
方法 | 含义 |
---|---|
void markTestIncomplete() | 标记当前测试为未完成。 |
void markTestIncomplete(string $message) | 标记当前测试为未完成,同时使用$message 作为说明性信息。 |
特定的环境中并非所有的测试都能运行。考虑个例子,一个具有多个驱动以支持不同数据库系统的数据库提取层。MySQL驱动的测试当然只能在MySQL服务器上运行。
显示一个测试用例,DatabaseTest
,它有个测试方法,testConnection()
。在测试用例类的模板方法setUp()
中,我们检查MySQLi扩展是否可用,否则使用markTestSkipped()
方法跳过测试。
范例 10.2: 跳过一个测试
require_once 'PHPUnit/Framework.php';
class DatabaseTest extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
if (!extension_loaded('mysqli')) {
$this->markTestSkipped(
'The MySQLi extension is not available.'
);
}
}
public function testConnection()
{
// ...
}
}
?>
在PHPUnit命令行测试启动器的输出中,未完成的测试由S
表示,如下面的例子所示:
phpunit --verbose DatabaseTest
PHPUnit 3.2.10 by Sebastian Bergmann.
DatabaseTest
S
Time: 0 seconds
There was 1 skipped test:
1) testConnection(DatabaseTest)
The MySQLi extension is not available.
/home/sb/DatabaseTest.php:11
OK, but incomplete or skipped tests!
Tests: 1, Skipped: 1.
显示用于跳过测试的API。
表 10.2. 用于跳过测试的API
方法 | 含义 |
---|---|
void markTestSkipped() | 标记当前测试为要跳过的。 |
void markTestSkipped(string $message) | 标记当前测试为要跳过的,同时用$message 作为说明性信息。 |