源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

PHP单元测试利器 PHPUNIT深入用法(三)第1/2页

  • 时间:2022-03-09 22:43 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:PHP单元测试利器 PHPUNIT深入用法(三)第1/2页
在本文中,笔者将为大家介绍phpunit中的两个高级概念和用法,尽管它不一定在你的日常单元测试中都用到,但理解和学会它们的用法对学习phpunit还是十分重要的。   [b]Phpunit中的Annotations[/b]   如果有其他编程语言经验的开发者,应该对Annotations(注解)不陌生,其实在phpunit中,一个简单的如下面的一段注释也可以认为是Annotations:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] <?php [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] class MyTestClass extends PHPUnit_Framework_TestCase [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Testing the answer to “do you love unit tests?” [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public function testDoYouLoveUnitTests() [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $love = true; [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $this->assertTrue($love); [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ?>
   可以看到,其实一段以/** **/为标记的文字,就可以认为是一种Annotations,但Annotations其实不单单是简单的注释,它是与一个程序元素相关联信息或者元数据的标注,它不影响程序的运行,但相关的软件工具或框架能够将其转换成特殊的元数据标记,以方便开发者以更少的代码去提高效率(比如通过。如果你熟悉Java,则会发现在Java SE 5中及象Spring等框架中,都大量使用了Annotations。   然而,由于php并不象Java那样是编译性语言,因此本身缺乏去解析Annotations的机制,但幸好phpunit去提供了这样的功能,我们以下面的代码为例:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] <?php [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] class MyMathClass [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Add two given values together and return sum [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public function addValues($a,$b) [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] return $a+$b; [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ?>
   上面的只是一个简单的加法的例子,为此,我们使用Annotations去编写一个单元测试,在上两篇文章中,我们采用的是手工编写单元测试的方法,而本文中,将介绍使用phpunit命令行的方法,自动生成单元测试的框架,方法如下:   首先把上面的类保存为MyMathClass.php,然后在命令行下运行如下命令:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] phpunit –skeleton-test MyMathClass
   这时phpunit会自动生成如下的框架单元测试代码:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] <?php [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] require_once '/path/to/MyMathClass.php'; [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Test class for MyMathClass. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Generated by PHPUnit on 2011-02-07 at 12:22:07. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] class MyMathClassTest extends PHPUnit_Framework_TestCase [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * @var MyMathClass [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] protected $object; [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Sets up the fixture, for example, opens a network connection. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * This method is called before a test is executed. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] protected function setUp() [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $this->object = new MyMathClass; [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Tears down the fixture, for example, closes a network connection. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * This method is called after a test is executed. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] protected function tearDown() [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * @todo Implement testAddValues(). [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public function testAddValues() [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] // Remove the following lines when you implement this test. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $this->markTestIncomplete( [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] 'This test has not been implemented yet.' [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ); [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ?> [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]
   可以看到,phpunit为我们生成的单元测试代码自动引入了原来的MyMathClass.php,同时也生成了setUp和tearDown方法,但唯一的核心单元测试代码是留给了我们编写。如果想在这个基础上更快速的生成我们想要的单元测试代码,要如何实现呢?没错,就是使用annotations!我们可以在原来的MyMathClass.php中加入如下的annotations。
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] <?php [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] class MyMathClass [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Add two given values together and return sum [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * @assert (1,2) == 3 [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public function addValues($a,$b) [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] return $a+$b; [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ?> [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]
  然后再象上述一样在命令行运行:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]   phpunit –skeleton-test MyMathClass
  这个时候会为我们生成如下的单元测试代码:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] <?php [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Generated from @assert (1,2) == 3. [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public function testAddValues() [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $this->assertEquals( [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] 3, [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $this->object->addValues(1,2) [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ); [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ?> [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]
  看到了么?我们在原有的类中加入了注解@assert(1,2)==3,则phpunit自动为我们生成了正确的单元测试代码。当然,可以参考phpunit手册,学习到更多的关于@assert注解使用的规则。   下面再举一个例子来讲解annotations。假设我们的程序中的一个方法,只是仅需要数据的输入,并且不依赖XML或者数据库提供数据源,则为了测试这个方法,我们可能想到的一个方法是在程序中设置一个测试数据集去测试,但这里介绍一个比较简单的方法,就是使用注解@dataProvider,修改MyMathClass.php如下:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] <?php [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Data provider for test methods below [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public static function provider() [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] return array( [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] array(1,2,3), [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] array(4,2,6), [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] array(1,5,7) [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ); [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * Testing addValues returns sum of two values [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] * @dataProvider provider [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public function testAddValues($a,$b,$sum) [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $this->assertEquals( [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $sum, [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] $this->object->addValues($a,$b) [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ); [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ?> [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]
   可以看到,这里使用了注解@dataProvider,指明了测试用例的数据提供者是由provider方法返回的一个数组。所以在单元测试时,数组中的第0个元素则会赋值给$a,第1个元素则会赋值给b,第3个元素则会赋值给sum,可以看到,上面的第3个数组提供的数据是不能通过单元测试的,因为1+5不等于7。   此外,这里还简单介绍两个常用的annotations,比如@expectedException注解可以测试代码中是否正确抛出了异常,比如:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] <?phprequire_once 'PHPUnit/Framework.php'; [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] class ExceptionTest extends PHPUnit_Framework_TestCase{     [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /**   [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]    * @expectedException InvalidArgumentException     */     [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] public function testException()    {   [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]   } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] ?> [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]
   这里就用注解的方法表示testException中必须抛出的异常类型为InvalidArgumentException。   另外一个是@cover注解。它的作用是标识phpunit只为类中的哪些方法或作用域生成测试代码,比如:
[img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] /** [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]      * @covers SampleClass::publicMethod [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]      * @covers SampleClass::<!public> [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]      * @covers HelperClass<extended> [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]      */ [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]     public function testMethod() [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]     { [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]         $result = SampleClass::method(); [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img] } [img]http://tech.chinaunix.net/CodeHighlighter/Images/OutliningIndicators/None.gif[/img]
   则phpunit只为SampleClass类中的publicMethod方法、SampleClass类中的所有非public声明的方法和HelperClass类或者它的其中一个父类产生单元测试代码。
当前1/2页 [b]1[/b][url=http://www.1sucai.cn/article/26493_2.htm]2[/url][url=http://www.1sucai.cn/article/26493_2.htm]下一页[/url][url=http://www.1sucai.cn/article/26493_all.htm]阅读全文[/url]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部