2012-02-22 139 views
2

我寫了一個功能,使用Cucumber和Capybara測試我的web應用程序的默認配置。部分功能看起來像這樣:泛化黃瓜/水豚測試

And the page has a photo labeled "Device" 
And the page has a checkbox labeled "Device" 
And I check "Device" 
And I submit the form 
Then the resulting page has no photo labeled "Device" 

它工作得很好。我希望在自己的服務器上安裝並配置Web應用程序的用戶能夠運行測試以幫助確認其配置是否正確。 「Device」是用戶可以更改的默認配置文件中的一個字符串。它是數組中的一個元素,可以在配置它們的應用程序實例時添加或刪除數組。

這是合理使用這些工具還是濫用Cucumber和/或Capybara?如果這是明智的,我該怎麼做?如果這是一個壞主意,我可以用什麼工具代替它?

以下是我如何運作的。我只是不確定這是做到這一點的最佳方式。

對於這項工作,該功能將不得不尋找更多這樣的:

And the page has at least 3 photos, let us call the last one "third_photo" 

在相應的步驟定義,我使用XPath拉出對應的標籤字符串的第一張照片並將其分配到存儲在類變量中的哈希對象。

And /^I the page has at least (\d*) photos, let us call the last one "([^\"]*)"$/ do |n, name| 
    if ! defined?(@note) 
    @note = Hash.new; 
    end 
    @note[name] = find(:xpath, '//ol[@id="menu"]/li[' +n+ ']/a').text; 
end 

後續步驟定義現在可以訪問該值,無論它是什麼。

所以,另一個特點可能是:

Then I uncheck "third_item" 

以及相應的步驟定義可能是:

Then /I uncheck "([^\"]*)"/ do |item| 
    uncheck(@note[item]) 
end 

但我不感覺良好。如果沒有別的,我想可能會與在步驟定義之外定義的另一個實例變量發生名稱衝突。

感覺就像我要麼做錯了,要麼我使用的是錯誤的工具。什麼是正確的方法來做到這一點?

回答

0

有一篇關於在http://www.cloudspace.com/blog/2010/06/23/using-instance-variables-with-cucumber-steps/的步驟定義中使用實例變量的博客文章。

評論者談論這種耦合,至少有一種可能的解決方法。

尤其davetron5000說:

我們所做的是在所有不使用實例變量,而是 提供了一個具有共享狀態可以去這個散列 每個測試運行後清零。 。不理想,但它比隨意例如清潔有點 變量所有的地方(並且也保證了合理的清潔 狀態每次測試前)

0

不知道你以後在釣魚什麼,但感覺就像你的測試和實施相當緊密。也許這就是你的感受,似乎你在測試中描述你的應用程序。 我對你的問題沒有很好的回答,只是因爲我不「理解」它。不過,我會敦促你嘗試從你的實現中解耦你的測試,看看是否有任何抽象等待被發現。

+0

,我不是自我感覺良好的部分是使用的類變量將值從一個步驟定義傳遞到另一個。感覺就像我打破封裝。但就我所知,它實際上是推薦的方法。 – Trott 2012-03-28 23:14:36