博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

流水孟春

以前使用的博客 webvista.cublog.cn
lib.cublog.cn
PHPUnit袖珍指南 (3-5章)

第三章PHPUnit的目的

到此为止,我们只有两个对Array和内建函数sizeof()的测试。当我们开始测试大量的array_*()函数时,每个都需要一个测试。我们可以每个都从头写起。但是,更好的方法是一次性写好一个测试基础构架,以后就只用写每个测试不同的部分。PHPUnit就是这样一个基础构架。

5展示了如何用PHPUnit重写例4中的两个测试。

 

5 PHPUnit测试 Arraysizeof().

<?php
require_once 'PHPUnit2/Framework/TestCase.php';
 
class ArrayTest extends PHPUnit2_Framework_TestCase {
  public function testNewArrayIsEmpty( ) {
    // 创建数组fixture
    $fixture = Array( );
 
    // 断言数组fixture的大小是0
    $this->assertEquals(0, sizeof($fixture)); 
  }
  public function testArrayContainsAnElement( ) { 
    // 创建数组fixture
            $fixture = Array( );
 
    // 为数组fixture增加一个成员。
            $fixture[] = 'Element';
 
            //断言数组fixture的大小是1
            $this->assertEquals(1, sizeof($fixture));
  }
}
?>

 

5告诉我们用PHPUnit来写测试的基本步骤是:

1.    Class的测试类是ClassTest

2.    ClassTest一般继承PHPUnit2_ Framework_TestCase

3.    测试是公有方法,没有参数,名字是test*

4.    在测试方法中,断言函数,如assertEquals()(见表6)用于断言实际值是否匹配期望值。

 

一个如PHPUnit的框架需要解决一系列问题,有些看起来互相冲突。测试必须同时满足以下条件:

 

易学

测试必须容易学,否则,开发人员不会去学

 

易开发

测试必须容易开发,否则,开发人员不会去开发

 

易读

测试代码必须没有外部关系,这样测试本身不会在杂乱无章中迷失。

 

容易执行

测试应该很容易执行,执行的结果以一种清楚和明确的格式表达出来。

 

快速执行

测试应该执行的很快,这样每天才能执行上千次。

 

代码隔离

测试之间不能互相影响,测试顺序的改变不应该影响结果。

 

可组合的

我们应该可以以任何组合来运行测试,这是代码隔离的一个必然结果。

 

这些约束条件有两个主要的冲突

 

易学vs易开发

测试通常不需要应用到编程全部的灵活性。很多测试工具提供了它们自己的测试脚本语言,这些语言只有书写测试所需特性的最小集,因为没有噪声来干扰你的测试内容,写出来的测试易读易写。但是学一种新的编织邮件和一套工具还是不方便的,容易混淆视听。

 

 

代码隔离vs快速执行

如果你想要一个测试的结果不影响另一个,每个测试在开始运行的阶段,都需要创建测试的全专题,返回后又要恢复运行之前的状态。可是,设置状态需要的时间很长(如,连接到数据库,用真实数据初始化到一个已知状态)

 

PHPUnit解决这个问题的办法是采用PHP作为测试语言。有时,全功能的PHP对于书写短小的,直接的测试是过于强大了,不过,我们利用的程序员已经有使用PHP的全部经验。因为我们需要说服勉强的测试人员,降低书写这些初始测试的门槛是及其重要的。

 

4 安装PHPUnit

PHPUnit可以通过PHP扩展和程序库(PEAE)获得。PEAR是可重用PHP组件的框架和分发系统。安装PHPUnit可以通过PEAR安装程序命令获得:

 

pear install PHPUnit2

 

根据PEAR的版本命名标准,适用于PHP5PHPUnit包称为PHPUnit2PHPUnit是适用于PHP4的包,这在本书后面关于“在PHP4中使用PHPUnit”一章会提到。

 

安装只有,能够在本地的PEAR目录中找到PHPUnit的源代码,路径通常是/usr/lib/ php/PHPUnit2

 

尽管使用PEAR安装程序是PHPUnit唯一支持的安装方法,但你还是可以手工安装。要手工安装,参照以下做法:

1.        http://pear.php.net/package/PHPUnit2/download下载PHPUnit发布包,然后解压缩,确保目录在php.ini定义的include_path中。

2.        准备phpunit脚本

a.             pear-phpunit脚本改名为phpunit

b.             将脚本中所有的@php_bin@改名为PHP命令行解释器所在的目录(通常为/usr/bin/ php)。

c.             将此脚本拷贝到一个PATH环境变量所包含的目录中,并将文件属性改为可执行(chmod +x phpunit)

3.        PHPUnit2/ Runner/Version.php脚本中的所有@package_version@字符串替换为你所安装的PHPUnit版本(如2.3.0)。

 

第五章 命令行测试工具

PHPUnit命令行测试工具是通过phpunit命令调用的。如下代码显示如何通过PHPUnit命令行测试工具运行测试。

phpunit ArrayTest
PHPUnit 2.3.0 by Sebastian Bergmann.
 
Time: 0.067288
 
OK (2 tests)

 

对每个测试,PHPUnit命令行测试工具打印一个字符表示进程:

u       测试成功打印“.”。

u       运行测试方法是发生了断言失败打印“F”。

u       运行测试方法是发生了错误打印“E”。

u       测试没有完成或测试没有实现打印“I”(见本书后“未完成的测试”一章)。

 

PHPUnit可以区分失败和错误。一个失败是PHPUnit的断言违例,错误是一个意料外的异常或一个PHP错误。有时候这种差别是有用的,因为错误相比失败更容易修正。如果你有一大串问题列表,最好先解决所有错误,然后看看有没有失败遗留下来。

 

让我们看看如下一些代码命令行测试工具的选项:

phpunit --help
PHPUnit 2.3.0 by Sebastian Bergmann.
 
Usage: phpunit [switches] UnitTest [UnitTest.php]
 --coverage-data <file> Write code-coverage data in raw format to file.
 --coverage-html <file> Write code-coverage data in HTML format to file.
 --coverage-text <file> Write code-coverage data in text format to file.
 --testdox-html <file> Write agile documentation in HTML format to file.
 --testdox-text <file> Write agile documentation in Text format to file.
 --log-xml <file>    Log test progress in XML format to file.
 --loader <loader>   TestSuiteLoader implementation to use.
 --skeleton       Generate skeleton UnitTest class for Unit in Unit.php.
 --wait         Waits for a keystroke after each test.
 --help         Prints this usage information.
 --version       Prints the version and exits.

 

phpunit UnitTest

 

运行类UnitTest提供的测试,该类应该定义在源文件UnitTest.php中。

UnitTest必须继承PHPUnit2_Framework_TestCase类,或是提供了公有静态方法suite,并返回PHPUnit2_ Framework_Test对象的类(例如,类PHPUnit2_Framework_TestSuite的一个实例)

 

phpunit UnitTest UnitTest.php

 

运行类UnitTest提供的测试,该类要定义在命令指定的源文件(UnitTest.php)中。

 

--coverage-data, --coverage-html, and --coverage-text

控制运行测试的代码覆盖信息的分析和集合(参见本书后代码覆盖分析一节)

 

--testdox-html and --testdox-text

HTML或普通文本格式生成运行测试的敏捷文档(参见本书后的“测试的其他用途”一章)

 

--log-xml

 

生成运行测试的XML格式的日志文件。

下一个例子显示为ArrayTest中的测试生成的XML日志文件。

<?xml version="1.0" encoding="UTF-8"?>

<testsuites>

<testsuite name="ArrayTest" tests="2" failures="0" errors="0" time="0.020026">

    <testcase name="testNewArrayIsEmpty" class="ArrayTest" time="0.014449"/>

    <testcase name="testArrayContainsAnElement" class="ArrayTest" time="0.005577"/>

</testsuite>

</testsuites>

下面的XML日志文件是为名为FailureErrorTest的测试类两个测试生成的,一个是testFailure,一个是testError。这显示了失败和错误是如何分别表示的。

<?xml version="1.0" encoding="UTF-8"?>

<testsuites>

<testsuite name="FailureErrorTest" tests="2" failures="1" errors="1" time="0.013603">

        <testcase name="testFailure" class="FailureErrorTest" time="0.011872">

               <failure message="" type="PHPUnit2_Framework_AssertionFailedError"></failure>

        </testcase>

        <testcase name="testError" class="FailureErrorTest" time="0.001731">

               <error message="" type="Exception"></error>

        </testcase>

</testsuite>

</testsuites>

 

--loader

 

指定将要使用的测试套件加载器。

标准测试套件加载器会在当前工作目录和PHPinclude_path configuration指令定义的路径中寻找源文件。按照PEAR的命名规则,形如Project_Package_Class的类名会映射到的源文件为Project/Package/Class.php

 

--skeleton

 

为类Unit(在文件Unit.php中)生成一个名为UnitTest(在文件UnitTest.php中)的测试用例类的框架。对原始类的每个方法,在生成的测试用例类中提供了一个未完成的测试用例(见本书后的“未完成测试”部分)。

下面的例子显示了如何为一个名为Sample的类生成一个测试类的框架。

phpunit --skeleton Sample

PHPUnit 2.3.0 by Sebastian Bergmann.

 

Wrote test class skeleton for Sample to

SampleTest.php.

 

phpunit SampleTest

PHPUnit 2.3.0 by Sebastian Bergmann.

 

I

 

Time: 0.007268

There was 1 incomplete test case:

1) testSampleMethod(SampleTest)

 

OK, but incomplete test cases!!!

Tests run: 1, incomplete test cases: 1.

 

当你为现有代码书写测试时,你不得不重复很多相同的代码片断,如:

public function testSampleMethod( ) {

}

 

PHPUnit能帮助你分析现有代码,生成测试用例类的框架。

 

--wait

 

每个测试结束时,等待一次击键。这很有用,特别是你在一个只有测试一直运行在打开的窗口中运行测试时。

 

提示

当被测试代码中有PHP语法错误时,文本界面的测试会直接退出,不输出任何错误信息。标准的测试套件加载器会检查测试套件的源文件的PHP语法错误,但是,它不会检查测试套件包含的源文件的语法错误。PHPUnit的未来版本会用在砂箱中PHP解释器类解决这个问题。

 

 

 

 原文地址 http://csdn
发表于: 2007-02-05,修改于: 2007-02-05 17:34,已浏览570次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:10.25951