PHPUnit-函数依赖-数据提供-异常-忽略-自动生成

本文目的

本文目的是收录一些PHPUnit的有用技巧,这些技巧能够为给PHPUnit单元测试带来很多便利。本文将要介绍的技巧如下:

  • 函数依赖测试
  • 数据提供函数
  • 异常测试
  • 跳过忽略测试
  • 自动生成测试框架

函数依赖测试

有时候,类中的函数有依赖,而且你的逻辑需要被依赖函数正确执行,此时,你可以通过phpunit的依赖标签显示的标明这种依赖关系,如果任意被依赖的函数执行失败,那么依赖函数将会被自动跳过。如下所示代码(dependenceDemo.cpp):

 1 <?php
 2 class DependanceDemo extends PHPUnit_Framework_TestCase
 3 {
 4     public function testOne()
 5     {
 6         echo "testOne\n";
 7         $this->assertTrue(TRUE);
 8     }
 9
10     public function testTwo()
11     {
12         echo "testTwo\n";
13         $this->assertTrue(FALSE);
14     }
15
16     /**
17      * @depends testOne
18      * @depends testTwo
19      */
20     public function testThree()
21     {
22     }
23 }
24 ?>

上面的代码执行结果如下图:

可以看到,testThree依赖testOne和testTwo,但是testTwo失败,所以testThree被跳过,使用S表示。

@depends标签还可以依赖返回值。如下例子所示(paramDependence.php),

 1 <?php
 2 class DependanceDemo extends PHPUnit_Framework_TestCase
 3 {
 4     public function testOne()
 5     {
 6         $this->assertTrue(TRUE);
 7         return "testOne";
 8     }
 9
10     public function testTwo()
11     {
12         $this->assertTrue(TRUE);
13         return "testTwo";
14     }
15
16     /**
17      * @depends testOne
18      * @depends testTwo
19      */
20     public function testThree($param1, $param2)
21     {
22         echo ‘First param:  ‘.$param1."\n";
23         echo ‘Second param: ‘.$param2."\n";
24     }
25 }
26 ?>

上面代码的执行结果如下:

值得注意的是,函数的顺序与依赖标签的数序一致。

数据提供函数

函数一般会有多组不同的输入参数,如果每一组参数都写一个测试函数,那么写测试比较麻烦,如果能提供一种批量的参数输入方法,那么测试代码将会简洁许多。好在,phpunit提供@dataProvider标签,支持这种特性,看如下代码(dataProviderDemo.php):

 1 <?php
 2 class DataTest extends PHPUnit_Framework_TestCase
 3 {
 4     /**
 5      * @dataProvider provider
 6      */
 7      public function testAdd($a, $b, $c)
 8      {
 9         $this->assertEquals($c, $a + $b);
10     }
11     public function provider()
12     {
13         return array(
14             array(0, 0, 0),
15             array(0, 1, 1),
16             array(1, 1, 1),
17             array(1, 2, 3)
18         );
19     }
20 }?>

上面的代码输出如下所示:

可以看到,函数testAdd遍历了函数provider的返回的结果,并将他们作为参数,被@dataProvider标记的函数的唯一要求就是返回数组。

异常测试

PHPUnit提供三种方法测试异常,如下面代码所示(exceptionsDemo.php):

 1 <?php
 2 class ExceptionsDemo extends PHPUnit_Framework_TestCase
 3 {
 4     /**
 5      * @expectedException InvalidArgumentException
 6      */
 7     public function testTagException()
 8     {
 9         throw new InvalidArgumentException;
10     }
11
12     public function testApiException()
13     {
14         $this->setExpectedException(‘InvalidArgumentException‘);
15         throw new InvalidArgumentException;
16     }
17
18     public function testTryException()
19     {
20         try
21         {
22             throw new InvalidArgumentException;
23         }
24         catch (InvalidArgumentException $expected)
25         {
26             return;
27         }
28         $this->fail(‘An expected exception has not been raised.‘);
29     }
30 }
31 ?>

当然,这三种方法各有用处,效果等同,使用时看需要而定。

跳过忽略测试

在编写单元测试过程中,有时候只写出了测试方法名称,没有写具体的测试内容。这样,PHPUnit框架默认的认为此测试通过,这样,我们很可能忘记了该测试方法还没有实现,如果使用$this->fail(),只能表明该测试失败,但是该测试并没有失败,令人误解。所以,我们需要PHPUnit提供一组方法,使得可以跳过没有实现的测试,并且给与正确的提示。PHPUnit提供下面这四个方法,帮助我们办到这一点:


方法


意义


void markTestSkipped()


标记当前的测试被跳过,用“S”标记


void markTestSkipped(string $message)


标记当前的测试被跳过,用“S”标记,并且输出一段示消息


void markTestIncomplete


标记当前的测试不完全,用“I”标记


void markTestIncomplete(string $message)


标记当前的测试不完全,用“I”标记,并且输出一段提示消息

下面的代码演示了上面四个方法的使用(SIMarkDemo.php):

 1 <?php
 2 class SkipIncompleteMarkDemo extends PHPUnit_Framework_TestCase
 3 {
 4     public function testSkipped()
 5     {
 6         $this->markTestSkipped();
 7     }
 8
 9     public function testSkippedWithMessage()
10     {
11         $this->markTestSkipped("this is a skipped test.");
12     }
13
14     public function testIncomplete()
15     {
16         $this->markTestIncomplete();
17     }
18
19     public function testIncompleteWithMessage()
20     {
21         $this->markTestIncomplete("this is a incomplete test.");
22     }
23 }
24 ?>

输出结果如下

自动生成测试框架

在编写单元测试的时候,你会发现有些代码都是千篇一律的,比如testXXXX(){…..},所以基于这种考虑,PHPUnit提供了生成测试框架的命令。该命令可以给为被测试的类中的每一个方法生成一个默认的测试方法,该方法使用markTestIncomplete标记。

如下图面的代码表示的类,

 1 <?php
 2 class Calculator
 3 {
 4     public function add($a, $b)
 5     {
 6         return $a + $b;
 7     }
 8
 9     public function minus($a, $b)
10     {
11         return $a - $b;
12     }
13 }
14 ?>

使用如下命令:

将会生成一个类CalculatorTest.php,内容如下:

 1 <?php
 2 require_once ‘PHPUnit/Framework.php‘;
 3
 4 require_once ‘/home/bourneli/test/UnitTestDemo/PHPUnitFeatures/Calculator.php‘;
 5
 6 /**
 7  * Test class for Calculator.
 8  * Generated by PHPUnit on 2011-05-24 at 20:54:59.
 9  */
10 class CalculatorTest extends PHPUnit_Framework_TestCase
11 {
12     /**
13      * @var Calculator
14      */
15     protected $object;
16
17     /**
18      * Sets up the fixture, for example, opens a network connection.
19      * This method is called before a test is executed.
20      */
21     protected function setUp()
22     {
23         $this->object = new Calculator;
24     }
25
26     /**
27      * Tears down the fixture, for example, closes a network connection.
28      * This method is called after a test is executed.
29      */
30     protected function tearDown()
31     {
32     }
33
34     /**
35      * @todo Implement testAdd().
36      */
37     public function testAdd()
38     {
39         // Remove the following lines when you implement this test.
40         $this->markTestIncomplete(
41           ‘This test has not been implemented yet.‘
42         );
43     }
44
45     /**
46      * @todo Implement testMinus().
47      */
48     public function testMinus()
49     {
50         // Remove the following lines when you implement this test.
51         $this->markTestIncomplete(
52           ‘This test has not been implemented yet.‘
53         );
54     }
55 }
56 ?>

可以看到,该框架还是比较完整的,生成了setUp,tearDown函数,还为每一个函数生成了一个测试方法。当然,phpunit还提供替他框架函数,如果想要了解更多,可以参见参考文档中的链接。

参考文档



文章来源:http://www.cnblogs.com/bourneli/archive/2012/09/08/2676978.html

时间: 2024-10-06 11:50:22

PHPUnit-函数依赖-数据提供-异常-忽略-自动生成的相关文章

php学习之道:php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供一种办事接口的统称. WSDL提供"能办的事的文档说明":  对要提供的服务的一种描述格式.我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型. SOAP提供"请求"的规范:  向服务接口传递请求的格式,包括方法和参数等.你想让人家办事,总得告诉人家

STM32代码自动生成工具使用说明

1.什么是"代码自动生成工具" 为了降低开发者的开发门槛,缩短开发周期,降低开发资源投入,机智云推出了代码自动生成服务.云端会根据产品定义的数据点生成对应产品的设备端代码. 自动生成的代码实现了机智云通信协议的解析与封包.传感器数据与通信数据的转换逻辑,并封装成了简单的API,且提供了多种平台的实例代码.当设备收到云端或APP端的数据后,程序会将数据转换成对应的事件并通知到应用层,开发者只需要在对应的事件处理逻辑中添加传感器的控制函数,就可以完成产品的开发. 使用自动生成的代码开发产品

ADO.NET入门教程(二)了解.NET数据提供程序

摘要 在上一篇文章<你必须知道的ADO.NET(一) 初识ADO.NET>中,我们知道ADO.NET的两大核心组件分别是Data Provider和DataSet.如果说DataSet是ADO.NET的心脏,那么Data Provider绝对是ADO.NET的左臂右膀.Data Provider提供了访问外部数据数据源的可能性,而且外部的数据源是多样的.本文将详细说明.NET数据提供程序的作用以及如何访问不同的数据源. 目录 什么是.NET数据提供程序? .NET数据提供程序的核心对象 其他重

zabbix自动生成监控报表并定时发送邮件

实现思路: zabbix提供了一个获取事件的api,可以根据此api获取zabbix原始报警数据 将获取到的原始数据进行统计去重,统计触发器出现次数,并把重复的触发器删除,将需要用到的数据统一放到一个列表中 将第二步的列表进行遍历,并传入到HTML中,或者也可以使用pandas直接把数据建模,然后自动生成HTML表格 将生成的HTML作为邮件内容发送 定义获取的时间间隔 x=(datetime.datetime.now()-datetime.timedelta(minutes=30)).strf

页面自动生成工具设计

页面自动生成工具设计 1功能概述 1.1使用术语 页面自动生成工具:自定义查询条件以及数据显示的一种页面生成工具 1.2功能说明 页面自动生成工具是按照工程人员的需求定义查询条件以及数据显示方式的一种工具,数据显示可以用表格和图表的方式:查询统计以表格的方式显示数据,趋势页面以图表方式显示页面. 1.2.1查询统计页面 查询统计页面的设置如下图: "设置数据集":整个查询统计显示数据的完整sql语句. "查询条件设置":写完sql语句后点击"设置查询条件&

JavaBean自动生成get和set方法

用Myeclipse开发java web程序,写javabean的时候,如果字段很多的话,写get和set方法是一件很无语和浪费时间的事情,所以Myeclipse提供了一个自动生成这些方法的功能. 首先新建一个javabean user.java,字段有id,name,psw等.如下: public class Student {       private int id ; private String name; private String psw; } 保存后,右键user.java,选

【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像

前言 深度学习作为人工智能的重要手段,迎来了爆发,在NLP.CV.物联网.无人机等多个领域都发挥了非常重要的作用.最近几年,各种深度学习算法层出不穷, Generative Adverarial Network(GAN)自2014年提出以来,引起广泛关注,身为深度学习三巨头之一的Yan Lecun对GAN的评价颇高,认为GAN是近年来在深度学习上最大的突破,是近十年来机器学习上最有意思的工作.围绕GAN的论文数量也迅速增多,各种版本的GAN出现,主要在CV领域带来了一些贡献,如下图所示. 我们可

java UUID.randomUUID()自动生成主键作为Id或文件路径

UUID.randomUUID().toString()是javaJDK(1.5以上的版本)提供的一个自动生成主键的方法,它生成的是以为32位的数字和字母组合的字符,中间还参杂着4个 - 符号. 作用:它可以作为我们表的标识列来增加,比序列增长更加方便.当然还可以用来拼接作为路径,或者图片的前缀名等等. 使用原因: 文件命名或者其他使用时间命名对于高并发会存在风险,使用UUID会规避风险, import java.util.UUID: UUID.randomUUID().toString():

ibatis实战之插入数据(自动生成主键)

--------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert>元素的一个专用子元素)来获取这些自动生成的主键的值并将其保存在对象中.完成这项工作可以有两种方式,具体选择何种方式由你所使用的具体的主键生成技术来确定. 第一种方式是,当你把记录插入到数据库中并且数据库为该记录自动生成了主键值之后,就立即抓取该键值.此时要注意的是,必须确保所使用的数据库驱动程序确实能返回你执行上一条insert语句所得到的键值.