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