会员登陆  支付方式  联系我们  在线客服  网站地图       
首页 关于域浪 互联网数据中心业务、主机托管、主机租用、机架租用、带宽租用、机房介绍、机房对比、CCN网络加速 adsl专线、深圳adsl专线 虚拟主机、域名注册、数据库、企业邮局、动态域名 网络安全、网络临近平台、安全服务、防火去墙租用、安全产品、域浪抗DDOS防火墙、NetScreen防火墙 技术支持  
   当前位置:首页 >> 技术支持 >> PHP编程技巧 >> 用phpUnit帮你调试php程序
 
精华文章
    一个用PHP实现的UBB类  
    为吸引Oracle用户 IBM...  
    用PHP连mysql和oracle...  
    用PHP发邮件  
    在PHP中使用灵巧的体系...  
    使用PHP连接LDAP服务器...  
    PHP中的Java扩展  
    一个简单的PHP投票系统...  
    用PHP写超级简单的发送...  
    用PHP处理多个同名复选...  
    定制php4的session功能...  
    在PHP中实现进程间通讯...  
    用PHP实现文件上传二法...  
    php做柱型图的函数  
    用PHP实现上传的ZIP文...  
    ASP判断文件地址是否有...  
    PHP做Shell语言  
    用PHP动态生成虚拟现实...  
    PHP4.0数组相关函数的...  
    PHP应用提速面面观  
    怎样用PHP来给网页做导...  
    如何用php作线形图的函...  
    用javascript+PHP随机...  
    用phpUnit帮你调试php...  
    将PHP作为Shell脚本语...  
    用PHP调用数据库的存贮...  
    php中分页显示文章标题...  
    PHP生成动态WAP页面  
  更多>>  
   PHP编程技巧
 用phpUnit帮你调试php程序
    调试程序是一个漫长的过程,程序越长越复杂,调试起来就愈加困难。如果你调试的是php程序,那么不妨采用phpUnit,它可以大大加快你的调试速度。 

何谓PhpUnit 

    Phpunit 脱胎于Fred Yankowski编写的著名的Junit测试框架。你可以到它的网站http://www.ontosys.com/phiki/phpunit下载最新的版本。你可以利用phpUnit编写一套测试软件包。保证你的程序代码正确无误。只需一步便可自动完成所有的测试。 

    如果监测到bug,你就可以再写一小段测试代码来找出错误之所在。日后若再有相同的bug出现,只要运行你先前的测试包,马上就可以抓到它。经常运行测试包便可以保证你的程序代码的强壮性。 

开 始 

假设我们有一个银行账务处理程序。现在需要为Account (账户) 类编写一个测试软件包。 

以下是Account类 源代码: 

<?php 

  

class Account{ 

var $balance; 

function Account($initialBalance=0){ 

$this->balance = $initialBalance; 



function withdraw($amount){ 

$this->balance -= $amount; 



function deposit($amount){ 

$this->balance += $amount; 



function getBalance(){ 

return $this->balance; 



function transferFrom(&$sourceAccount,$amount){ 

$sourceAccount->withdraw($amount); 

$this->deposit($amount); 



?> 

  

创建一个测试类 

  

    首先,我们建立一个测试类AccountTest,它是一个由PhpUnit提供的TestCase的子类。在这个TestCase类中有2个基本的方法:setUp和tearDown。 这2个方法的实现在父类中是空过程,必须由我们自己去重载。其中SetUp 用于进行AccountTest类的初始化处理。在本例中,我们对一些在测试中用到的账号进行初始化。tearDown 则用于AccountTest类的清空处理,在本例中无需使用。因此,就不对它进行重载。这样AccountTester类的源代码如下:   

<?php 

  

class AccountTester extends TestCase{ 

var $_ac1; 

var $_ac2; 

var $_ac3; 

var $_ac4; 

  

function AccountTester($name){ 

$this->TestCase($name); // call parent constructor 



function setUp(){ 

$this->_ac1 = new Account(100); // data for testWithdraw 

$this->_ac2 = new Account(20); // data for testDeposit 

$this->_ac3 = new Account(30); // data for testTransferFrom 

$this->_ac4 = new Account(50); 





?> 

  

加入专门的测试代码 

现在,我们可以往向AccountTester类加入测试代码了。 

  

<?php 

  

// Make a withdrawal of 25 units from _ac1. 

// _ac1's initial balance is 100 

  

function testWithdraw(){ 

$this->_ac1->withdraw(25); 

$this->assert($this->_ac1->getBalance() == 75); // 100 - 25 = 75 



  

// Make a deposit of 10 units into _ac2. 

// _ac1's initial balance is 20 

  

function testDeposit(){ 

$this->_ac2->deposit(10); 

$this->assertEquals(30,$this->_ac2->getBalance()); //20 +10 = 30 



   

// Tranfers 10 units from _ac3 to _ac4 

// _ac3's initial balance is 30 

// _ac4's initial balance is 50 

  

function testTransferFrom(){ 

$this->_ac4->transferFrom(&$this->_ac3,10); 

$this->assertEquals(20,$this->_ac3->getBalance(),"Source account balance incorrect"); // 30 - 10 = 20 

$this->assertEquals(60,$this->_ac4->getBalance(),"Target account balance incorrect"); // 50 + 10 = 60 



  

?> 

  

    这段代码中,assert(如同C里的断言)方法是测试的关键部分。如果在assert中的条件表达式为真,那么测试通过。否则返回错误。由于assert方法大都用于判断两个变量的值是否相等。因此,testclass类引入了assertEquals方法专门实现这个功能。AssertEquals方法中有3个参数,依次分别为:期望值,测试值,两值不相等时返回的消息提示串。 

运行测试过程 

    好了,现在可以运行一下我们编好的测试程序了。我们还必须建立一个runtest.php测试程序来运行所有的测试过程。 

  

runtest.php源代码如下:  

<?php 

$tSuite = new TestSuite(); //creation of the test suite object 创建测试套件对象 

$tSuite->addtest(new AccountTester("testWithdraw")); //Add inidividual tests 

$tSuite->addtest(new AccountTester("testDeposit")); //加入专门测试方法。 

$tSuite->addtest(new AccountTester("testTransferFrom")); 

$res = new TextTestResult(); //Creation of the Result 建立一个测试结果类 

$tSuite->run(&$res); //Run of the test 运行测试 

$res->report(); //Print results 输出测试结果。 

?> 

  

程序说明: 

    首先创建测试套件对象tSuite,然后逐一加入专门测试方法,addtest方法的参数是测试方法的 再创建测试报告对象,随之运行测试。测试发现错误的结果由TestResult类捕捉,TestResult可以定制一套text/html的错误报告。如果有必要你也可以自己编写输出部分。测试结果封装在TestResult类中,为了输出测试结果。我们采用了phpUnit提供的另外一个类TextTestResult类,它可以输出文本或超文本格式的报告。当然我们也可以自己定制一个新的TestResult的子类控制更复杂的输出格式。 

  

提示和技巧 

1、在编写一个新的测试套件完成之后,我们可以先引入一个小小的bug以证明测试套件可以正常运行。 

比如,在本例account类中,我们故意引入一个有问题的函数。 

<?php 

function withdraw($amount){ 

$this->balance -= $Amount; 

// 变量名大小写错误,本意是调用$amount参数,结果引入一个新变量$Amount。 



?> 

    好,现在让我们运行测试套件,如果不出意外的话,我们将很快发现错误之处。 

2.要指出的是,并非所有的方法都需要测试。你只需对相关的方法进行测试。 

3.如果在开始编码前就写好测试代码,会使你更进一步明白你的程序到底需要完成什么样的任务。 

   现在,通过引入phpUnit的测试套件类,你可以发现找bug的时间缩短了,而你作为一个程序员的工作效率也提高了。 
  • 上一篇文章: 用javascript+PHP随机显示图片
  • 下一篇文章: 将PHP作为Shell脚本语言使用
  • 域浪网络ISP经营许可证 深圳地址:深圳市罗湖区宝安北路国际商品交易大厦七楼C30室
    Tel:0755-82266883/82267566 Fax:0755-82261966
    邮编:518000 
                        Copyright © 2006-2008 elang.cn All Rights Reserved 深圳市域浪网络技术有限公司版权所有