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

來源:互聯網
上載者:User

在本文中,筆者將為大家介紹phpunit中的兩個進階概念和用法,儘管它不一定在你的日常單元測試中都用到,但理解和學會它們的用法對學習phpunit還是十分重要的。

  Phpunit中的Annotations

  如果有其他程式設計語言經驗的開發人員,應該對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其實不單單是簡單的注釋,它是與一個程式元素相關聯資訊或者中繼資料的標註,它不影響程式的運行,但相關的軟體工具或架構能夠將其轉換成特殊的中繼資料標記,以方便開發人員以更少的代碼去提高效率(比如通過。如果你熟悉Java,則會發現在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方法,但唯一的核心單元測試代碼是留給了我們編寫。如果想在這個基礎上更快速的產生我們想要的單元測試代碼,要如何?呢?沒錯,就是使用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手冊,學習到更多的關於@assert註解使用的規則。

  下面再舉一個例子來講解annotations。假設我們的程式中的一個方法,只是僅需要資料的輸入,並且不依賴XML或者資料庫提供資料來源,則為了測試這個方法,我們可能想到的一個方法是在程式中設定一個測試資料集去測試,但這裡介紹一個比較簡單的方法,就是使用註解@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,指明了測試案例的資料提供者是由provider方法返回的一個數組。所以在單元測試時,數組中的第0個元素則會賦值給$a,第1個元素則會賦值給b,第3個元素則會賦值給sum,可以看到,上面的第3個數組提供的資料是不能通過單元測試的,因為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類或者它的其中一個父類產生單元測試代碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.