PHP單元測試利器:PHPUNIT初探


開始動手安裝phpunit

  本文中將通過介紹php中的單元測試利器phpunit(http://phpunit.de/),並通過實際例子來講解如何在實際工作中運用phpunit。首先安裝phpunit的方法可以通過php下的pear去安裝:

\  
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear install phpunit/PHPUnit

  如果你想通過手動方式去安裝,可以參考phpunit的手冊去安裝(http://www.phpunit.de/manual/3.0/en/installation.html)。

  編寫第一個單元測試用例

  下面我們開始編寫第一個單元測試用例。在編寫測試用例時,要遵守如下的phpunit的規則:

  1 一般地,在測試用例中,可以擴展PHPUnit_Framework_TestCase類,這樣就可以使用象setUp(),tearDown()等方法了。

  2 測試用例的名字最好是使用約定俗成的格式,即在被測試類的后面加上”Test”,比如要測試的類為RemoteConnect,則測試用例的命名為RemoteConnectTest。

  3 在一個測試用例中的所有的測試方法,在命名時都應該以test+測試方法名去命名,如testDoesLikeWaffles(),要注意的是該方法必須是聲明為public類型的。當然可以在你的測試用例中包含private的方法,但它們不能被phpunit所調用。

  4 測試方法中是不能接收參數的。

  下面首先舉個簡單的例子,代碼如下:

<?php
class RemoteConnect
{
  public function connectToServer($serverName=null)
  {
    if($serverName==null){
      throw new Exception(“That's not a server name!”);
    }
    $fp = fsockopen($serverName,80);
    return ($fp) ? true : false;
  }
  public function returnSampleObject()
  {
    return $this;
  }
}
?>

上面的代碼其實是實現連接到一個指定的服務器的功能,那么我們可以編寫測試代碼如下:

<?php
require_once('RemoteConnect.php');
class RemoteConnectTest extends PHPUnit_Framework_TestCase
{
  public function setUp(){ }
  public function tearDown(){ }
  public function testConnectionIsValid()
  {
    // test to ensure that the object from an fsockopen is valid
    $connObj = new RemoteConnect();
    $serverName = 'www.google.com';
    $this->assertTrue($connObj->connectToServer($serverName) !== false);
  }
}
?>

在上面的代碼中,由於繼承了PHPUnit_Framework_TestCase類,因此在setUp和tearDown方法中,不需要編寫任何代碼。SetUp方法是在每個測試用例運行前進行一些初始化的工作,而tearDown則在每個測試用例運行后進行一些比如資源的釋放等工作。在測試方法中,通過使用phpunit的斷言assertTrue去判斷所返回的布爾值是否為真,這里是通過調用RemoteConnect.php中的connectToServe方法去判斷能否連接上服務器。

 

接下來我們運行這個單元測試,在命令行下輸入代碼:

  phpunit /path/to/tests/RemoteConnectTest.php即可,可以看到測試順利通過的話,會輸出以下結果:

PHPUnit 3.4 by Sebastian Bergmann
.
Time: 1 second
Tests: 1, Assertions: 1, Failures 0

可以看到,上面是通過了測試。默認情況下,phpunit是會運行測試用例中的所有測試方法的。下面再介紹下phpunit中相關的幾個斷言:

AssertTrue/AssertFalse    斷言是否為真值還是假
AssertEquals        判斷輸出是否和預期的相等
AssertGreaterThan         斷言結果是否大於某個值,同樣的也有LessThan(小於),GreaterThanOrEqual(大於等於),
LessThanOrEqual           (小於等於).
AssertContains            判斷輸入是否包含指定的值
AssertType                判斷是否屬於指定類型
AssertNull                判斷是否為空值
AssertFileExists          判斷文件是否存在
AssertRegExp              根據正則表達式判斷

舉個例子來說明下比如AssertType的使用,依然以上面的例子來說,可以用AssertType去判斷returnSampleObject返回的對象實例是否為remoteConnect,代碼如下:

<?php
function testIsRightObject() {
  $connObj = new RemoteConnect();
  $returnedObject = $connObj->returnSampleObject();
  $this->assertType('remoteConnect', $returnedObject);
}
?>

目前PHP框架對單元測試的支持

  目前很多優秀的php框架(如Zend Framework,Symfony等),都提供了對單元測試很好的支持。以Zend Framework為例,說明下其中是如何運行單元測試的。

<?php
class CommentControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
  public function setUp()
  {
    parent::setUp();
  }
  public function tearDown()
  {
    parent::tearDown();
  }
  public function appBootstrap()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM