请输入您要查询的百科知识:

 

词条 phpunit
释义

什么是PHPUnit

PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。

单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试,最后它还可以和Selenium整合来完成大型的自动化集成测试。

如何部署PHPUnit

方法一: 使用Pear

运行 pear channel-discover pear.phpunit.de;

pear install phpunit/PHPUnit

方法二 :手动安装

1 从http://pear.phpunit.de/get/下载软件包并解压

2 把解压后的目录加入php.ini中的include_path

3 将脚本pear-phpunit改名为phpunit

4 将phpunit脚本中的@php_bin@替换成php可执行脚本的路径

5 为phpunit脚本增加可执行权限并加入$PATH

6 将PHPUnit/Runner/Version.php中的@package_version@替换成3位

PHPUnit版本号

下面的例子用来测试sizeof函数工作的正确性

<?php

require_once 'PHPUnit/Framework.php';

class ArrayTest extends PHPUnit_Framework_TestCase {

public function testNewArrayIsEmpty() {

/*Create the Array fixture*/

$fixture = array();

/* Assert that the size of the Array * fixture is 0*/

$this->assertEquals(0, sizeof($fixture));

}

public function testArrayContainsAnElement() {

/* Create the Array fixture*/

$fixture = array();

/*Add an element to the Array * fixture*/

$fixture[] = 'Element';

/*Assert that the size of the * Array fixture is 1*/

$this->assertEquals(1, sizeof($fixture));

}

}

?>

要点:

1 编写的测试用例是一个php脚本

2 require_once 'PHPUnit/Framework.php'是必须的,另外,你需要在测

试用例脚本中包含你需要测试的代码

3 测试用例的主体必须写在类中,类名必须和文件名保持一致,还必须是

PHPUnit_Framework_TestCase的子类

4 每一个测试用例都是一个public的成员函数,必须以test开头

5 程序的输出使用assert*系列函数来进行验证

该用例需要在Shell下键入phpunit ArrayTest.php来运行。结果如下示:

[username@machine xx]$ phpunit ArrayTest.php

PHPUnit 3.1.3 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests)

结果中最重要的用红色标出的结果,点号 代表一个用例通过(即assert系列函数都通过)。如果将上面的测试用例testArrayContainsAnElement用例assertEquals函数中的1改为0,则运行结果为:

PHPUnit 3.1.3 by Sebastian Bergmann.

.F

Time: 0 seconds

There was 1 failure:

1) testArrayContainsAnElement(ArrayTest)

Failed asserting that <integer:1> matches expected value <integer:0>.

/home/wiki/apache/htdocs1.5.0/ArrayTest.php:29

FAILURES!

Tests: 2, Failures: 1.

可以很明显看出结果由原来的 .. 变为 .F ,F表示第二个测试用例未通

过,并且具体与哪一条验证不符都在后有详细说明。

除了F外,一个测试用例还有I(未完成),S (跳过),E (错误)三种状态,详见

PHPUnit如何保证测试的准确性

测试用例之间必须保证他们之间是不互相影响的,即这些测试用例无论以任何顺序执行,他们的结果都应该一样。PHPUnit提供了两个可供重写的函数来满足此要求。

成员函数setUp在每一个测试用例开始之前执行,用来创建用于测试的环境。tearDown则在每个测试用例结束时调用,用于还原测试用例对环境带来的影响。

上示的测试用例中$fixture = array()就可以放在setUp中完成

PHPUnit还支持哪些高级功能

结合XDebug生成代码覆盖率报告

如何测试你的测试用例设计,答案是代码覆盖率。代码覆盖率即当你的

一套测试用例执行完毕时,有多少比例的代码分支被覆盖到。

PHPUnit的代码覆盖率报告需要另一个优秀的Extension——XDebug

支持。当执行完测试用例后,得出的结果类似

下图:

图中绿色高亮的行代表测试用例有覆盖,红色相反。而左边的数字代表

此行代码被执行过几次。

代码覆盖率报告对指导我们编写测试用例将有极大的帮助,详见

http://www.phpunit.de/pocket_guide/3.2/en/code-coverage-analysis.html

结合Phing完成自动化部署

Phing(http://www.phing.info/trac/ )是一个基于Apache Ant的加

快PHP项目部署的工具。当在一个新环境部署PHP项目时,代码的正确性

不能得到保证,这就需要在部署之前做针对性的测试,只有测试通过整个

过程才能继续。Phing使用XML文件定义部署过程,其中测试部分动作可

以使用PHPUnit完成,下面是一个

示例性的部署文件:

<?xml version="1.0"?>

<project name="BankAccount" basedir="." default="test">

<target name="test">

<phpunit haltonfailure="true" printsummary="true">

<batchtest>

<fileset dir=".">

<include name="*Test.php"/>

</fileset>

</batchtest>

</phpunit>

</target>

</project>

其中需要部署的模块名为BankAccount,动作为test,使用测试工具

为phpunit,所有的测试用例文件为*Test.php。

如果一切正常,使用Phing部署后可以得到类似下面的结果:

phing

Buildfile: /home/sb/build.xml

BankAccount > test:

[phpunit] Tests run: 4, Failures: 0, Errors: 0, Time elapsed: 0.00067 sec

BUILD FINISHED

Total time: 0.0960 seconds

当然,如果build失败则你应该根据测试失败的提示来debug你的程序。

结合Selenium做大型自动化集成测试

前述的测试都是单元测试,测试的输入都是基于变量和类,而非基于用

户行为,例如浏览器的点击。在软件工程定义中,集成测试是在单元测试之

后的更高级别的测试,用PHPUnit作基于浏览器的自动化集成测试需要

Selenium的支持。Selenium(http://www.openqa.org/selenium/ )是一

个完整基于浏览器做集成测试的框架。它通过在页面中嵌入js来模拟用户

行为。Selenium的经典架构如图:

可以看出,我们需要一个额外的Selenium Server来负责转发HTTP请求和执行用户动作。除此之外,剩下的就是在利用Selenium RC For PHP编写测试用例。PHPUnit集成了Selenium的API接口,通过直接调用Selenium的API即可完成测试动作和结果验证,一个典型的测试如下:

<?php

set_include_path(get_include_path().PATH_SEPARATOR.'./PEAR/');

require_once 'Testing/Selenium.php';

require_once 'PHPUnit/Framework/TestCase.php';

class GoogleTest extends PHPUnit_Framework_TestCase {

private $selenium;

public function setUp() {

$this->selenium = new Testing_Selenium("*firefox", "http://www.google.com");

$this->selenium->start();

}

public function tearDown() {

$this->selenium->stop();

}

public function testGoogle() {

$this->selenium->open("/");

$this->selenium->type("q", "hello world");

$this->selenium->click("btnG");

$this->selenium->waitForPageToLoad(10000);

$this->assertRegExp("/Google Search/", $this->selenium->getTitle());

}

}

?>

可以看出,测试用例书写方法并没有很大的区别。在setUp中用指定浏览器打开www.google.com,然后在表单q中提交查询hello world并点击,最后等待页面load完毕后校验新的url中是否包含/Google Search/。

当然,Selenium还提供了更为丰富的API,例如验证某个表单的值等等。

PHPUnit的发展如何

PHPUnit已经受到了Zend官方和社区的大力支持。最新版本3.1.8已于9月初发布,不仅修正bug,还对mock object,日志和测试用例框架生成做了更进一步的支持。同时,它也将更容易和PHP的其他优秀工具进行整合来完成更为复杂的任务,详见:

http://www.phpunit.de/wiki/ChangeLog#PHPUnit3.1.802-Sep-2007

PHPUnit能给我们带来什么?

单元测试在现代软件开发过程中占据着愈发重要的地位,尤其是敏捷开发。所以,高质量的单元测试是保证项目质量的基础。

单元测试也为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。

同时,编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。

然后,单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。

最后,自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。

如何更高效的利用PHPUnit进行单元测试

在用PHPUnit做单元测试时,我们可以借鉴先写测试和测试驱动编码的思想,将代码编写的更加模块化,减少耦合,并且以完成实际功能为目标。这样的代码将会有更高的可测性,会大大提高我们的测试效率。

RD如何利用PHPUnit

1. 利用PHPUnit进行Debug,完成单元自测;

2. 向scm提交测试用例代码并保持同步;

3. 获得测试用例的代码覆盖率并规定一个阈值(75%?),低于阈值的测试用例不能通过单元测试;

4. 通过QA的反馈改进RD的测试用例;

5. 结合Phing在部署新环境时利用PHPUnit验证代码在新环境下的正确性;

6. 结合Selenium做大规模的自动化集成测试,提高提测代码质量;

另外,按照软件工程定义的测试用例设计经验,测试代码应该是程序代码量的1.2-1.5倍。虽然初期编写有一定的代价,但和带来的效用还是没有可比性的。

QA如何利用PHPUnit

1. 通过阅读RD的测试用例设计来更进一步了解项目设计和功能;

2. 通过QA的角度向RD反馈测试用例设计中的缺陷;

3. 自行编写测试用例进行测试;

方法一 使用Pear

运行 pear channel-discover pear.phpunit.de;

pear install phpunit/PHPUnit

方法二 手动安装

1. 从http://pear.phpunit.de/get/下载软件包并解压;

2. 把解压后的目录加入php.ini中的include_path;

3. 将脚本pear-phpunit改名为phpunit;

4. 将phpunit脚本中的@php_bin@替换成php可执行脚本的路径;

5. 为phpunit脚本增加可执行权限并加入$PATH;

6. 将PHPUnit/Runner/Version.php中的@package_version@替换成3位PHPUnit版本号。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/14 12:13:02