2009-11-09 46 views
11

有人可以澄清使用一個簡單的用戶故事全面切片什麼黃瓜將用於和RSpec將用於什麼?我有一天購買了RSpec的書,並且一直在經歷它。作者有時似乎很模糊。TDD/BDD Rails黃瓜/ RSpec複製

我在想什麼,如果用戶故事是一樣的東西(請原諒的語法不正確,這只是讓你得到點):

當用戶輸入的電話號碼無效 然後他們得到一個消息說「無效的電話號碼」

如果我寫出所有的代碼爲Cucumber檢查這個,然後寫rspec的東西,我基本上重複我的測試。是否有解釋黃瓜測試應如何與rspec測試不同的場景?

我覺得你會一直在兩個層次上重複測試。

如果對此沒有確切的答案,我會開始認爲黃瓜人員不想踩在RSpec人的腳趾上。

請幫忙。我覺得我的腦袋即將爆炸。

謝謝!

回答

12

黃瓜用於解釋(作說明)應用程序,而不是單元測試或行爲測試(這是RSpec的焦點)的一部分(故事)的

所以,IMHO黃瓜測試(故事)不要替代rspec測試。

RSpec測試傾向於推動模型和控制器的開發,故事傾向於推動視圖的發展。

通過你的描述好像你正在使用黃瓜兩個測試的故事和行爲

+0

我完全同意,這一直是我的經歷。 – 2009-11-10 16:58:08

2

黃瓜可用於運行幾乎任何代碼,這就是爲什麼我認爲你得到困惑。但是黃瓜沒有提供其他類型的測試設施,如嘲笑和剔除方法,這使得單元測試更加具體。

rspec的東西實際上是爲了解決小部分行爲,並使一切都非常離散。如果你熟悉單元測試和框架,這應該更有意義。

黃瓜實用程序能夠將高級描述轉換爲系統上的一組頂級操作。

5

Rspec和Cucumber是獨立的,您可以使用Cucumber和另一個測試框架進行測試(測試單元,應用等)。

問題是,你想用黃瓜測試什麼? 因爲你確實可以結束重複測試,而這不會真的有用,不是嗎? :)

黃瓜有不同的哲學。

黃瓜,你可以這樣做:

DMA(直接模式訪問的意義,是的,你可以充分測試你的模型,就像您在rspec的做)

模擬browzer(接入整個MVC棧,不需要JavaScript)

自動瀏覽器(使用webrat和硒來訪問你的看法,與JavaScript,速度較慢,真正browzer)

我喜歡做的是使用黃瓜檢查什麼是返回給用戶。當我定義我的故事時,這通常對我來說是有意義的,因爲我沒有真正記住我要寫的代碼。 因此,我使用Cucumber - > views(使用模擬或自動瀏覽器)測試最終結果

然後,我使用rspec來測試我在控制器和模型中編寫的任何代碼。

你的情況

因此,

當用戶輸入一個無效的電話號碼,然後他們得到一個消息,說「電話號碼無效」

我會用Webrat檢查用戶獲得在視圖中無效的電話號碼消息。我會使用Rspec來測試我的控制器動作和模型。

13

查看屏幕錄像BDDCasts.com可能很有用。他們引導您創建應用程序的故事和規格。它真的幫助了我。還擁有rspec書,但仍然困惑。你甚至可能只想在github上查看它們的源代碼。

對我來說是這樣的:

  • 黃瓜要考什麼,用戶將看到。 (全棧測試)

  • Rspec測試其他的一切。 (型號,控制器)

6

黃瓜看作測試你的整個應用程序,從外到內,其中RSpec的是特定模塊的單元測試。您首先指定希望您的應用程序在Cucumber中具有哪些行爲,然後將其下拉到RSpec中並描述使這些行爲起作用的類和模塊。

我花了一段時間才弄到它,但我發現Cucumber真的很好地描述了你希望你的應用程序做什麼功能,RSpec真的很擅長描述它應該如何實現它。

所以你會在你的黃瓜故事中說你想要什麼樣的功能,並寫出超級簡單的步驟來提供輸入並查看輸出。然後,你下降到RSpec,並寫下它應該如何實際執行它的規範。

假設您的功能是在網站上搜索用戶名的功能。你可能會寫一個黃瓜功能,第一個(也是唯一第一)的情況是這樣的:

Feature: Search users 
    In order to find people with similar interests as myself 
    As a user 
    I want to search for people 

Scenario: Search for similar hobbies 
    Given there is a search page 
    And there is a list of hobbies 
    And one of the hobbies is "full contact ironing" 
    When I select "full contact ironing" 
    And press search 
    Then a list of users with the hobby "full contact ironing" are shown 

你跑黃瓜,它會告訴你你缺少的步驟,你複製這些並創建簡單的步驟來檢查對於這個東西,但不寫任何代碼呢。

當你與你的步驟定義做了你下拉到RSpec的,並開始你怎麼想這個工作的書寫規範。 (黃瓜當然應該失敗)

describe "SearchController" do 

    it "should respond to searches" do 
    sc = SearchController.new 
    sc.should respond_to(:search) 
    end 

end 

你運行RSpec的,看着它失敗了,熄滅,並編寫代碼:

class SearchController 

    def search 
    end 

end 

就是這樣。現在再次運行你的測試。它應該通過,所以開始變得更加具體,並開始描述你將如何實際使用搜索功能。我不想深入研究它,我只是想給你一個想法,描述你在Cucumber中想要的內容,然後描述它在RSpec中的實際工作方式。

當然,您可以在Cucumber或RSpec中做所有事情,但我真的發現Cucumber可以幫助我以非常簡單的方式說出我想要的內容,如果我在RSpec中嘗試這樣做,我會陷入細節中。如果我首先使用Cucumber來描述我想要的基本特徵,那麼我爲什麼可以放入RSpec並說出我希望該特徵如何實際工作。

將有在測試中,有時,這是不是很乾的重複,但如果你認爲它是細節問題的水平,可能不會打擾你一樣多。我開始時做了大量的重複工作,直到我意識到我應該大致說出我想要的Cucumber,然後特別說明我想要的RSpec。

這是如何使用這些工具都只是一個新手的想法,但它似乎很好地爲我工作至今。我可能給了你一個可怕的例子,但我只是想把整個細節的重點放到我在使用這些工具時發現有用的特定細節上。