2011-10-12 195 views
3

我是新來的,一般的測試和我工作的Grails應用。當進行單元測試以及何時集成測試

我想編寫一個測試,說:「當這個動作被調用時,正確的觀點則返回」。我不知道如何去決定是否應該進行單元測試或集成測試。兩種測試都會告訴我我想要什麼 - 我該如何決定?

回答

3

集成測試的一個問題是它們的速度。對我來說,集成測試需要15秒以上才能啓動。在那段時間,某些事情確實會脫離焦點。

我更喜歡使用不超過2秒的單元測試,並可以在15秒內運行幾次。特別是與mockDomain().尤其與Grails 2.0 implementing criteria and named queries in unit tests

單元測試的另一個參數是它們強制你解耦你的代碼。集成測試總是會引誘您只依賴現有和初始化的其他組件。

+0

我贊成大多數覆蓋面的單元測試。但有時候我會錯過單元測試的東西,有時候我對一些代碼與協作者交互的假設是錯誤的。所以我也想添加簡單的集成測試,以確保合作伙伴在一起很好地玩。 –

+0

那麼,我沒有說不使用集成測試;我們需要測試集成。但對於任何特定組件,請進行單元測試。 –

0

先通過Grails的引導http://grails.org/doc/latest/guide/9.%20Testing.html

它談論的測試控制器,並得到響應控制能力本章像這樣: controller.response.contentAsString

現在決定哪個測試更多的是藝術而不是科學。我喜歡單元測試的原因,他們可以更快地運行:)

+0

我已經通讀了多次,看到了控制器的例子。這是令我擔憂的藝術部分。我沒有一個令人信服的理由來選擇一種方法或在我的情況下。 – skaz

+0

底線是你需要兩個。我使用單元測試來獲得儘可能多的代碼覆蓋率 - 這對於像Groovy這樣的動態語言來說非常關鍵!集成測試會讓你知道你在嘲笑你的服務方法時假設你在單元測試中是否成立。 – dbrin

4

From Grails Docs section 9.1

單元測試是在「單位」的水平測試。換句話說,你是 測試單個方法或代碼塊,而不考慮周圍基礎設施的 。在Grails的你需要的特殊性 意識到單元測試和集成測試的區別,因爲在 單元測試Grails的不注入任何的過程集成測試,在運行目前 動態方法。

From Grails Docs section 9.2

集成測試之處在於,你有充分的訪問 到測試中的Grails的環境單元測試有所不同。 Grails將使用集成測試的 內存HSQLDB數據庫,並在每次測試之間清除所有從數據庫中 數據。

這意味着單元測試與Grails環境完全隔離,而集成測試不是。據Scott Davisthis article作者,是可以接受的只寫集成測試...

單元與集成測試

正如我前面提到,Grails支持兩種基本類型的測試:單元 和整合。這兩者之間沒有語法上的區別 - 都使用相同的斷言作爲GroovyTestCase編寫。 的區別在於語義。單元測試旨在測試隔離級別,而集成測試允許您在完整的運行環境中測試類別 。

坦率地說,如果你想把你所有的Grails測試寫成 集成測試,那對我來說很好。所有的Grails create- *命令都會生成相應的集成測試,所以大多數 人都會簡單地使用已經存在的東西。正如你會看到在短短的一瞬間 ,你最想測試的東西需要完整 環境,啓動和運行反正,所以集成測試是一個 相當不錯的默認值。如果你有非核心的Grails類,那麼 想要測試,單元測試是完全正確的。

+0

我看到了這兩篇文章。我沒有發現他說「這對我來說很好」並不令人信服。我正在尋找一個強有力的理由,爲什麼我會選擇一種測試方法或另一種方法來測試我所概述的特定測試。 – skaz

+1

我對他有同樣的感覺,說「這對我很好」,但他的生物相當令人印象深刻。我有他的一本書(Groovy食譜),在我看來,他通常知道他在說什麼。 – ubiquibacon

0

這是一個非常有趣和具有挑戰性的問題來回答,但事實是,這實際上取決於你在測試什麼。

進行以下測試:「將圖書保存到數據庫」。提示在說明中。我們說我們需要一本書,我們需要一個數據庫,所以在這種情況下,單元測試不會做,因爲我們需要集成的數據庫。

我的建議是寫下完整的測試說明,並按照上面的說明將其分解。它會給你提示,以幫助你做出決定。

使用spock可以更容易地使用字符串作爲測試名稱。

相關問題