PHPUnit入门(二)

如果你已经安装好PHPUnit了,那么就继续开始吧。

<?php
require_once 'PHPUnit/Framework.php';
 
class ArrayTest extends PHPUnit_Framework_TestCase
{
    protected $fixture;
 
    protected function setUp()
    {
        // Create the Array fixture.
        $this->fixture = array();
    }
 
    public function testNewArrayIsEmpty()
    {
        // Assert that the size of the Array fixture is 0.
        $this->assertEquals(0, sizeof($this->fixture));
    }
 
    public function testArrayContainsAnElement()
    {
        // Add an element to the Array fixture.
        $this->fixture[] = 'Element';
 
        // Assert that the size of the Array fixture is 1.
        $this->assertEquals(1, sizeof($this->fixture));
    }
}
?>

这是一个测试文件,注意文件名叫ArrayTest.php。在命令行运行phpunit ArrayTest.php,如果显示ok的话,就恭喜你了。setUp()是每次调用测试用例之前调用的方法,用于重置一些变量,方便测试。其实上面的东西照着手册就可以做到了,所以这并不是重点。对于一个项目来说,可能有许多模块,怎么组织这些模块测试就成了一个问题,除非你把所有的东西写在一起,其实那样也挺有难度的Laughing。所以在PHPUnit测试里面有帮你组织测试的功能。代码我就不帖了,在这。如果你得懂,就不用再继续看下去了。

在AllTests中定义了两个静态方法,Framework_AllTest也是同样的,区别在于,Framework_AllTest添加了ArrayTest.php这个测试文件。

在AllTests的开始定义了一个常量,并在类的下方对这个常量进行了判断。假如你是从这个文件开始运行的,那个就会定义这个常量,通过常量的判断运行main()这个静态方法,而这个静态方法调用suite()方法,来加载测试套件。这样就能给测试用例很大的灵活性,你可以一起跑所有的测试,也可以只测试某一个用例文件。

相关资料:

PHPUnit官方网站

PHPUnit手册地址 中文版(有点老了)

我会在将来发布的代码中加入测试 

PHPUnit入门(一)

废话就不多说了。也许你知道了单元测试,但又不知道怎么开始,这是个常见的问题,因为我也碰到过,希望下面这个说明会对有帮助,以windows平台为例。

运行PHPUnit需要PHP5的命令行,所以这里需要php的解释器。这里可能有个小麻烦,每个人的环境不一样,像我自己的用的一个集成环境就没有php解释器,所以可以根据自己的需要安装,可以去官方网站下一个最新的。常见的安装方法是通过PEAR Install来安装。一般安装php后可以还没有安装pear,但有一个脚本会自行安装pear。在php5的安装目录下,运行go-pear。这样会有一个向导安装pear,一直回车吧。如果安装成功在php5的安装目录下面会有一个pear.bat文件,这样就可以继续安装PHPUnit了。

pear channel-discover pear.phpunit.de

pear install phpunit/PHPUnit

运行上面命令后,会自动安装PHPUnit,安装完毕后在PHP5的安装目录下会有phpunit.bat这个文件,这样你就有了phpunit的命令行工具,在默认情况下PHP5的安装目录会自动加入到PATH环境变量中。 

 

使用Zend_XmlRpc_Server

前几天在用Django使用MetaWeblog API的实现,发现非常方便。由于我原来用ZF做这个API发现不能使用。一切的原因,可能是我太。。。。

关于Zend_XmlRpc的Debug非常不方便,这让我非常头痛,真的,痛了星期六和星期日。后来使用log后,才发现问题的所在。 在还没有使用log前,我使用Zend_XmlRpc_Client做测试,但使用Zend_XmlRpc_Client后,返回的结果已经自动转换成php类型了。搞得我以为Zend_XmlRpc_Server不会自动转换结果,然后我自己手动转换,这样的话返回的值就错了。直接返回准备好的结果就OK了。

/**
     * The Blogger API getUsersBlogs
     *
     * @param string $appkey
     * @param string $username
     * @param string $password
     * @return array
     */
    public function getUsersBlogs($appkey, $username, $password)
    {
        $authAdapter = new AdminAuth($username, $password);
        $result = $authAdapter->authenticate();

        if ($result->isValid()) {
            $xmls = array(
                array('url' => 'http://'.$_SERVER['SERVER_NAME'], 'blogid' => 1, 'blogName' => Options::title)
            );
            return $xmls;
        }
    }

PHP 5 in Practice

今天,由于早上停电,就往书店里面跑了一下,看到几本讲PHP5的书,扫了几眼后,发现有一本非常不错。《PHP 5 in Practice》我觉得这本书非常好。初学和深入都非常不错。有时间买一本来看看,好象是刚上市的。

关于ZendFramework的一些不足

从0.15到现在的0.9.3,我差不多跟着ZendFramework的发展来改进我的这个站点程序。虽然,现在还是相当的简陋。

首先,我说下我对PHP的看法。PHP做为入门语言非常好,简单且强大。就PHP4来说,典型的面向过程开发方式,虽然有许多人为PHP4做了许多努力,让PHP4用起来更面向对象。我对这种方式并没有什么好感,把所在的代码放在一起,在许多tr中找<?php ?>,而且我对DW直接生成的html感到非常厌恶。让人感觉整个工作被你全包了似的。后来,我的工作转向python方面的,但我对php并没有放弃。PHP5+框架被我认为是让我对PHP重新提起兴趣的东西。所以,就有了这个站。

现在ZendFramework已经发展到0.9.3版,RC1马上就会发布。我不知道ZF的开发哲学是什么,一个MVC架构还要分成几个包,虽然现在已经整合了View,但这种整合并不是真实的。而且在最近的两次更新中,向Zend_Controller中加入了太多的东西,这些东西的好坏我现在还不好判断,但我觉得不是很喜欢。ZF的模板机制也非常让人失望,我没有使用过Smart,我不想评论什么。Zope的tal和Django的模板引擎都非常优秀。

这些都是我认为的不足。当然,这些都不是什么大问题,大不了自己实现。我只是在想ZendFramework到底会发展成什么样呢? 

使用插件为ZendFramework提供gzip功能

今天再看Djangobook的中间件的时候,发现他的机制跟ZendFramework的插件机制是差不多的。所以就写了这个插件。

高级点的浏览器都是支持gzip压缩的,所以,可以将文本文件进行gzip压缩,然后发送给浏览器,浏览器会自动解压它们。这样可以大大减少文件的size。虽然,这个过程可以通过服务器来解决,但对服务器的控制要求挺高的。

基本原理是使用dispatchLoopShutdown钩子。这个钩子是在dispatch完成后调用的,所以,如果正确使用response对象来输出的话,这里就可以做许多事情。比如:使用php的gzencode函数对页面进行gzip压缩。现在这个插件还是初级版本,但基本原理就是这样,也是对plugin的一个说明。

Firefox2+LiveHTTPHeaders测试通过。 

插件下载 

Zend_View_Helper…

在ZendFreamework中,有一些帮助生成表单的对象,其中包括各种表单元素。由于这些表单很原始,如果想组成丰富一点的表单元素还是有点瘦。所以,我把其中一些元素封装了一下。比如:就在线编辑器封装成一个单独的Field。今天,想添加一个新的表单,但发现Zend_View_Helper太散了,对属性的调整很细致。但表单在大多数时候,除了定义一些基本和私有的属性,样式方面的完成可以由CSS来定义,基本上没有什么其它的需要。

我准备自己把这些field重新封装一下,不使用Zend_View_Helper。真是有点鸡肋的感觉。

ZendFramework 0.9.3

这个版本终于发布了。这次应该是非常重要的更新。在Zend_Controller方面又有新的东西添加进来。而且文档也更新了,针对最新的架构。中文文档严重落后。

加了个helper不知道有什么用,又要看看再说了。