2016-04-30 120 views
1

我正在學習RSpec和黃瓜,這樣我就可以在工作中爲我們的Rails網站編寫測試。RSpec和黃瓜在RoR野

在學習時,我用了一本名爲"The RSpec Book: BDD with RSpec, Cucumber and Friends"的書。在此期間,RSpec用於粒狀測試,Cucumber用於整體可用性測試。

這本書以一個簡單的CLI遊戲爲例。

現在我正在進入一個Web環境,想知道在Web環境中測試的心態是什麼。

我已經知道我將爲我的模型和控制器編寫規格測試。

我假設黃瓜進來的地方是全功能測試,它將使用控制器和模型來完成。

如果我錯了,請糾正我,但我們假設有User,Post和Likes模型。

其中每一個都有一個模型spec +但是很多控制器規格。

然後我會寫一個功能測試爲:

Feature: liking a post 
    As a user of abc.com 
    I want to like a post 
    So that I can show my friends 

在那裏我會登錄爲一個人,找到一個職位,並喜歡它?

任何有經驗的人都會分享使用這些工具測試Rails應用程序的方法嗎?假設我必須實現上面的情況,您是否會開始充實特性測試,編寫模型規範,然後編寫控制器規範,然後編寫代碼?

+0

您是否在使用Capybara?設計? –

+0

是的,我正在使用設計和水豚。 – fbelanger

回答

2

[重複一些別人爲了完整起見說:]

稱爲BDD(見)一個好的方法作品外,由

  • 試駕的特徵與驗收測試(在Ruby世界中通常寫成黃瓜功能或RSpec功能規範)
  • 測試駕駛詳細信息和單元測試以在必要時表達詳細的要求。

使用這種方法來測試Rails項目的特性,你首先要寫一個驗收測試然後實現它,這會產生路由,視圖,控制器(s)和模型(s)所需的功能。由於您正在進行測試駕駛,您還沒有編寫任何未通過驗收測試完全測試的代碼,您也不需要任何控制器,型號等規格。然後,您可能會重新開始另一個驗收測試,或者您可能需要使用較低級別的規格測試一些詳細的需求。

假設您的驗收測試測試了用戶的全名顯示在頁面上,並且您希望在用戶未輸入姓氏時確保它看起來正確。如果User#full_name返回用戶的全名,則可以爲該方法編寫一個模型規範,而不是編寫另一個驗收測試。

在我的經驗中,使用BDD編寫的合理的Rails應用程序需要很少或沒有控制器規格,因爲控制器應該儘可能地委託給模型和其他類,因此完全通過了驗收測試。很多細節都在模型規格中得到了最好的測試。

關於如何編寫驗收測試,我需要不同意他人關於Cucumber的聲明,或者至少給出警告:我已經看到Cucumber爲大型生產應用程序提供可讀,可維護的驗收測試套件,並且RSpec的功能規格導致機構臃腫,難以維護的驗收測試套件,所以不排除黃瓜,或需要它解決:

  • 不要的想法,人類可讀的驗收測試是唯一被愚弄爲您的產品所有者或客戶;它們對於工程師來說絕對是有價值的,可以讓您在適當的時候高度思考,而不是迷失在代碼中。項目越大,你就會越關心。

  • 黃瓜很好地將這些步驟的實現(CSS選擇器,ActiveRecord查詢等)的測試步驟的驗收級別描述分開,幾乎可以自動將這些步驟重新使用。使用RSpec功能規格,完全取決於您。準備提出自己的系統,將詳細信息提取到方法的名稱中,以明確每個步驟的用戶級別點。 (我不是指頁面對象;它們的含義低於我的意思,並且在Cucumber和RSpec功能規格中都很有用。)

2

黃瓜在這裏的作用是作爲驗收規範。他們從用戶的角度測試整個應用程序的行爲。它們覆蓋從路由到控制器,模型和視圖的整個堆棧。

在BDD中,您經常使用驗收測試,而不僅僅是像在TDD上的蛋糕頂部的糖霜,而是作爲發展之外的的驅動力。

外部開發您將創建一個失敗的規範,在設置路由,控制器或任何基礎之前詳細說明用戶故事。

將此與傳統的TDD方法相比較,您可以先將其分解爲最小單位以獲得快速的紅黃綠循環。然後你會開始將堆疊在一起,測試逐漸覆蓋越來越多的堆棧。

但是,這並不意味着驗收規格是唯一有用的規格形式 - 它們有相當大的開銷,並且可能很難測試邊緣案例。因此只使用Cucumber並不是一個非常有吸引力的解決方案。

+1

不可否認,我從來沒有真正明白過要使用黃瓜 - 所有這些額外的抽象層僅僅是爲了客戶真正閱讀測試的錯誤前提。我只是使用RSpec功能規格。 – max

1

首先,這是比別的更多的意見,但在這裏。一般來說,在TDD中,我試圖從外部開展工作(外部開發)。換句話說,編寫功能規格,然後寫入控制器規格(如果需要),然後編寫規格。這裏的基本原理是您的功能測試是您的應用程序面向用戶的方面。專注於高層次的用戶行爲,有助於減少浪費時間和構建不需要的東西。此外,如果您從功能測試開始,則可以根據需要模擬/存根較低的應用程序級別(例如控制器中的模型交互),從而產生更快速的獨立測試。

最後,再次,這是更多的意見 - 我認爲這同時使用黃瓜和RSpec是矯枉過正。 RSpec正常工作,更好地處理單元測試,並且比黃瓜更容易維護。每次我使用兩種方法創建項目時,我最終都會廢棄Cucumber,並堅持使用RSpec。

具體來說,對於測試用戶登錄,我建議包括使用Devise登錄助手,這使登錄用戶更快,更容易https://github.com/plataformatec/devise#test-helpers