zoukankan      html  css  js  c++  java
  • PHPUnit学习02如何管理TestCase

    本文目的

    本文介绍了phpunit通用函数用法,整体架构,和如何使用TestSuite来管理项目的所有的测试用例。

    批量运行

    当配置好phpunit后,可以使用“phpunit someTestCase”命令执行单个用例,使得用例的执行很方便。但是如果testcase分散到多个文件中,一个一个的执行phpunit就变得很麻烦了。好在,phpunit命令提供了一些可选参数,可以使得批量处理Test Case变得容易,可以直接执行phpunit查看这些可选参数,如下所示:

    clip_image002

    上图中,红圈标注的地方就是用于批量运行测试用例的参数,同时,phpunit也可以默认的执行指定目录下*Test.php文件中的测试用例,并且是迭代的遍历所有子目录,如下面的例子:

    clip_image004

    在test/UnitTestDemo目录下面四个文件,只有两个文件是以*Test.php格式结尾,所以运行“phpunit test”命令可以批量的运行这些符合要求的用例。如果你希望更细粒度的控制执行特定用例,可以使用“--filter”参数,该参数通过过滤用例文件名称来执行特定文件中的测试用例。

    命名约定

    PHPUnit中默认的命令规则,可以使得运行测试用例变得十分方便。列举如下:

    • 自动执行每个TestCase类中test***形式的方法
    • 自动执行目录下*Test.php形式命名中的用例

    一旦遵守了这些命名约定,编写单元测试将会更加便捷。

    setUp和tearDown

    setUp和tearDown可以帮助我们搭建和清理测试环境,TestCase和TestSuite两个类均有这对函数,可以共用户重载。但是,需要注意这两对函数调用的时机不一样,在TestCase中,每一次test***方法调用前均会调用setUp方法,调用后均会调用tearDown方法。但是,在TestSuite中,只会在第一个testCase调用之前调用setup,最后一个testCase调用后,调用tearDown。可以通过下面的例子,了解整个调用过程。

    clip_image006

    代码如下:

    MySuite.php

    <?php
    require_once 'MyTest.php';
    
    class MySuite extends PHPUnit_Framework_TestSuite
    {
        public static function suite()
        {
            return new MySuite('MyTest');
        }
        protected function setUp()
        {
            print "\nMySuite::setUp()";    
        }
    
        protected function tearDown()
        {
            print "\nMySuite::tearDown()";
        }
    }
    ?>

    MyTest.php

    <?php
    class MyTest extends PHPUnit_Framework_TestCase
    {
        protected function setUp()
        {
            print "\nMyTest::setUp()";
        }
        protected function tearDown()
        {
            print "\nMyTest::tearDown()";
        }
    
        public function testOne()
        {
            print "\nMyTest::testOne()";
        }
    
        public function testTwo()
        {
            print "\nMyTest::testTwo()";
        }
    }
    ?>

    PHPUnit系统架构

    clip_image008

    上图展示的PHPUnit库的架构,看起来是不是似曾相识?如果你了解设计模式,应该不难发现PHPUnit的整体架构采用的“组合设计模式”,定义如下:

    组合设计模式将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.组合设计模式比较容易理解,它就是一个树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,组合设计模式将遍历整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。组合设计模式好处:1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。)

    注意:为了简洁,描述上图对象时,均省略掉“PHPUnit2_Framework_”前缀。所以,使用Test作为统一的接口, TestCase是测试用用例,继承于Assert,这样可以方便的调用Assert中的各种断言函数。TestSuite,是一个Test的集合,他可以包含任意的TestCase或TestSuite。这样设计的好处不言而喻——方便的组织测试用例和测试套件,客户代码不必关执行的是单个测试用例还是一整套测试套件或是更为复杂的测试用例树。

    使用testsuite管理所有测试用例

    有了上面的知识,现在就可以使用TestSuite对象管理和组织你的测试用例了。我们有如下四个测试用例需要组织:

    clip_image010

    clip_image012

    clip_image014

    clip_image016

    希望将Stack相关的测试一起运行,其他用例一起运行,并且在需要时,所有的用例可以全部运行,那么就创建如下三个测试套件对象。

    clip_image018

    上面的测试套件只添加Stack相关的测试,运行结果如下:

    clip_image020

    clip_image022

    上面的测试套件只添加其他测试用例,运行结果如下:

    clip_image024

    clip_image026

    如果希望运行所有的套件,可以使用上面的测试套件进行组织,运行结果如下:

    clip_image028

    通过上面代码中画圈的部分,可以发现一些共性:

    1) 测试套件类集成与PHPUnit_Framework_TestSuite类;

    2) 测试套件类必须实现public static function suite(){/*必须返回测试套件对象*/}接口;

    3) 通过addTestSuite(‘Test Case Class Name’),将具体的测试用例添加到测试套件中。

    如果在真实的项目中,可以以模块为单位组织测试套件。如过模块过大,可以在模块内部继续划分测试套件,这样,形成一个树装结构,需要运行那部分测试用例,只需要敲入一行命令“phpunit XXXXTestSuite.php”,就可以轻松执行(上面的代码见附件)。合理的使用测试套件,可以简洁有效的组织所有测试用例。

    参考文献

  • 相关阅读:
    SQL Server中的执行引擎入门
    SQL Server复制入门(一)复制简介
    Django 代码片断收集(持续更新)
    今天思路有点乱,随便记一点关于 xmlrpc 的
    PIL 学习笔记(1)
    Django newforms
    在 Django 的 View 中利用 function decorator 可实现一定程度的代码重用
    今天在 Linux 上顺利编译 PIL 1.1.6 成功
    用 PIL 写了个简单的缩略图生成程序
    [转贴] 中药内外合治急慢性鼻窦炎
  • 原文地址:https://www.cnblogs.com/bourneli/p/2474005.html
Copyright © 2011-2022 走看看