老尸 发表于 2015-2-3 23:39:04

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

理解网站这一概念之后不难看出,任何网站都是由网页组成的,也就是说想完成网站,必须先学会做网页,因此必须要掌握了HTML,才能为今后制作网站打下基础。   在本文中,笔者将为人人引见phpunit中的两个初级概念和用法,虽然它纷歧定在你的平常单位测试中都用到,但了解和学会它们的用法对进修phpunit仍是非常主要的。   Phpunit中的Annotations
  假如有其他编程言语经历的开辟者,应当对Annotations(注解)不生疏,其其实phpunit中,一个复杂的以下面的一段正文也能够以为是Annotations:
http://www.alixixi.com/program/a/<?php
http://www.alixixi.com/program/a/class MyTestClass extends PHPUnit_Framework_TestCase
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Testing the answer to “do you love unit tests?”
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/public function testDoYouLoveUnitTests()
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/$love = true;
http://www.alixixi.com/program/a/$this->assertTrue($love);
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/?>  可以看到,其实一段以/** **/为标志的文字,就能够以为是一种Annotations,但Annotations其实不单单是复杂的正文,它是与一个法式元素相干联信息或元数据的标注,它不影响法式的运转,但相干的软件东西或框架可以将其转换成特别的元数据标志,以便利开辟者以更少的代码去进步效力(好比经由过程。假如你熟习Java,则会发明在Java SE 5中及象Spring等框架中,都大批利用了Annotations。
  但是,因为php其实不象Java那样是编译性言语,因而自己缺少去解析Annotations的机制,但幸亏phpunit去供应了如许的功效,咱们以上面的代码为例:
http://www.alixixi.com/program/a/<?php
http://www.alixixi.com/program/a/class MyMathClass
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Add two given values together and return sum
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/public function addValues($a,$b)
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/return $a+$b;
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/?>  下面的只是一个复杂的加法的例子,为此,咱们利用Annotations去编写一个单位测试,在上两篇文章中,咱们采取的是手工编写单位测试的办法,而本文中,将引见利用phpunit号令行的办法,主动生成单位测试的框架,办法以下:
  起首把下面的类保留为MyMathClass.php,然后在号令行下运转以下号令:
http://www.alixixi.com/program/a/phpunit Cskeleton-test MyMathClass  这时候phpunit会主动生成以下的框架单位测试代码:
http://www.alixixi.com/program/a/<?php
http://www.alixixi.com/program/a/require_once "/path/to/MyMathClass.php";
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Test class for MyMathClass.
http://www.alixixi.com/program/a/* Generated by PHPUnit on 2011-02-07 at 12:22:07.
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/class MyMathClassTest extends PHPUnit_Framework_TestCase
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* @var MyMathClass
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/protected $object;
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Sets up the fixture, for example, opens a network connection.
http://www.alixixi.com/program/a/* This method is called before a test is executed.
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/protected function setUp()
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/$this->object = new MyMathClass;
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Tears down the fixture, for example, closes a network connection.
http://www.alixixi.com/program/a/* This method is called after a test is executed.
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/protected function tearDown()
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* @todo Implement testAddValues().
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/public function testAddValues()
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/// Remove the following lines when you implement this test.
http://www.alixixi.com/program/a/$this->markTestIncomplete(
http://www.alixixi.com/program/a/"This test has not been implemented yet."
http://www.alixixi.com/program/a/);
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/?>
http://www.alixixi.com/program/a/  可以看到,phpunit为咱们生成的单位测试代码主动引入了本来的MyMathClass.php,同时也生成了setUp和tearDown办法,但独一的中心单位测试代码是留给了咱们编写。假如想在这个基本上更疾速的生成咱们想要的单位测试代码,要若何完成呢?没错,就是利用annotations!咱们可以在本来的MyMathClass.php中到场以下的annotations。
http://www.alixixi.com/program/a/<?php
http://www.alixixi.com/program/a/class MyMathClass
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Add two given values together and return sum
http://www.alixixi.com/program/a/* @assert (1,2) == 3
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/public function addValues($a,$b)
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/return $a+$b;
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/?>
http://www.alixixi.com/program/a/   然后再象上述一样在号令交运行:
http://www.alixixi.com/program/a/ phpunit Cskeleton-test MyMathClass   这个时分会为咱们生成以下的单位测试代码:
http://www.alixixi.com/program/a/<?php
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Generated from @assert (1,2) == 3.
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/public function testAddValues()
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/$this->assertEquals(
http://www.alixixi.com/program/a/3,
http://www.alixixi.com/program/a/$this->object->addValues(1,2)
http://www.alixixi.com/program/a/);
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/?>
http://www.alixixi.com/program/a/   看到了么?咱们在原本的类中到场了注解@assert(1,2)==3,则phpunit主动为咱们生成了准确的单位测试代码。固然,可以参考phpunit手册,进修到更多的关于@assert注解利用的划定规矩。
  上面再举一个例子来说解annotations。假定咱们的法式中的一个办法,只是仅需求数据的输出,而且不依附XML或数据库供应数据源,则为了测试这个办法,咱们能够想到的一个办法是在法式中设置一个测试数据集去测试,但这里引见一个对照复杂的办法,就是利用注解@dataProvider,修正MyMathClass.php以下:
http://www.alixixi.com/program/a/<?php
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Data provider for test methods below
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/public static function provider()
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/return array(
http://www.alixixi.com/program/a/array(1,2,3),
http://www.alixixi.com/program/a/array(4,2,6),
http://www.alixixi.com/program/a/array(1,5,7)
http://www.alixixi.com/program/a/);
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/* Testing addValues returns sum of two values
http://www.alixixi.com/program/a/* @dataProvider provider
http://www.alixixi.com/program/a/*/
http://www.alixixi.com/program/a/public function testAddValues($a,$b,$sum)
http://www.alixixi.com/program/a/{
http://www.alixixi.com/program/a/$this->assertEquals(
http://www.alixixi.com/program/a/$sum,
http://www.alixixi.com/program/a/$this->object->addValues($a,$b)
http://www.alixixi.com/program/a/);
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/?>
http://www.alixixi.com/program/a/  可以看到,这里利用了注解@dataProvider,指了然测试用例的数据供应者是由provider办法前往的一个数组。所以在单位测试时,数组中的第0个元素则会赋值给$a,第1个元素则会赋值给b,第3个元素则会赋值给sum,可以看到,下面的第3个数组供应的数据是不克不及经由过程单位测试的,由于1+5不等于7。
  另外,这里还复杂引见两个经常使用的annotations,好比@expectedException注解可以测试代码中是不是准确抛出了异常,好比:
http://www.alixixi.com/program/a/<?phprequire_once "PHPUnit/Framework.php";
http://www.alixixi.com/program/a/class ExceptionTest extends PHPUnit_Framework_TestCase{
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/ * @expectedException InvalidArgumentException */
http://www.alixixi.com/program/a/public function testException() {
http://www.alixixi.com/program/a/ }
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/
http://www.alixixi.com/program/a/?>
http://www.alixixi.com/program/a/  这里就用注解的办法暗示testException中必需抛出的异常类型为InvalidArgumentException。
  别的一个是@cover注解。它的感化是标识phpunit只为类中的哪些办法或感化域生成测试代码,好比:
http://www.alixixi.com/program/a//**
http://www.alixixi.com/program/a/ * @covers SampleClass::publicMethod
http://www.alixixi.com/program/a/ * @covers SampleClass::<!public>
http://www.alixixi.com/program/a/ * @covers HelperClass<extended>
http://www.alixixi.com/program/a/ */
http://www.alixixi.com/program/a/ public function testMethod()
http://www.alixixi.com/program/a/ {
http://www.alixixi.com/program/a/ $result = SampleClass::method();
http://www.alixixi.com/program/a/}
http://www.alixixi.com/program/a/ <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这样的模板引擎,

若天明 发表于 2015-3-3 04:14:23

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

不帅 发表于 2015-3-6 22:10:35

写的比较杂,因为我也是个新手,不当至于大家多多指正。

再见西城 发表于 2015-3-12 06:57:52

写的比较杂,因为我也是个新手,不当至于大家多多指正。

金色的骷髅 发表于 2015-3-12 12:07:19

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

深爱那片海 发表于 2015-3-18 04:05:13

为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。

乐观 发表于 2015-3-22 01:09:26

Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81

透明 发表于 2015-3-22 23:27:53

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

冷月葬花魂 发表于 2015-3-27 07:37:16

我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:

蒙在股里 发表于 2015-4-6 00:10:50

要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。

灵魂腐蚀 发表于 2015-4-8 07:49:44

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

飘飘悠悠 发表于 2015-4-10 00:00:48

爱上php,他也会爱上你。

莫相离 发表于 2015-4-10 09:14:59

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

精灵巫婆 发表于 2015-4-13 10:45:24

建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。

再现理想 发表于 2015-5-4 04:22:55

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

简单生活 发表于 2015-5-4 20:23:34

当然这种网站的会员费就几十块钱。

小魔女 发表于 2015-5-6 21:33:36

多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
页: [1] 2
查看完整版本: PHP网页编程之PHP单位测试利器 PHPUNIT深切用法(三)第...