2009-11-29 86 views
26

我想知道,你們如何在CakePHP中進行單元測試? 你如何在項目中加入測試? 你測試一個項目的哪些部分?你如何決定哪些部分被單元測試? 你們還在截止日期前完成工作嗎?在CakePHP中進行單元測試?

回答

39

我想知道,你們怎麼樣在CakePHP中單元測試 ? 你如何在項目中加入測試?

我通常使用Cake Core使用的最簡單的設置。我爲每個控制器和模型設置了一個測試文件。如果代碼有複雜的選項或者幫助程序有很大的變量輸出,我通常會測試helpers/components/behavior的輸出。我發現我的覆蓋率大概在65-75%之間,即使我的測試代碼覆蓋率很低(65%的文件的有限子集相當弱),我通過測試發現或修復了比我發現的更多的bug沒有正確固定。

什麼 您測試項目的某些部分? 您如何確定哪些部件將通過 單元測試?

我總是測試所有的模型功能。自定義查找,分頁結果集等我測試他們以下。正確的結果數量(來自夾具數據的查找),正確的結果集(來自夾具數據的查找),返回字段的正確性,返回的結果數量以及每個自定義查找類型的正確數據集。如果我在任何發現,自定義或其他方式上使用分頁集,請更正分頁。

我總是測試不會導致視圖呈現的控制器函數。作爲一種習慣,我傾向於移動所有邏輯,這些邏輯並非專用於設置視圖變量或選擇視圖以呈現給控制器中的私有/受保護功能或模擬函數調用。 這使我可以直接測試剩餘控制器操作(具有視圖輸出的操作)。如果我在所有上渲染視圖,那麼這些函數可能表現良好,並且的任何問題都會呈現在調用堆棧的更上方。

我測試助手的輸出與特定的選項設置。我並不總是涵蓋選項數組的所有排列,但是當兩個不同的鍵導致相互排斥的行爲,或者我可以檢查包含在我的標記中的可預測屬性時 - 我測試這些場景。

如果一個組件從某處獲取數據並對其進行操作,我還會檢查組件函數的格式或返回數據。行爲相同。

如果我有一個靜態類用於某處,我將測試該類中的函數以獲得正確的返回結果以及生成一些強制失敗或故意錯誤條件。特別是如果錯誤導致重定向,或者以某種形式向管道發送數據。如果失敗是沉默或返回一個默認值我也檢查,以確保實際發生。

你們還在 截止日期前完成工作嗎?

這裏的第一個通過期限總是稍微「軟」來說明測試和出現的任何問題。我發現,如果您使用普通的舊鉛筆和一些方格紙或白板,您甚至可以在編寫任何代碼之前就輕鬆地找出一組基本測試。通過這種方法,您可能會發現一個項目需要多花25%的時間,但是在整個應用程序生命週期中,您將通過輕鬆地節省您前期花費的25%,因爲沒有太多問題在進行中。


我編輯這在一些鏈接添加到看兩個實際的測試技術和作爲一種方式來獲得的他們是怎麼走到一起的視覺感。

  1. http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite
  2. http://book.cakephp.org/view/160/Testing
  3. http://debuggable.com/posts/unit-testing-in-cakephp-part-1---introduction-to-unit-testing:48102610-c5d0-4398-a010-76974834cda3
  4. http://mark-story.com/nodes/view/testing-cakephp-controllers-the-hard-way

另外,我不得不同意與寫作測試的開發者蛋糕不同意。它一個非常好的主意來測試任何你想要重用的東西 - 無論是單一的組件文件或複雜的插件 - 因爲你將分發它,測試都顯示工作代碼,是很好的例子,可以做什麼一段代碼。

至於沒有測試控制器,因爲你必須使用模擬對象 - 這只是一個弱的理由,而不是做一點棘手的工作,一旦你打擾它,它變得相當容易,每次你做它和它真的,真的會降低錯誤率,並讓你自己增加對自己的代碼的理解。

+1

非常感謝你的真棒回答:) – user133127 2009-12-01 15:57:50

+1

你的歡迎 - 我沒有想到這篇文章受歡迎。 – 2011-11-22 20:05:28

4

你可能想看看this

我對CakePHP不是很熟悉,但我通常使用PHPUnit。我使用Netbeans,它很好地集成了PHPUnit(我不知道這是否適合您)。可以運行獨立於您使用的Web框架的單元測試。

我通常會測試所有數據源連接(整個數據訪問層),並確保持久性按預期工作。此外,如果您的應用程序中有任何業務特定邏輯,則會對其進行測試,以便您知道它確實有效。我沒有很長的測試經驗,但我認爲其他人會建議你測試你的觀點。就個人而言,我在瀏覽器中使用F5,呵呵:)。當談到AJAX功能時,我會測試它的每一個位(請求執行它的事情和/或檢索所需的結果)。

關於時間/截止日期,可以肯定的是您的項目將從測試中受益。如果不使用某種形式的測試來確保應用程序的構建塊按照您的要求運行,超出截止日期的可能性會更大。假設您的應用程序變得更大(在大多數情況下它會這樣做),您沒有任何單元測試並且應用程序失敗。你怎麼知道在哪裏調試,以及你會用多少時間來搜索這個問題?要理解的主要事情是,確保小部分代碼的工作非常重要,當你得到許多小部分。

編寫測試所耗費的時間可能看起來沒有任何效果,因爲它並不直接導致功能,但隨着時間的推移它確實發揮着非常重要的作用。把它看作一種保險形式。