2011-04-09 53 views
4

我需要測試一些我使用PHP 5創建的函數,這些函數執行我的Web應用程序所需的數據庫CRUD類型操作(SELECT,UPDATE,INSERT,DELETE)。PHP MySQL函數單元測試

我一直在尋找PHP單元測試套件,例如簡單測試和PHP單元,它似乎提供了我所需要的,但是我不確定我是如何實現這一目的的,因爲等價劃分和邊界分析並不是全部明確。我是否需要輸入不同的變量並改變它?這似乎毫無意義,因爲不同的字符串可能不一定有任何區別。

對此的任何指導將有所幫助,因爲我以前沒有遇到過這個問題。

回答

3

如果您正在測試PHP代碼和MySQL數據庫之間的交互,那麼您正在執行集成測試,而不是單元測試。

以下是使用Enhance PHP framework進行集成測試的一些示例,它測試保存並檢索租戶對象的存儲庫類。

它不是針對預先填充的數據庫運行,而是運行在完全空的數據庫上,並使用簡單的表助手來創建和銷燬表。這消除了對測試數據庫中處於正確狀態的特定數據的依賴性,這很難保持一步。

<?php 
class TenantRepositoryTestFixture extends EnhanceTestFixture { 
    private $Target; 

    public function SetUp() { 
     $tables = new TableHelper(); 
     $tables->CreateTenantTable(); 
     $this->Target = Enhance::GetCodeCoverageWrapper('TenantRepository'); 
    } 

    public function TearDown() { 
     $tables = new TableHelper(); 
     $tables->DropTenantTable(); 
    } 

    public function SaveWithNewTenantExpectSavedTest() { 
     $tenant = new Tenant(); 
     $tenant->Name = 'test'; 

     $saved = $this->Target->Save($tenant); 
     $result = $this->Target->GetById($saved->Id); 

     Assert::AreNotIdentical(0, $result->Id); 
     Assert::AreIdentical($tenant->Name, $result->Name); 
    } 

    public function SaveWithExistingTenantExpectSavedTest() { 
     $tenant = new Tenant(); 
     $tenant->Name = 'test'; 
     $saved = $this->Target->Save($tenant); 
     $saved->Name = 'changed'; 
     $saved = $this->Target->Save($saved); 

     $result = $this->Target->GetById($saved->Id); 

     Assert::AreIdentical($saved->Id, $result->Id); 
     Assert::AreIdentical($saved->Name, $result->Name); 
    } 
} 
?> 
1

通常,單元測試的想法是確保如果您進行更改,您只需運行一系列簡單的測試以確保現有功能不會中斷。所以說,您需要涵蓋您期望的典型數據,以及邊緣/邊界情況,這些情況可能包括帶引號的字符串(以驗證它們是否正確轉義),SQL注入攻擊(相同) ,空字符串,不同編碼的字符串,NULL,布爾型true等。每個測試都應驗證給定輸入的數據,您將獲得預期的結果,在這種情況下(分別爲):轉義字符串插入,轉義字符串插入,插入空字符串,轉換或拋出不同編碼後插入,插入NULL值,插入字符串'true'等。

我在幾年內沒有使用任何一種測試框架,但我記得PHPUnit有很好的結果。