令人驚訝的是,這很容易。 記住單元測試的乙個**法則:隔離。 在程式中,如果另乙個函式被呼叫或另乙個類時,則含有它的**不被隔離。 這可能導致測試方法或功能之外的測試失敗。 因此,它不能被視為單元測試。 使用諸如檔案系統,資料庫和網路之類的資源也是如此。 結果可能會受到這些資源的影響,從而導致**不是孤立的,因此它不是單元測試。
為了演示依賴在現實世界中的含義,下面的**片段是user類的乙個簡單示例。 此類包裝**以建立使用者,將其儲存在資料庫中,並傳送啟用電子郵件。
<?php/*** class user */
class
user
= $value
; }}}
/*** validates properties
* * @return bool
*/public
function
isinputvalid ()
else
}/**
* creates password hash
*/public
function
createpassword ()
/*** verifies password
* @param string $password
* @return bool
*/public
function verifypassword ( $password
)
如你所見,到目前為止一切順利。 這裡沒問題。 **可以很容易地測試。 每種方法都很簡單; 僅使用user類中的**。 但是,從測試的角度來看,以下**段更糟糕:
/** * sends activation email
*/private
function
sendactivationemail ()
\nyour account has been activated\n
please visit \n
thank you");
$email->send();
}/**
* stores user to the database
* @return bool
*/public
function
createuser ()
$this->createpassword();
$db = $config->db;
/*@var $db \pdo
*/$sql = "insert into users(firstname, lastname, email,
password, salt) values (:firstname, :lastname, :email,
:password, :salt)";
$statement = $db->prepare( $sql
);
$statement->bindparam( ':firstname', $this->firstname );
$statement->bindparam( ':lastname', $this->lastname );
$statement->bindparam( ':email', $this->email );
$statement->bindparam( ':password', $this->password );
$statement->bindparam( ':salt', $this->salt );
if ($statement->execute())
else
}}
這是乙個簡單的user類,它包含或多或少的普通php**,用於處理使用者帳戶的建立並將資料儲存在資料庫中。 你可以說它是簡單,高效的**; 它沒有任何問題,為什麼要擔心呢?
首先,讓我們看看**做了什麼:
以下是測試此類時的問題:
為什麼這些問題呢? 他們真的有問題嗎?
通過在**中新增依賴項,您將增加複雜性。 **越複雜,它包含錯誤的可能性就越大,重構就越困難。 例如,只需將$ config設定為全域性變數,就可以非常輕鬆地將全域性變數傳遞給測試。 然而,問題是以簡單傳遞的物件開始的東西通常會變得更複雜。 要設定應用程式的配置,您需要建立類載入器,錯誤處理程式,載入配置等等。 突然間,您必須啟動應用程式並執行數百行**; 而不是測試乙個類,您正在測試一半的應用程式。 乙個簡單的建議是避免類中的全域性變數和會話變數。
我們的示例中的另乙個問題是使用mail類。 如果要執行測試,則不希望傳送電子郵件。
同樣,另乙個問題是與資料庫的連線。 php已經成為一種指令碼語言,它用於快速儲存和檢索mysql資料庫中的資料。 這種只是將資料傳入和傳出資料庫的**非常常見。 它有效,但考慮一下你是否想要改變行為; 例如,匯入使用者而沒有他們的密碼? 在這種情況下你能做些什麼; 使用另一種方法並執行**的副本?
公平地說,有很多方法可以做到這一點。 有時您可能會對將資料庫互動留在類中感到滿意,但是當您最終將所有**放在乙個巨大的類中時,這可能會成為問題。
以下可能是如何測試此**的基本選項:
第一節綜述
shader是什麼?shader是著色器。渲染流水線的概念?渲染流水線的工作任務在於由乙個三維場景出發,生成一張二維影象。渲染流程分為3個階段 應用階段 幾何階段 光柵化階段。1 應用階段 由cpu負責實現,由開發者主導。最重要的輸出是渲染所需的幾何資訊,即渲染圖元。這些渲染圖元傳遞給幾何階段。2 ...
第一節 熱機
一.熱機 內燃機是熱機的一種,以汽油或柴油為燃料 二.汽油機 練1.三.柴油機 練2.從能量轉化的角度看,一台四衝程內燃機在乙個迴圈中 1 哪個衝程存在著化學能轉化為內能的過程?2 哪個衝程存在著內能轉化為機械能的過程?3 哪個衝程具有很明顯的機械能轉化為內能的過程?練3.關於單缸四衝程內燃機,下列...
第一節 linux c編譯
在linux中開發c或c 程式的步驟 先用vim編輯c或c 程式 c儲存為.c c 儲存為.cc 或.cpp檔案 對於.c格式的c檔案,可以採用gcc或g 編譯 對於 cc cpp格式的c 檔案,應該採用g 進行編譯 gcc編譯過程 gcc所支援字尾名 預處理階段 對包含的標頭檔案 include ...