到目前爲止,咱們只有兩個針對內置函數count()的方法測試用例。當咱們開始測試大量PHP提供的函數時,咱們將須要爲他們每一個寫 一個測試。咱們能夠寫爲這些測試從頭開始寫測試框架。然而,最好是寫一個測試底層框架,而爲每一個測試基於這個底層框架上寫一些個性的一部分。 PHPUnit 就是這麼一個底層框架。程序員
一個框架,像PHPUnit須要肯定一系列約束,而這些約束總有一部分是互相沖突的。同時,測試應該有以下特徵:數據庫
易學編程
若是他很難學寫怎麼去寫測試用例,開發者將不過學習去寫他們。框架
易寫編程語言
若是測試案例不是容易寫出的的,開發者不會去寫這些的。函數
易讀工具
測試代碼應該不包含額外的開銷 以至 測試用例自己不會迷失在繁多的代碼中。學習
易執行測試
測試應該能夠以一個的明顯的按鈕運行,而且能獲得清晰明瞭的格式展示他的結果。設計
快速執行
測試應該能快速運行,以便他們能天天執行成百上千次。
獨立性
測試用例不能相互影響。若是測試用例中任意一個運行順序改變了,缺不該該改變測試的結果。
可組合性
咱們應該能夠將一些測試用例組合在一塊兒進行運行。只是一個獨立性必然的結果。
-
在這些約束中有兩個主要的衝突:
-
-
-
易學易寫於易寫相沖突
-
測試用例通常不要求一種編程語言的全部靈活性。許多測試工具提供它自己支持的最低限度的必要功能的語言腳本。測試結果是易讀易寫的,是由於他們沒有被測試的內容所幹擾。而後學習另一種程序語言和一系列的程序工具讓人的腦子很以爲很麻煩的。
-
-
獨立性於快速執行想衝突
-
若是你想要其中一個測試用例的結果不被其餘測試的結果所影響,那麼每一個測試用例應該在他開始執行時創造全部所需的環境狀態,而且在他完成時,返回原有的環境狀態。然而,創建環境須要花費不少時間,例如,鏈接一個數據庫和用戶真實數據,初始化數據庫到一個已知的狀態。
-
-
PHPUnit 試圖用做爲測試語言的PHP解決這些衝突。有時寫一個小的直線測試時,用所有功能的PHP有點殺雞焉用牛刀的感受,可是若是程序員已經準備就緒的狀況下, 用PHP能利用大量的經驗和工具進行開發。而咱們將試圖說服不情願的測試者,下降寫初始化測試用例的障礙是十分重要的事情。
-
-
PHPUnit 在獨立性這方面比快速執行上有些問題。獨立測試是有價值的,由於他提供了高質量的反饋。你沒有得到一堆測試失敗的報告,這頗有多是一個測試在一系列失敗 的開始,抑或是測試的環境出問題了。針對獨立性的測試鼓勵設計大量的簡單對象。每一個對象能被快速的獨立的測試。結果是更好的設計和更快測試。
-
PHPUnit 假定大多數測試都是成功的,而且是不知道報告成功測試的細節。當一個測試失敗時,這個事實是沒有價值的和值得報告的。絕大部分的測試都是成功的,除了計數 的測試其餘沒有什麼值得評論的。真實構成報告類型的只是一種假設,你會看到不少測試被執行,可是通常只是看這些失敗的細節。
-
測試被指望是一個細粒度的,是測試時一個對象的一個方面。所以,首次的測試失敗,測試執行的暫停,PHPUnit報告這個失敗。將測試分解成不少小測試運行是一種藝術。細粒度的測試提高系統的整體設計。
- 當你測試用PHPUnit測試一個對象時,你只有經過這個對象的公有接口。測試基於公有可見的行爲,鼓勵在槽糕的設計的結果影響系統的大部分以前,更早的去面對和解決困難的設計問題。