仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1386|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页编程之PHP单位测试利器 PHPUNIT深切用法(三)第...

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:39:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
理解网站这一概念之后不难看出,任何网站都是由网页组成的,也就是说想完成网站,必须先学会做网页,因此必须要掌握了HTML,才能为今后制作网站打下基础。   在本文中,笔者将为人人引见phpunit中的两个初级概念和用法,虽然它纷歧定在你的平常单位测试中都用到,但了解和学会它们的用法对进修phpunit仍是非常主要的。   Phpunit中的Annotations
  假如有其他编程言语经历的开辟者,应当对Annotations(注解)不生疏,其其实phpunit中,一个复杂的以下面的一段正文也能够以为是Annotations:
  

                               
登录/注册后可看大图
<?php

                               
登录/注册后可看大图
class MyTestClass extends PHPUnit_Framework_TestCase

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Testing the answer to “do you love unit tests?”

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public function testDoYouLoveUnitTests()

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
$love = true;

                               
登录/注册后可看大图
$this->assertTrue($love);

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
?>    可以看到,其实一段以/** **/为标志的文字,就能够以为是一种Annotations,但Annotations其实不单单是复杂的正文,它是与一个法式元素相干联信息或元数据的标注,它不影响法式的运转,但相干的软件东西或框架可以将其转换成特别的元数据标志,以便利开辟者以更少的代码去进步效力(好比经由过程。假如你熟习Java,则会发明在Java SE 5中及象Spring等框架中,都大批利用了Annotations。
  但是,因为php其实不象Java那样是编译性言语,因而自己缺少去解析Annotations的机制,但幸亏phpunit去供应了如许的功效,咱们以上面的代码为例:
  

                               
登录/注册后可看大图
<?php

                               
登录/注册后可看大图
class MyMathClass

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Add two given values together and return sum

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public function addValues($a,$b)

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
return $a+$b;

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
?>    下面的只是一个复杂的加法的例子,为此,咱们利用Annotations去编写一个单位测试,在上两篇文章中,咱们采取的是手工编写单位测试的办法,而本文中,将引见利用phpunit号令行的办法,主动生成单位测试的框架,办法以下:
  起首把下面的类保留为MyMathClass.php,然后在号令行下运转以下号令:
  

                               
登录/注册后可看大图
phpunit Cskeleton-test MyMathClass    这时候phpunit会主动生成以下的框架单位测试代码:
  

                               
登录/注册后可看大图
<?php

                               
登录/注册后可看大图
require_once "/path/to/MyMathClass.php";

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Test class for MyMathClass.

                               
登录/注册后可看大图
* Generated by PHPUnit on 2011-02-07 at 12:22:07.

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
class MyMathClassTest extends PHPUnit_Framework_TestCase

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* @var MyMathClass

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
protected $object;

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Sets up the fixture, for example, opens a network connection.

                               
登录/注册后可看大图
* This method is called before a test is executed.

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
protected function setUp()

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
$this->object = new MyMathClass;

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Tears down the fixture, for example, closes a network connection.

                               
登录/注册后可看大图
* This method is called after a test is executed.

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
protected function tearDown()

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* @todo Implement testAddValues().

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public function testAddValues()

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
// Remove the following lines when you implement this test.

                               
登录/注册后可看大图
$this->markTestIncomplete(

                               
登录/注册后可看大图
"This test has not been implemented yet."

                               
登录/注册后可看大图
);

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
?>

                               
登录/注册后可看大图
    可以看到,phpunit为咱们生成的单位测试代码主动引入了本来的MyMathClass.php,同时也生成了setUp和tearDown办法,但独一的中心单位测试代码是留给了咱们编写。假如想在这个基本上更疾速的生成咱们想要的单位测试代码,要若何完成呢?没错,就是利用annotations!咱们可以在本来的MyMathClass.php中到场以下的annotations。
  

                               
登录/注册后可看大图
<?php

                               
登录/注册后可看大图
class MyMathClass

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Add two given values together and return sum

                               
登录/注册后可看大图
* @assert (1,2) == 3

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public function addValues($a,$b)

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
return $a+$b;

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
?>

                               
登录/注册后可看大图
  然后再象上述一样在号令交运行:
  

                               
登录/注册后可看大图
phpunit Cskeleton-test MyMathClass   这个时分会为咱们生成以下的单位测试代码:
  

                               
登录/注册后可看大图
<?php

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Generated from @assert (1,2) == 3.

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public function testAddValues()

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
$this->assertEquals(

                               
登录/注册后可看大图
3,

                               
登录/注册后可看大图
$this->object->addValues(1,2)

                               
登录/注册后可看大图
);

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
?>

                               
登录/注册后可看大图
  看到了么?咱们在原本的类中到场了注解@assert(1,2)==3,则phpunit主动为咱们生成了准确的单位测试代码。固然,可以参考phpunit手册,进修到更多的关于@assert注解利用的划定规矩。
  上面再举一个例子来说解annotations。假定咱们的法式中的一个办法,只是仅需求数据的输出,而且不依附XML或数据库供应数据源,则为了测试这个办法,咱们能够想到的一个办法是在法式中设置一个测试数据集去测试,但这里引见一个对照复杂的办法,就是利用注解@dataProvider,修正MyMathClass.php以下:
  

                               
登录/注册后可看大图
<?php

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Data provider for test methods below

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public static function provider()

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
return array(

                               
登录/注册后可看大图
array(1,2,3),

                               
登录/注册后可看大图
array(4,2,6),

                               
登录/注册后可看大图
array(1,5,7)

                               
登录/注册后可看大图
);

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* Testing addValues returns sum of two values

                               
登录/注册后可看大图
* @dataProvider provider

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public function testAddValues($a,$b,$sum)

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
$this->assertEquals(

                               
登录/注册后可看大图
$sum,

                               
登录/注册后可看大图
$this->object->addValues($a,$b)

                               
登录/注册后可看大图
);

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
?>

                               
登录/注册后可看大图
    可以看到,这里利用了注解@dataProvider,指了然测试用例的数据供应者是由provider办法前往的一个数组。所以在单位测试时,数组中的第0个元素则会赋值给$a,第1个元素则会赋值给b,第3个元素则会赋值给sum,可以看到,下面的第3个数组供应的数据是不克不及经由过程单位测试的,由于1+5不等于7。
  另外,这里还复杂引见两个经常使用的annotations,好比@expectedException注解可以测试代码中是不是准确抛出了异常,好比:
  

                               
登录/注册后可看大图
<?phprequire_once "PHPUnit/Framework.php";

                               
登录/注册后可看大图
class ExceptionTest extends PHPUnit_Framework_TestCase{

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* @expectedException InvalidArgumentException */

                               
登录/注册后可看大图
public function testException() {

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图


                               
登录/注册后可看大图
?>

                               
登录/注册后可看大图
    这里就用注解的办法暗示testException中必需抛出的异常类型为InvalidArgumentException。
  别的一个是@cover注解。它的感化是标识phpunit只为类中的哪些办法或感化域生成测试代码,好比:
  

                               
登录/注册后可看大图
/**

                               
登录/注册后可看大图
* @covers SampleClass::publicMethod

                               
登录/注册后可看大图
* @covers SampleClass::<!public>

                               
登录/注册后可看大图
* @covers HelperClass<extended>

                               
登录/注册后可看大图
*/

                               
登录/注册后可看大图
public function testMethod()

                               
登录/注册后可看大图
{

                               
登录/注册后可看大图
$result = SampleClass::method();

                               
登录/注册后可看大图
}

                               
登录/注册后可看大图
<P>   则phpunit只为SampleClass类中的publicMethod办法、SampleClass类中的一切非public声明的办法和HelperClass类或它的个中一个父类发生单位测试代码。
根据功能来进行封装等。很多的不懂,在使用搜索引擎查找,或者请教老师和在老师详细的讲解、指导下,都能顺利解决。
活着的死人 该用户已被删除
沙发
发表于 2015-2-4 04:48:33 | 只看该作者
做为1门年轻的语言,php一直很努力。
飘灵儿 该用户已被删除
板凳
发表于 2015-2-9 15:50:29 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-27 09:06:03 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
若天明 该用户已被删除
5#
发表于 2015-3-3 04:14:23 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
不帅 该用户已被删除
6#
发表于 2015-3-6 22:10:35 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
再见西城 该用户已被删除
7#
发表于 2015-3-12 06:57:52 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
金色的骷髅 该用户已被删除
8#
发表于 2015-3-12 12:07:19 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
深爱那片海 该用户已被删除
9#
发表于 2015-3-18 04:05:13 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
乐观 该用户已被删除
10#
发表于 2015-3-22 01:09:26 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
透明 该用户已被删除
11#
发表于 2015-3-22 23:27:53 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
冷月葬花魂 该用户已被删除
12#
发表于 2015-3-27 07:37:16 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
蒙在股里 该用户已被删除
13#
发表于 2015-4-6 00:10:50 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
灵魂腐蚀 该用户已被删除
14#
发表于 2015-4-8 07:49:44 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
飘飘悠悠 该用户已被删除
15#
发表于 2015-4-10 00:00:48 | 只看该作者
爱上php,他也会爱上你。
莫相离 该用户已被删除
16#
发表于 2015-4-10 09:14:59 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
精灵巫婆 该用户已被删除
17#
发表于 2015-4-13 10:45:24 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
再现理想 该用户已被删除
18#
发表于 2015-5-4 04:22:55 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
简单生活 该用户已被删除
19#
发表于 2015-5-4 20:23:34 | 只看该作者
当然这种网站的会员费就几十块钱。
小魔女 该用户已被删除
20#
发表于 2015-5-6 21:33:36 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-10 23:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表