PHPUnit
你能否在顺序开发的过程中遇到以下的状况:当你花了很长的工夫开发一个PHP应用后,你以为应该是功德圆满了,惋惜在调试的时分,老是不断的发现bug,而且最可怕的是,这些bug是重复呈现的,你能够发现这些bug之间会有相关,但却老是找不到问题的地点。
当你遇到以上这些令你懊丧的状况时,你必定会想能有什么更好的办法去处理呢?办法当然是有的!这就是运用单元测验。单元测验不光可以在必定程度上处理上述头疼的问题,而且能让代码变的简略保护,还可以能让你更多地对代码进行重构。
一旦你编写好单元测验用例,当你需求修正你的代码时,你要做的任务就是从头运转你的单元测验用例并调查这些单元测验用例能否经过,若是经过了的话,证明代码是没问题的。
大家往往会说:已然单元测验这么好,为什么那么多人仍是不大情愿去写单元测验呢?有以下几种了解上的误曲:
1、以为编写单元测验太浪费工夫。固然当前许多IDE东西都为编写单元测验树立好了结构,但仍是要开发者编写一些单元测验的代码的。就象许多开发中的最佳理论相同,用正确的办法去做正确的任务会为开发节约许多的工夫。每逢新添加新功用时,你能够经过拜访你的网页处处去点击手动测验,而运转树立好的单元测验用例其速度其实比经过手艺去测验的速度更快。
2、以为已然代码能运转了,不需求再编写单元测验。但假定团队中有新的成员,若是没有杰出的单元测验用例,新成员很有能够随意地去编码而不思索各种成果。若是有编写杰出的单元测验,在顺序运转时进行各种测验,则能最大程度防止bug的发生。
3、以为编写单元测验代码单调无味。顺序员的天分是处理问题,而许多顺序员以为在严重的编码任务时,还要编写单元测验代码,会很单调。但要晓得的是,若是能经过编写单元测验在很早的段落就能尽能够发现代码中多的过错的话,那么既节约工夫减少了犯错,何乐而不为?
开端着手装置PHPUnit
本文中将经过引见PHP中的单元测验利器PHPUnit(http://phpunit.de/),并经过实践比方来解说如安在实践任务中运用PHPUnit。首要装置PHPUnit的办法可以经过PHP下的pear去装置:
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
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 测验办法中是不能接纳参数的。
下面首要举个简略的比方,代码如下:
class RemoteConnect
{
public function connectToServer($serverName=null)
{
if($serverName==null){
throw new Exception(“That's not a server name!”);
}
$fp = fsockopen($serverName,80);
return ($fp) ? true : false;
}
public function returnSampleObject()
{
return $this;
}
}
?>
面的代码其实是完结连接到一个指定的服务器的功用,那么咱们可以编写测验代码如下:
require_once('RemoteConnect.php');
class RemoteConnectTest extends PHPUnit_Framework_TestCase
{
public function setUp(){ }
public function tearDown(){ }
public function testConnectionIsValid()
{
// test to ensure that the object from an fsockopen is valid
$connObj = new RemoteConnect();
$serverName = 'www.google.com';
$this->assertTrue($connObj->connectToServer($serverName) !== false);
}
}
?>
在上面的代码中,由于承继了PHPUnit_Framework_TestCase类,因此在setUp和tearDown办法中,不需求编写任何代码。SetUp办法是在每个测验用例运转前进行一些初始化的任务,而tearDown则在每个测验用例运转后进行一些比方资源的开释等任务。在测验办法中,经过运用PHPUnit的断语assertTrue去判别所回来的布尔值能否为真,这里是经过调用RemoteConnect.php中的connectToServe办法去判别能否连接上服务器。
接下来咱们运转这个单元测验,在命令行下输入代码:
phpunit /path/to/tests/RemoteConnectTest.php即可,可以看到测验顺畅经过的话,会输出以下成果:
PHPUnit 3.4 by Sebastian Bergmann
.
Time: 1 second
Tests: 1, Assertions: 1, Failures 0
可以看到,上面是经过了测验。默许状况下,PHPUnit是会运转测验用例中的一切测验办法的。下面再引见下PHPUnit中相关的几个断语:
AssertTrue/AssertFalse 断语能否为真值仍是假
AssertEquals 判别输出能否和预期的持平
AssertGreaterThan 断语成果能否大于某个值,相同的也有LessThan(小于),GreaterThanOrEqual(大于等于),
LessThanOrEqual(小于等于).
AssertContains 判别输入能否包括指定的值
AssertType 判别能否归于指定类型
AssertNull 判别能否为空值
AssertFileExists 判别文件能否存在
AssertRegExp 依据正则表达式判别
举个比方来阐明下比方AssertType的运用,仍然以上面的比方来说,可以用AssertType去判别returnSampleObject回来的对象实例能否为remoteConnect,代码如下:
function testIsRightObject() {
$connObj = new RemoteConnect();
$returnedObject = $connObj->returnSampleObject();
$this->assertType('remoteConnect', $returnedObject);
}
?>
当前PHP结构对单元测验的撑持
当前许多优异的PHP结构(如Zend Framework,Symfony等),都供给了对单元测验很好的撑持。以Zend Framework为例,阐明下其间是如何运转单元测验的。
class CommentControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
public function setUp()
{
parent::setUp();
}
public function tearDown()
{
parent::tearDown();
}
public function appBootstrap()
{
$this->frontController->registerPlugin(new Initializer('test'));
}
public function testGoHome()
{
$this->dispatch('/home');
$this->assertController('home');
}
}
?>
以上代码其实是对Zend自身的结构进行了一个单元测验罢了,可以看到,在Zend中,是经过承继Zend_Test_PHPUnit_ControllerTestCase去对Zend的controller去进行单元测验的,可以看到,在zend中的单元测验跟PHPUnit中的差不多,但添加了别的一些新的断语,比方上面的assertController,详细的可以参阅Zend的参阅手册。
PHPUnit是一个轻量级的PHP测验结构。它是在PHP5下面临JUnit3系列版别的完好移植,是xUnit测验结构宗族的一员(它们都根据形式前锋Kent Beck的描绘)。
单元测验是几个现代灵敏开发办法的根底,使得PHPUnit成为许多大型PHP项意图要害东西。这个东西也可以被Xdebug扩大用来生成代码覆盖率陈述 ,而且可以与phing集成来自动测验,最终它还可以和Selenium整合来完结大型的自动化集成测验。
- 1二维码是网站建设推广和发展的双刃剑
- 2企业为什么偏爱要求资深的网站维护单位做网站呢?
- 3PHP与XML联手进行网站编程
- 4泛普软件-U2ME网站设计方案计划表
- 5网站建设和营销带来的经济效益
- 6 企业四网合一网站升级版3
- 7网站备案所需材料
- 8ecshop中jQuery冲突解决
- 9如何让搜索引擎看到更真实的网页
- 10网站建设何以做到内容丰富
- 11PHP 5中垃圾回收算法的演化
- 12如何让您的网站盈利中发挥到极致
- 13Linux系统平安Shell剧本用于Linux系统的平安初始化剧本
- 14Android访问php取回json数据
- 15房地产行业微信营销方案3
- 16网站优化企业的方法
- 17关于PHP防CC攻击
- 18Linux操作系统中用PHP构建网站详解
- 19玩具租赁商城系统需求1
- 20企业建站要写简洁的代码
- 21介绍如何使用你的JavaScript
- 22玩具租赁商城系统需求3
- 23如何让企业网站发挥到机极致
- 24考证辅导网站制作解决方案
- 25阅读PHP验证码工具-Securimage
- 26JavaScript 性能提升技巧
- 27久途-网站制作流程
- 28企业为什么偏爱需要资深的网站设计企业做官方网站呢?
- 29MySql常用命令总结
- 30网站制作绝对不可以犯的编程错误2
成都公司:成都市成华区建设南路160号1层9号
重庆公司:重庆市江北区红旗河沟华创商务大厦18楼