月度归档:2012年09月

phpunit的安装,测试

什么是phpunit(来自百度百科

PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。

单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试,最后它还可以和Selenium整合来完成大型的自动化集成测试。

安装部署有两种方式

方法一: 使用Pear

运行 pear channel-discover pear.phpunit.de;   pear install phpunit/PHPUnit

方法二 :手动安装   1 从http://pear.phpunit.de/get/下载软件包并解压   2 把解压后的目录加入php.ini中的include_path   3 将脚本pear-phpunit改名为phpunit   4 将phpunit脚本中的@php_bin@替换成php可执行脚本的路径   5 为phpunit脚本增加可执行权限并加入$PATH   6 将PHPUnit/Runner/Version.php中的@package_version@替换成3位   PHPUnit版本号

这里我们使用的Pear方式进行安装。以windows下环境为例。

在建立一个完整的php工作开发环境后,phpunit的的部署首先需要xdebug与pear的支持,才能安装phpunit。

1、安装xdebug

[Xdebug]

extension=php_xdebug.dll

xdebug.profiler_enable=on

xdebug.trace_output_dir=”E:/php/xdebug”

xdebug.profiler_output_dir=”E:/php/xdebug”

在安装xdebug后,重启apache,在phpinfo中即可看到了xdebug的信息。

接下来cmd进入php的安装目录,如E:/wamp/php/

输入pear,会提示“pear不是内部或外部的命令,也不是可运行的程序…”,这说明系统还没有安装pear,如果出现如下的命令方式

则说明pear安装成功了,可以直接去安装phpunit了。

在这里需要注意的是,xdebug的的加载方式必须以zend的方式进行加载;而extension是以php的加载方式进行实现的

所以在最后安装成功phpunit后,如果xdebug还是以php方式进行加载的话,系统会提示如下信息

zend_extension 加载是以zend引擎的方式进行模块加载的,详细信息如下

{

根据 PHP 版本,zend_extension 指令可以是以下之一:

zend_extension (non ZTS, non debug build)
zend_extension_ts ( ZTS, non debug build)
zend_extension_debug (non ZTS, debug build)
zend_extension_debug_ts ( ZTS, debug build)

ZTS:ZEND Thread Safety

可通过phpinfo()查看ZTS是否启用,从而决定用zend_extension还是zend_extension_ts。既查看phpinfo综合信息处的状态

extension意为基于php引擎的扩展;zend_extension意为基于zend引擎的扩展

注:php是基于zend引擎的

不同的扩展安装后,在php.ini里是用extension还是zend_extension,是取决于该扩展,有的扩展可能只能用zend_extension,如xdebug,也有的扩展可以用extension或zend_extension,如mmcache。

注:上面的结论不保证准确。
zend_extension加载php扩展时需用全路径,而extension加载时可以用相对extension_dir的路径。

}

这里我的 Thread Safety是启用状态,即线程安全版本,所以使用zend_extension_ts来加载。且xdebug必须使用全路径,这点很重要;不然添加到php.ini后,重启apache不会报错,但xdebug信息也是没有的。

2、安装pear

还是在php安装目录中,cmd输入如下命令

go-pear

连续输入两次yes,在直接按Enter。然后就自动从服务器上下载pear安装包,进行自动安装了。

再次输入pear命令,则会出现commands列表了。说pear安装成功了。

3、安装phpunit

继续cmd命令输入

pear channel-discover pear.phpunit.de

pear channel-discover pear.symfony-project.com

pear install phpunit/PHPUnit

这时可能会提示缺少依赖包内容,如下图

phpunit package

我们可以使用

pear install Image_GraphViz

pear install log

pear install YAML

进行依赖包得依次安装。安装完成后,继续输入

pear install phpunit/PHPUnit

耐心等待,可能有点慢,直到下载安装成功。

至此,在cmd中键入phpunit –version,提示phpunit版本信息则表示安装成功可以进入单元测试阶段了。

4、结合netbeans 使用phpunit进行单元测试

主要有两步,一、对某个类或者整个项目创建phpunit单元测试;二、单击源文件或项目进行单元测试。详细进行请进入使用 PHPUnit 和 Selenium 进行测试阅读。

其中对需要测试的类添加@assert 标注需要注意,点击这里详细了解,在netbeans中可以直接“创建phpunit单元测试”生成测试类;

<?php
class Calculator
{
/**
* @assert (0, 0) == 0
* @assert (0, 1) == 1
* @assert (1, 0) == 1
* @assert (1, 1) == 2
* @assert (1, 2) == 4
*/
public function add($a, $b)
{
return $a + $b;
}

// 添加用来测试“代码覆盖率”的
public function addnow($a, $b)
{
return $a + $b;
}
}
?>


同时也可以使用命令来完成

phpunit –skeleton-test Calculator

注意,Calculator是类名,不是文件名。

会在同目录下自动生成Calculator的测试类,CalculatorTest.php;

CalculatorTest.php类详细内容


<?php
require_once 'PHPUnit/Framework.php';

require_once 'D:\www\phpunit\Calculator.php';

/**
* Test class for Calculator.
* Generated by PHPUnit on 2012-09-25 at 10:17:34.
*/
class CalculatorTest extends PHPUnit_Framework_TestCase
{
/**
* @var Calculator
*/
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 Calculator;
}

/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*/
protected function tearDown()
{
}

/**
* Generated from @assert (0, 0) == 0.
*/
public function testAdd()
{
$this->assertEquals(
0,
$this->object->add(0, 0)
);
}

/**
* Generated from @assert (0, 1) == 1.
*/
public function testAdd2()
{
$this->assertEquals(
1,
$this->object->add(0, 1)
);
}

/**
* Generated from @assert (1, 0) == 1.
*/
public function testAdd3()
{
$this->assertEquals(
1,
$this->object->add(1, 0)
);
}

/**
* Generated from @assert (1, 1) == 2.
*/
public function testAdd4()
{
$this->assertEquals(
2,
$this->object->add(1, 1)
);
}

/**
* Generated from @assert (1, 2) == 4.
*/
public function testAdd5()
{
$this->assertEquals(
4,
$this->object->add(1, 2)
);
}

/**
* @todo Implement testAddnow().
*/
public function testAddnow()
{
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet.'
);
}
}
?>

这时就可以测试这个测试类了。

phpunit CalculatorTest.php unittest

结果信息如下

点号表示测试通过,没有错误;

F表示其中一个测试结果有误。错误信息直观展示了。

I表示测试没有实现执行

对比netbeans的执行更加抽象一点,如下为netbeans执行的测试结果。

这个只是一个简单的示例,更详细的服务于项目级别的对于每一个独立的模块都需要写新的独立测试类来进行测试。

phpunit安装成功后,会在c盘建立一个php5文件夹。其中可以找到PHPUnit的接测试例子

C:\php5\pear\docs\PHPUnit\PHPUnit\Samples

(说实话money例子挺复杂的)很容易绕晕了。

参考信息:

phpunit官方手册

PHP Warning: Xdebug MUST be loaded as a Zend extension in Unknown on line 0 解决办法 

PHP下安装phpunit 及xdebug

PHPUnit安装 部分配图来源此博客,鸣谢

使用 PHPUnit 和 Selenium 进行测试

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

windows7 IE的保护模式对于js form.submit()自动执行提交的影响

近期在完成一个项目充值支付业务逻辑时,需要完成用户在网站上提交充值订单,网站后端处理充值订单信息,发布“网站正在跳转,进入充值平台”的提示信息,跳转至充值平台进行充值的这样一个流程。

因为直接采用的是discuzX进行二次开发,在xp、2003等各浏览器下业务逻辑测试都没有问题。就是在交付客户测试中,发现客户的IE9浏览器不能正常的充值支付;发现是停顿在了跳转消息发布的那一步中了,也就是说后端返回自建的form表单,并没有正确的提交。


// 对discuzx的提交进行了更改,没有采用ajax提交;而是直接订单form表单新页面提交,后端直接echo数据。

echo '<form id="payform" action="'.$requesturl.'" method="post"></form><script type="text/javascript" reload="1">$(\'payform\').submit();</script>';
dexit();

确实是个问题了,刚开始以为是订单form新页面提交后,新产生的此页面渲染模式有关,从而建立完整的文档结构


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">

...

但是效果还是没好转,只是在完成提示信息;自己form表单还是没有进行自提交。再次google查看

不过在查看的过程中发现了这样一个问题,就是在xp或2003的系统上是能够正常跳转使用的;但在win7 ie下则不可以了,但是其他浏览器则行,就算是IE内核,但非ie官方的浏览器也是正常的。

于是对比2003与win7下的IE8设置,发现了下图独特的地方。

多了一个“启动保护模式”选择框!
另一位同事尝试的取消这个勾选框后,重启IE 再次测试就能正常的跳转了。
至此问题明了了,不过这个选择框是windows7上系列浏览器的默认勾选状态;所以不可能要求windows7的用户去更改此项设置,且会招致用户的反感。
于是在想办法的过程中参考了其他网站的api支付跳转实现效果,发现用户充值订单表单提交后,在跳转信息的提示过程中,程序后端并没有直接跳转至支付平台,而是再次跳转至网站本地后端的一个页面,而这个跳转的过程是使用window.location.href来实现的,而目标页面则直接通过header location跳转到了目标支付平台,也就是充值表单数据最终是以get方式发布至支付平台。(安全性方面不知道是否降低了,待验证)
代码结构再次更改后,2003下测试正常;在windows7下测试也能执行正常的跳转了!为此,新添加一个php页面用来处理添加充值订单,header页面跳转。而原form接受页面只是进行数据的收集以及跳转信息的提示。
在业务逻辑构造的过程中,查看了discuzx2.5最新版本;支付充值这块地方的代码还是没有变化还是采用自建from表单提交的方式实现的。于是在discuz官网论坛上面去搜索“IE9 充值”果然有很多用户的帖子,
而官方团队对此的回复是“该问题我们已经发现,这问题与环境有关,且不好重现,之前装有安全软件的一些用户也出现空白现象,往后我们再排查下是否是产品本身的兼容性问题。 感谢您的反馈1”
不过已经有用户发现了这样的问题了,并且有了对应的解答
知识普及:
IE保护模式原理简述

IE保护模式(Protected Mode),以前也叫做IE低权利(Lowcenters)。IE保护模式可能是Windows Vista里最严厉的安全措施,比我们熟知的UAC(用户帐户控制)还要严厉。事实上,IE保护模式依赖于Windows Vista的以下三大特性:

(1)UAC(用户帐户控制)

相信大家已经很熟悉了,可以让管理员帐户自动获得一个标准用户的访问令牌,以减少WindowsVista系统的受攻击面。

(2)MIC(强制完整性控制)

这是WindowsVista安全架构中新增加的一种检测机制。大家知道,Windows2000/XP安全体系里,安全子系统把进程的访问令牌和 资源的访问控制列表进行匹配比较,以确认该进程是否具有访问该资源的权限。而在WindowsVista下,除了遵守传统的安全控制机制外,还必须检查进 程和资源对象的完整性级别,完整性级别低的进程,不能写入完整性级别高的资源对象。

(3)UIPI(用户界面特权隔离)

完整性级别低的进程,不能向完整性级别高的进程发送Window消息。

windows IE浏览器安全设置的注意事项:

在这里,我们必须了解以下三点注意事项:

1.只有IE浏览器才能享用保护模式带来的好处,第三方的浏览器、或者以IE为内核的一些外挂浏览器无法获得保护模式的功能。

2.只有确认安全的网站,才能添加到可信站点区域。错将问题站点添加到可信区域,将会导致系统安全的严重受损。

3.最好能够对旧版插件进行改进,以确保插件的兼容性,这样可以大大提高系统安全。

扩展阅读

Internet Explorer 保护模式有何功能?

IE8浏览器安全设置 更好的安全浏览

关闭“保护模式”后,IE9还有没有安全?