2009-11-16 142 views
4

在我們的開發團隊中,我們決定嘗試單元測試。我們使用Simpletest。然而,這是一條艱難的道路。一週後,我只創建了一個測試某個幫助程序文件的單元測試。而已。其餘的(控制器,模型,視圖,庫)還沒有單元測試。我打算不測試其中的大部分。例如,視圖太小,無法測試,所以我放棄測試。接下來,控制器。我計劃我的控制器不做複雜的事情,所以它只會在模型和視圖之間傳遞信息。我會把這些更復雜的東西移動到庫或助手。使用Simpletest進行單元測試CodeIgniter - 很少有測試

現在我的問題:

1)我做錯了嗎?到目前爲止,沒有什麼我能看到的可能是錯誤的,所以它需要一個單元測試。大多數東西(現在)都只是CRUD。
2)我們真的需要單元測試控制器嗎?由於控制器的工作僅僅是對View和Model之間傳遞的數據的小處理,因此我發現在對它進行單元測試時很少主動。
3)如果我使用WebTestCase來測試控制器,那麼它是否仍然被認爲是單元測試?或者它已經是一個集成測試?
4)假設你讓我測試我的控制器,我將如何測試它?據我所知,CI通過index.php遵循前端控制器模式,那麼我將如何處理(模擬?)?

+0

我在asp.net mvc上做了一些這樣的事情,那裏的控制器實際上會返回一個ActionResult,這使得它很容易測試。不知道該怎麼做,或者是否有可能,或者很容易實現。 – 2009-11-18 20:16:37

回答

3

你做錯了什麼?我不這麼認爲。

我們真的需要單元測試控制器嗎?我不。也許我應該。雖然似乎很多工作。

如果我使用WebTestCase來測試控制器,那麼這仍然是一個單元測試嗎?或者它已經是一個集成測試?如果能夠檢測到有意義的輸出,WebTestCase將是測試控制器的有趣方法;例如,檢測到調用/ some/specific/path時沒有發生錯誤。

假設你讓我測試我的控制器,我將如何測試它?這是一個艱難的。您可能需要初始化部分應用程序環境,以便做出有價值的事情。

大多數文章/書籍告訴你定義你的測試之前你開始編碼。也許我已經嘗試過了,但我通常太不耐煩了。它似乎妨礙了快速原型設計,但也許定義單元測試快速原型的一種方式。

我發現決定用PHP測試什麼是一個挑戰。我認爲你必須選擇你的戰鬥。如果某個方法返回特定類型的值至關重要,那就測試一下。如果在實例化一個對象時會自動發生很多事情,那麼您也可以進行測試。通常,我所做的 - 正確或錯誤 - 使所有工作都正常,然後創建一些基本測試,然後根據我遇到的任何問題根據需要添加測試。這個想法是永遠不會有重複問題,並且每個測試都將確保應用程序在其生命週期中表現相同。

至於具體情況,我使用的是Zend Framework,但它在CodeIgniter中會類似。我也使用SimpleTest(但與我自己的類包裝)。我可能會也可能不會單元測試模型,我從來沒有爲控制器或視圖執行測試;這似乎是太多的工作和太少的好處。大多數框架「提前失敗」,所以問題通常很明顯。但是任何常見的庫代碼都會使得更容易的目標和錯誤(特別是邏輯錯誤)更難以檢測到。設置測試以確保事情按預期工作,以便特定於框架的代碼遇到一些問題。

4

如果你仍然對CodeIgniter的另一個單元測試有任何建議,我建議你試試Toast。我發現它很容易使用,並且不會對我的開發過程產生太大影響。

我只使用單元測試來測試我的庫,幫手和模型。我的控制器沒有太多代碼,只能得到post和uri參數,使用trim或intval消毒它,將它傳遞給庫或模型,然後傳遞結果以查看。

查看幾乎沒有代碼可以測試,因爲它將所有內容都顯示給瀏覽器。大多數情況下,它只需要css和js調試。

模型幾乎總是需要測試,因爲它處理數據。沒有單元測試,我發現很難追蹤一些錯誤,特別是複雜的計算。

庫和幫助程序執行重複性任務,因此它需要進行單元測試以確保其中的邏輯正確執行工作。

我希望這個幫助。