且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PHPUnit学习02---如何管理TestCase

更新时间:2022-09-21 20:29:01

本文目的

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

批量运行

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

PHPUnit学习02---如何管理TestCase

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

PHPUnit学习02---如何管理TestCase

在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。可以通过下面的例子,了解整个调用过程。

PHPUnit学习02---如何管理TestCase

代码如下:

MySuite.php

1
2
3
4
5
6
7
<?php
require_once 'MyTest.php';
 
class MySuite extends PHPUnit_Framework_TestSuite
{
    public static function suite()
    {
1
2
3
4
5
6
7
8
9
10
11
12
13
        return new MySuite('MyTest');
    }
    protected function setUp()
    {
        print "\nMySuite::setUp()";   
    }
 
    protected function tearDown()
    {
        print "\nMySuite::tearDown()";
    }
}
?>

 

MyTest.php

1
2
3
4
5
6
7
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        print "\nMyTest::setUp()";
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    protected function tearDown()
    {
        print "\nMyTest::tearDown()";
    }
 
    public function testOne()
    {
        print "\nMyTest::testOne()";
    }
 
    public function testTwo()
    {
        print "\nMyTest::testTwo()";
    }
}
?>

PHPUnit系统架构

PHPUnit学习02---如何管理TestCase

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

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

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

使用testsuite管理所有测试用例

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

PHPUnit学习02---如何管理TestCase

PHPUnit学习02---如何管理TestCase

PHPUnit学习02---如何管理TestCase

PHPUnit学习02---如何管理TestCase

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

PHPUnit学习02---如何管理TestCase

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

PHPUnit学习02---如何管理TestCase

PHPUnit学习02---如何管理TestCase

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

PHPUnit学习02---如何管理TestCase

PHPUnit学习02---如何管理TestCase

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

PHPUnit学习02---如何管理TestCase

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

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

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

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

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

参考文献

声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。
本文转自bourneli博客园博客,原文链接:http://www.cnblogs.com/bourneli/archive/2012/04/27/2474005.html,如需转载请自行联系原作者