PHPUnit和xdebug

第二个月工作第12天,时间过得还蛮快地。

工作起来,就会找回期待晚上和周末的感觉。

说:白天越累,晚上越high,平时越忙,周末越high~

============================

今天使用PHPUnit和xdebug一起做了一下覆盖率测试,还蛮好玩的。

生成的那个html非常漂亮,把覆盖的代码全部都标记了,这样可以很快的发现那些分支,那些代码还没有被测试到。

安装方法网上都有,就不赘述了,我使用的是zend方法:

[zend_extension]
zend_extension=”/home/work/local/php/ext/xdebug.so”
;zend_extension=”/home/work/local/pikagent/lib/xdebug/xdebug_php5.so”
;zend_extension=”/home/work/local/pikagent/lib/xdebug/xdebug_php5.so”
xdebug.profiler_enable=on
xdebug.trace_output_dir=”/home/work/var/xdebug”
xdebug.profiler_output_dir=”/home/work/var/xdebug”
;xdebug.profiler_output_name=”script”

之后使用phpunit,就可以进行覆盖率测试了

命令:phpunit –coverage-html /home/work/var/xdebug TestCase.php  就可以了

其中 /home/work/var/xdebug 是存放结果的目录

TestCase.php就是单测文件

之后到xdebug的目录下,拷贝生成的html文件及相关css和image,打开就可以查看啦。

效果图: 上面是统计结果,绿色的话就是比较好,黄色的部分表示还没覆盖到,很直观啦。

测试覆盖率结果

PHPUnit学习

来自百度百科……
“PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。
单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试,最后它还可以和Selenium整合来完成大型的自动化集成测试。”

简单来讲,使用PHPUnit的目的,就是在测试代码的时候,设置好检测点,检测方法和结果比对方式,进行大量的自动的代码测试。以下面这个例子说明:
assertEquals(0, sizeof($fixture));
   }

   public function testArrayContainsAnElement() {
   /* Create the Array fixture*/
   $fixture = array();
   /*Add an element to the Array * fixture*/
   $fixture[] = ‘Element’;
   /*Assert that the size of the * Array fixture is 1*/
   $this->assertEquals(1, sizeof($fixture));
   }
  }
?>
里面定义了一个测试点,测试Array的功能,两个测试方法:为空和为一个元素的时候;结果比对就是数组的大小,为空=0,一个元素=1. 这样使用phpunit ArrayTest就可以进行自动的测试,并给出测试结果。

要点:
  1 编写的测试用例是一个php脚本
  2 require_once ‘PHPUnit/Framework.php’是必须的,另外,你需要在测
  试用例脚本中包含你需要测试的代码
  3 测试用例的主体必须写在类中,类名必须和文件名保持一致,还必须是
  PHPUnit_Framework_TestCase的子类
  4 每一个测试用例都是一个public的成员函数,必须以test开头
  5 程序的输出使用assert*系列函数来进行验证
  该用例需要在Shell下键入phpunit ArrayTest.php来运行。结果如下示:
  [username@machine xx]$ phpunit ArrayTest.php
  PHPUnit 3.1.3 by Sebastian Bergmann.
  ..
  Time: 0 seconds
  OK (2 tests)
  结果中点号代表一个用例通过(即assert系列函数都通过)。如果将上面的测试用例testArrayContainsAnElement用例assertEquals函数中的1改为0,则运行结果为:
  PHPUnit 3.1.3 by Sebastian Bergmann.
  .F
  Time: 0 seconds
  There was 1 failure:
  1) testArrayContainsAnElement(ArrayTest)
  Failed asserting that matches expected value .
  /home/wiki/apache/htdocs1.5.0/ArrayTest.php:29
  FAILURES!
  Tests: 2, Failures: 1.
  可以很明显看出结果由原来的 .. 变为 .F ,F表示第二个测试用例未通
  过,并且具体与哪一条验证不符都在后有详细说明。
  除了F外,一个测试用例还有I(未完成),S (跳过),E (错误)三种状态

高级的一些用法比如:依赖关系和数据提供者大家可以百度学习,其实也不太用到
还有一些比如测试异常的方式,可以用:
try catch + fail法
public function testException() {
try {
// 这里写上会引发异常的代码
} catch (InvalidArgumentException $expected) {
// 抓到异常测试通过
return ;
}

// 没抓到异常就算失败
$this->fail(‘An expected exception has not been raised.’ );
}

常用的assert****
assertEquals(array $expected, array $actual[, string $message = ”])
断言数组$actual和数组$expected相同
assertFalse(bool $condition[, string $message = ”])
断言$condition的结果为false
assertTrue(bool $condition[, string $message = ”])
断言$condition为True,否则就报告错误

其他的话,其实都可以用assertEquals替代来写,实际应用实际操作吧。
其实做测试主要还是设计的考虑和边界值的选取等。

Mac OS Lion系统下安装apache,php,pear和phpunit

八月上班的第一天,加入项目组了,准备开始学习测试
============================
使用MacOS Lion还是不错的,想着做开发应该没啥问题吧,php嘛。但是实际操作起来还是有很多不同的。
首先他自带了php 5.3.6,版本很新啊,和apache2,所以就不需要装了
在命令行下直接php命令就可以了,但是如果要打开apache的功能,还需要做一些操作
开启apache对php的支持
在/etc/apache2/httpd.conf中,打开LoadModule php5_module libexec/apache2/libphp5.so这一项
然后去系统偏好设置,共享中打开web共享,然后访问http://localhost可以看到久违的It works!
自己设置的网站是在 ~/Sites/文件夹下,对应的url是
http://localhost/~[your_user_name]/index.php
可以使用常用的phpinfo()来试一下开通了没有。

然后就要开始装pear了
cd /usr/local下,然后使用
curl http://pear.php.net/go-pear | sudo php
命令,发现php版本太新了,提示用go-pear.phar > go-pear.php文件才行
安装完成如果发现pear命令可以用了,那就说明好了,如果还不行的话,就百度一下吧⋯⋯

开始安装phpunit
首先升级pear,使用 pear upgrade pear
然后添加pear的频道
pear channel-discover components.ez.no

pear channel-discover pear.phpunit.de

pear channel-discover pear.symfony-project.com

之后使用
pear install –alldeps –force phpunit/phpunit
即可完成安装
安装完成如果运气好的话,比如我在xp下面,就可以直接使用phpunit命令了,
但是在mac下还是不行,提示
PHP Warning: require_once(PHP/CodeCoverage/Filter.php): failed to open stream:
No such file or directory in phpunit on line 38
我先用pear install phpunit/PHP_CodeCoverage命令装了,还是不行。
肯定就是路径问题,可以使用修改include_path的方法,但是不太明白,所以
打开pear目录下phpunit在