PHP单元测试利器 PHPUNIT初探第1/2页

2015-01-24信息快讯网

你是否在程序开发的过程中遇到以下的情况:当你花了很长的时间开发一个应用后,你认为应该是大功告成了,可惜在调试的时候,老是不断的发现bug,而且最可怕的是,这些bug是重复出现的,你可能发现这些bug之间会有关联,但却老是找不到问题的所在。

当你遇到以上这些令你沮丧的情况时,你一定会想能有什么更好的办法去解决呢?办法当然是有的!这就是使用单元测试。单元测试不但可以在一定程度上解决上述头疼的问题,而且能让代码变的容易维护,还可以能让你更多地对代码进行重构。

  一旦你编写好单元测试用例,当你需要修改你的代码时,你要做的事情就是重新运行你的单元测试用例并观察这些单元测试用例能否通过,如果通过了的话,证明代码是没问题的。

  人们往往会说:既然单元测试这么好,为什么那么多人还是不大愿意去写单元测试呢?有以下几种理解上的误曲:

  1、认为编写单元测试太浪费时间。虽然目前很多IDE工具都为编写单元测试建立好了框架,但还是要开发者编写一些单元测试的代码的。就象很多开发中的最佳实践一样,用正确的方法去做正确的事情会为开发节省大量的时间。每当新增加新功能时,你可能通过访问你的网页到处去点击手动测试,而运行建立好的单元测试用例其速度其实比通过手工去测试的速度更快。

  2、认为既然代码能运行了,不需要再编写单元测试。但假设团队中有新的成员,如果没有良好的单元测试用例,新成员很有可能随意地去编码而不考虑各种后果。如果有编写良好的单元测试,在程序运行时进行各种测试,则能最大程度避免bug的产生。

  3、认为编写单元测试代码枯燥无味。程序员的天性是解决问题,而很多程序员认为在紧张的编码工作时,还要编写单元测试代码,会很枯燥。但要知道的是,如果能通过编写单元测试在很早的阶段就能尽可能发现代码中多的错误的话,那么既节省时间减少了出错,何乐而不为?

  开始动手安装phpunit

  本文中将通过介绍php中的单元测试利器phpunit(http://phpunit.de/),并通过实际例子来讲解如何在实际工作中运用phpunit。首先安装phpunit的方法可以通过php下的pear去安装:

PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  pear channel-discover pear.phpunit.de
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  pear channel
-discover components.ez.no
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  pear channel
-discover pear.symfony-project.com
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    pear install phpunit
/PHPUnit

  如果你想通过手动方式去安装,可以参考phpunit的手册去安装(http://www.phpunit.de/manual/3.0/en/installation.html)。

  编写第一个单元测试用例

  下面我们开始编写第一个单元测试用例。在编写测试用例时,要遵守如下的phpunit的规则:

  1 一般地,在测试用例中,可以扩展PHPUnit_Framework_TestCase类,这样就可以使用象setUp(),tearDown()等方法了。

  2 测试用例的名字最好是使用约定俗成的格式,即在被测试类的后面加上”Test”,比如要测试的类为RemoteConnect,则测试用例的命名为RemoteConnectTest。

  3 在一个测试用例中的所有的测试方法,在命名时都应该以test+测试方法名去命名,如testDoesLikeWaffles(),要注意的是该方法必须是声明为public类型的。当然可以在你的测试用例中包含private的方法,但它们不能被phpunit所调用。

  4 测试方法中是不能接收参数的。

  下面首先举个简单的例子,代码如下:

PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网<?php
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网
class RemoteConnect
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网{
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  
public function connectToServer($serverName=null)
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  {
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    
if($serverName==null){
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网      
throw new Exception(“That's not a server name!”);
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    }
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    $fp = fsockopen($serverName,80);
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    return ($fp) ? true : false;
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  }
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  public function returnSampleObject()
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  {
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    return $this;
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  }
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网}
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网?>

   上面的代码其实是实现连接到一个指定的服务器的功能,那么我们可以编写测试代码如下:

PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网<?php
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网
require_once('RemoteConnect.php');
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网
class RemoteConnectTest extends PHPUnit_Framework_TestCase
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网{
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  
public function setUp(){ }
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  
public function tearDown(){ }
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  
public function testConnectionIsValid()
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  {
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    
// test to ensure that the object from an fsockopen is valid
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网
    $connObj = new RemoteConnect();
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    
$serverName = 'www.google.com';
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网    
$this->assertTrue($connObj->connectToServer($serverName) !== false);
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网  }
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网}
PHP单元测试利器 PHPUNIT初探第1/2页_信息快讯网
?>

   在上面的代码中,由于继承了PHPUnit_Framework_TestCase类,因此在setUp和tearDown方法中,不需要编写任何代码。SetUp方法是在每个测试用例运行前进行一些初始化的工作,而tearDown则在每个测试用例运行后进行一些比如资源的释放等工作。在测试方法中,通过使用phpunit的断言assertTrue去判断所返回的布尔值是否为真,这里是通过调用RemoteConnect.php中的connectToServe方法去判断能否连接上服务器。

php下载文件的代码示例
PHP sprintf() 函数的应用(定义和用法)
php 对输入信息的进行安全过滤的函数代码
PHP删除数组中的特定元素的代码
PHP安全性漫谈
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
php提示undefined index的几种解决方法
PHP中将字符串转化为整数(int) intval() printf() 性能测试
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
一些需要禁用的PHP危险函数(disable_functions)
PHP测试程序运行时间的类
PHP Web木马扫描器代码 v1.0 安全测试工具
PHP中创建空文件的代码[file_put_contents vs touch]
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
PHP导出MySQL数据到Excel文件(fputcsv)
php中将地址生成迅雷快车旋风链接的代码[测试通过]
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
PHP单元测试利器 PHPUNIT深入用法(二)第1/2页
php下安装配置fckeditor编辑器的方法
PHP如何抛出异常处理错误
php中实现记住密码自动登录的代码
防止用户利用PHP代码DOS造成用光网络带宽
php Smarty 字符比较代码
PHP的SQL注入实现(测试代码安全不错)
使用XDebug调试及单元测试覆盖率分析
PHP中删除变量时unset()和null的区别分析
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
php array_unique之后json_encode需要注意
php iconv() : Detected an illegal character in input string
smarty模板嵌套之include与fetch性能测试
Notice: Undefined index: page in E:\PHP\test.php on line 14
PHP类中Static方法效率测试代码
破解图片防盗链的代码(asp/php)测试通过
php 随机记录mysql rand()造成CPU 100%的解决办法
PHP 模拟$_PUT实现代码
PHP array_push 数组函数
©2014-2024 dbsqp.com