欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP單元測試利器 PHPUNIT深入用法(三)第1/2頁

 更新時間:2011年03月06日 21:48:19   作者:  
在本系列文章的前兩篇中PHP單元測試利器:PHPUNIT初探和PHP單元測試利器:PHPUNIT深入用法(二)中,分別介紹了phpunit的基本用法和phpunit中的一些重要用法。
在本文中,筆者將為大家介紹phpunit中的兩個高級概念和用法,盡管它不一定在你的日常單元測試中都用到,但理解和學(xué)會它們的用法對學(xué)習(xí)phpunit還是十分重要的。

  Phpunit中的Annotations

  如果有其他編程語言經(jīng)驗的開發(fā)者,應(yīng)該對Annotations(注解)不陌生,其實在phpunit中,一個簡單的如下面的一段注釋也可以認為是Annotations:

<?php
class MyTestClass extends PHPUnit_Framework_TestCase
{
/**
* Testing the answer to “do you love unit tests?”
*/
public function testDoYouLoveUnitTests()
{
$love = true;
$this->assertTrue($love);
}
}
?>

   可以看到,其實一段以/** **/為標記的文字,就可以認為是一種Annotations,但Annotations其實不單單是簡單的注釋,它是與一個程序元素相關(guān)聯(lián)信息或者元數(shù)據(jù)的標注,它不影響程序的運行,但相關(guān)的軟件工具或框架能夠?qū)⑵滢D(zhuǎn)換成特殊的元數(shù)據(jù)標記,以方便開發(fā)者以更少的代碼去提高效率(比如通過。如果你熟悉Java,則會發(fā)現(xiàn)在Java SE 5中及象Spring等框架中,都大量使用了Annotations。

  然而,由于php并不象Java那樣是編譯性語言,因此本身缺乏去解析Annotations的機制,但幸好phpunit去提供了這樣的功能,我們以下面的代碼為例:

<?php
class MyMathClass
{
/**
* Add two given values together and return sum
*/
public function addValues($a,$b)
{
return $a+$b;
}
}
?>

   上面的只是一個簡單的加法的例子,為此,我們使用Annotations去編寫一個單元測試,在上兩篇文章中,我們采用的是手工編寫單元測試的方法,而本文中,將介紹使用phpunit命令行的方法,自動生成單元測試的框架,方法如下:

  首先把上面的類保存為MyMathClass.php,然后在命令行下運行如下命令:

phpunit –skeleton-test MyMathClass

   這時phpunit會自動生成如下的框架單元測試代碼:

<?php
require_once '/path/to/MyMathClass.php';
/**
* Test class for MyMathClass.
* Generated by PHPUnit on 2011-02-07 at 12:22:07.
*/
class MyMathClassTest extends PHPUnit_Framework_TestCase
{
/**
* @var MyMathClass
*/
protected $object;
/**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
protected function setUp()
{
$this->object = new MyMathClass;
}
/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*/
protected function tearDown()
{
}
/**
* @todo Implement testAddValues().
*/
public function testAddValues()
{
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet.'
);
}
}
?>

   可以看到,phpunit為我們生成的單元測試代碼自動引入了原來的MyMathClass.php,同時也生成了setUp和tearDown方法,但唯一的核心單元測試代碼是留給了我們編寫。如果想在這個基礎(chǔ)上更快速的生成我們想要的單元測試代碼,要如何實現(xiàn)呢?沒錯,就是使用annotations!我們可以在原來的MyMathClass.php中加入如下的annotations。

<?php
class MyMathClass
{
/**
* Add two given values together and return sum
* @assert (1,2) == 3
*/
public function addValues($a,$b)
{
return $a+$b;
}
}
?>

  然后再象上述一樣在命令行運行:

  phpunit –skeleton-test MyMathClass

  這個時候會為我們生成如下的單元測試代碼:

<?php
/**
* Generated from @assert (1,2) == 3.
*/
public function testAddValues()
{
$this->assertEquals(
3,
$this->object->addValues(1,2)
);
}
?>

  看到了么?我們在原有的類中加入了注解@assert(1,2)==3,則phpunit自動為我們生成了正確的單元測試代碼。當然,可以參考phpunit手冊,學(xué)習(xí)到更多的關(guān)于@assert注解使用的規(guī)則。

  下面再舉一個例子來講解annotations。假設(shè)我們的程序中的一個方法,只是僅需要數(shù)據(jù)的輸入,并且不依賴XML或者數(shù)據(jù)庫提供數(shù)據(jù)源,則為了測試這個方法,我們可能想到的一個方法是在程序中設(shè)置一個測試數(shù)據(jù)集去測試,但這里介紹一個比較簡單的方法,就是使用注解@dataProvider,修改MyMathClass.php如下:

<?php
/**
* Data provider for test methods below
*/
public static function provider()
{
return array(
array(1,2,3),
array(4,2,6),
array(1,5,7)
);
}
/**
* Testing addValues returns sum of two values
* @dataProvider provider
*/
public function testAddValues($a,$b,$sum)
{
$this->assertEquals(
$sum,
$this->object->addValues($a,$b)
);
}
?>

   可以看到,這里使用了注解@dataProvider,指明了測試用例的數(shù)據(jù)提供者是由provider方法返回的一個數(shù)組。所以在單元測試時,數(shù)組中的第0個元素則會賦值給$a,第1個元素則會賦值給b,第3個元素則會賦值給sum,可以看到,上面的第3個數(shù)組提供的數(shù)據(jù)是不能通過單元測試的,因為1+5不等于7。

  此外,這里還簡單介紹兩個常用的annotations,比如@expectedException注解可以測試代碼中是否正確拋出了異常,比如:

<?phprequire_once 'PHPUnit/Framework.php';
class ExceptionTest extends PHPUnit_Framework_TestCase{    
/**  
   * @expectedException InvalidArgumentException    
*/    
public function testException()    {  
  }
}

?>

   這里就用注解的方法表示testException中必須拋出的異常類型為InvalidArgumentException。

  另外一個是@cover注解。它的作用是標識phpunit只為類中的哪些方法或作用域生成測試代碼,比如:

/**
     * @covers SampleClass::publicMethod
     * @covers SampleClass::<!public>
     * @covers HelperClass<extended>
    
*/
    
public function testMethod()
    {
        
$result = SampleClass::method();
}

   則phpunit只為SampleClass類中的publicMethod方法、SampleClass類中的所有非public聲明的方法和HelperClass類或者它的其中一個父類產(chǎn)生單元測試代碼。

相關(guān)文章

  • PHP下利用shell后臺運行PHP腳本,并獲取該腳本的Process ID的代碼

    PHP下利用shell后臺運行PHP腳本,并獲取該腳本的Process ID的代碼

    PHP下利用shell后臺運行PHP腳本,并獲取該腳本的Process ID的代碼,學(xué)習(xí)php的朋友可以參考下。
    2011-09-09
  • php防止惡意刷新與刷票的方法

    php防止惡意刷新與刷票的方法

    這篇文章主要介紹了php防止惡意刷新與刷票的方法,實例匯總了常用的cookie方法、session方法及文本數(shù)據(jù)方法等,具有不錯的實用價值,需要的朋友可以參考下
    2014-11-11
  • PHP中有關(guān)長整數(shù)的一些操作教程

    PHP中有關(guān)長整數(shù)的一些操作教程

    這篇文章主要給大家介紹了關(guān)于PHP中有關(guān)長整數(shù)的一些操作教程,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用PHP具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 解析array splice的移除數(shù)組中指定鍵的值,返回一個新的數(shù)組

    解析array splice的移除數(shù)組中指定鍵的值,返回一個新的數(shù)組

    array_splice這個數(shù)組函數(shù)在w3school的解釋是把數(shù)組中的一部分去掉并用其它值取代。所以我在做數(shù)組移除的時候沒有考慮到用這個函數(shù),或者因為從來沒有用過
    2013-07-07
  • 一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]

    一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]

    以下是一些PHP Coding Tips. 當然, 這些Tips并不一定僅僅局限于PHP.大家有什么好的心得, 歡迎直接回復(fù)本文與更多的人分享.. 謝謝
    2011-05-05
  • 總結(jié)對比php中的多種序列化

    總結(jié)對比php中的多種序列化

    序列化是將變量轉(zhuǎn)換為可保存或傳輸?shù)淖址倪^程;反序列化就是在適當?shù)臅r候把這個字符串再轉(zhuǎn)化成原來的變量使用。這兩個過程結(jié)合起來,可以輕松地存儲和傳輸數(shù)據(jù),使程序更具維護性。下面來看php中多種序列化的對比。
    2016-08-08
  • 解析phpstorm + xdebug 遠程斷點調(diào)試

    解析phpstorm + xdebug 遠程斷點調(diào)試

    本篇文章是對phpstorm + xdebug 遠程斷點調(diào)試進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • php swoft框架實例用法

    php swoft框架實例用法

    在本篇文章里小編給大家分享了一篇關(guān)于php swoft框架實例用法,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • php安裝grpc擴展的具體步驟

    php安裝grpc擴展的具體步驟

    在本篇文章里小編給大家整理的是一篇關(guān)于php安裝grpc擴展的具體步驟,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • PHP實現(xiàn)的敏感詞過濾方法示例

    PHP實現(xiàn)的敏感詞過濾方法示例

    這篇文章主要介紹了PHP實現(xiàn)的敏感詞過濾方法,涉及php字符串正則匹配、分割、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03

最新評論