thinkphp5使用教程 怎么使用单元测试

PHP单元测试利器:PHPUNIT初探
你是否在程序开发的过程中遇到以下的情况:当你花了很长的时间开发一个应用后,你认为应该是大功告成了,可惜在调试的时候,老是不断的发现bug,而且最可怕的是,这些bug是重复出现的,你可能发现这些bug之间会有关联,但却老是找不到问题的所在。 当你遇到
   
&你是否在程序开发的过程中遇到以下的情况:当你花了很长的时间开发一个应用后,你认为应该是大功告成了,可惜在调试的时候,老是不断的发现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 :
&&public function returnSampleObject()
&&&&return $
&  上面的代码其实是实现连接到一个指定的服务器的功能,那么我们可以编写测试代码如下:
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&=&'';
&&&&$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()
<img alt="\" align="top" src="/cms/uploads/allimg/Z.gif" style="border-top-width: 0 border-right-width: 0 border-bottom-width: 0 border-left-width: 0 border-style: border-color: border-style: border-color: marg
(责任编辑:网络)
本文关键字:
广告赞助商
最新视频推荐
Copyright (C) 2007-, All Rights Reserved 版权所有 . 沪ICP备号
地址:上海徐汇区零陵路585号 爱邦大厦26H座
传真(FAX):021-
电话(Tel):021-
PHP100 Website Powered by PHPCMS. For PHP100. 服务器维护:阿里巴巴-阿里云因为研究TP5时间不是很长,暂时先列以下几处差异:
1、过去的单字母函数已完全被替换掉,如下:
S=&cache,C=&config,M/D=&model,U=&url,I=&input,E=&exception,L=&lang,A=&controller,R=&action
2、模版渲染:$this-&display() =& return view()/return $this-&fetch();
3、在model中调用自身model:$this =& Db::table($this-&table)
4、在新建控制器与模型时的命名:
  ①控制器去掉后缀controller:UserController =& User
  ②模型去掉后缀model:UserModel =& User
5、url访问:
  如果控制器名使用驼峰法,访问时需要将各字母之间用下划线链接后进行访问。
  eg:控制器名为AddUser,访问是用add_user来进行访问
6、在TP5中支持配置二级参数(即二维数组),配置文件中,二级配置参数读取:
  ①Config::get('user.type');
  ②config('user.type');
7、模板中支持三元运算符的运算:{$info.status ? $info.msg : $info.error}还支持这种写法:{$varname.aa ?? 'xxx'}或{$varname.aa ?: 'xxx'}
8、TP5内置标签:
  系统内置的标签中,volist、switch、if、elseif、else、foreach、compare(包括所有的比较标签)、(not)present、(not)empty、(not)defined等
9、TP5数据验证:
  $validate = new Validate(['name' =& 'require|max:25','email' =& 'email']);
  $data = ['name' =& 'thinkphp','email' =& ''];
  if(!validate-&check($data)){
    debug::dump($validate-&getError());
  注:使用助手函数实例化验证器&&$validate = validate('User');
10、TP5实现了内置分页,使用如下:
  查询状态为1的用户数据,且每页显示10条数据
  $list = model('User')-&where('status',1)-&paginate(10);
   $page = $this-&render();
   $this-&assign('_list',$list);
   $this-&assign('_page',$page);
   return $this-&fetch();
  模板文件中分页输出代码如下:
  &div&{$_page}&/div&
阅读(...) 评论()thinkphp 单元测试 - ThinkPHP框架
我们的网站搞好了,现在要单元测试,有没有做过的?给我说下大概流程,具体要怎么去做,我是一点不懂。
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

我要回帖

更多关于 thinkphp5性能测试 的文章

 

随机推荐