Chinaunix首页 | 论坛 | 博客
  • 博客访问: 683755
  • 博文数量: 132
  • 博客积分: 10060
  • 博客等级: 上将
  • 技术积分: 1732
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-21 12:35
个人简介

迷惘的码农。

文章分类

全部博文(132)

文章存档

2013年(1)

2011年(2)

2010年(9)

2009年(41)

2008年(79)

我的朋友

分类:

2008-03-27 13:20:38

第 10 章 未完成和跳过的测试

未完成的测试

当你在处理一个新的测试用例类时,可能想由编写空测试方法开始,像这样:

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作为说明性信息。

阅读(2088) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~