2015-11-24 66 views
3

我的團隊正在使用Cucumber測試REST API。這些步驟會調用API,而場景中的內容類似於「我使用JSON YYY致電XXX」。在Cucumber Feature文件中使用變量?

在功能文件的背景中設置JSON變量,然後在不同的場景中操作/使用它們會是非常糟糕的做法嗎?我們的許多測試使用的是隻包含1-3個編輯元素的相同JSON對象。我想提出一種情景做這樣的事情:

Given I update J element to K value in JSON YYY As <NewJsonVariable> ...

這似乎是不好的做法,因爲黃瓜本身就是一個REST API測試一個有爭議的工具,但我現在不想把變量到組合爲特徵。但是,我有一些5-10k行的功能(分成多個文件),我估計我可以將它減少到500-1k行,並使其更具可讀性。唯一的問題是,測試編寫者/讀者現在必須將JSON變量保留在頭部,但測試足夠短,一次只能有2或3個變量。

+0

我可以問你使用Cucumber多久了,你在用什麼語言來實現你的項目?順便說一句,徵求意見不是這種問題,因此正在尋找。你可能會考慮對此進行重新說明,以便有人可以提供客觀答案而不是主觀答案。 –

+0

@ JamesB.Byrne我一直在使用黃瓜約3個月。我們的核心代碼是用Java編寫的,但是我們有用Ruby測試我們所有REST服務的Cucumber。由於我們沒有官方QA團隊,所有開發人員都在撰寫Cucumber測試,我想讓我們更容易。 – user1097108

+0

您可能希望閱讀某些與BDD和黃瓜有關的文檔。你可以看看這個:https://github.com/cucumber/cucumber/wiki/Cucumber-Backgrounder這是我的主題。基本上,你用錯誤的方式來借用一句話:http://www.elabs.se/blog/15-you-re-cuking-it-wrong。 –

回答

0

黃瓜是一種做BDD不是測試工具的工具,尤其不是用於進行exhuastive測試的工具。對於你正在做的測試,你會更好地使用像RSpec這樣的單元測試工具。因爲單元測試/規範是用編程語言編寫的,所以它可以添加變量,循環等來做大量的測試。

編寫特性/場景的原因是描述行爲,即你在做什麼,或許更重要的是,你爲什麼要這樣做。你的場景真的不這樣做,而是詳細記錄你如何使用你的api。要使用Cucumber來開發你的api,你應該以更抽象的方式編寫場景,例如

Scenario: I can create a book 
    Given I am an author 
    When I create a book 
    Then I have a book 

注意這種情況下如何有任何關於如何創建書沒有細節,沒有提及JSON的,API的甚至沒有提及。

TL/DR將您現有的場景轉移到單元測試工具並引入變量,在那裏循環。你不能在特徵文件中「編程」。

3

黃瓜的意義在於允許在功能文件中的每個場景中發生簡單的英語表達。如何實現在步驟文件中詳細說明。你在功能陳述中放置了太多細節。這將是一個噩夢來維持,所以它可能不會。具有可預測的結果。

情景也許應該去像這樣:

Scenario The first thing our REST service does 
    Given I have a REST service 
    When I connect with request "something" 
    Then I should get this result 

在你的設置與匹配步驟文件:

Given(/I have a REST service/i) do 
    j_element = 'first value' 
    . . . 
end 

的請求在匹配指定:

When(/I connect with request "(.*)"/i) do |something| 
    # Set new value 
    j_element = something 
    #send jason call 
    . . . 
    return @result_set = visit(rest_api_path(j_element)) 
end 

結果在匹配器中檢查:

Then(/I should get this result/i) do 
    check_result(result_set) 
    . . . 
end 

由於直接在方法之間傳遞實例變量並不是很好,所以您應該在步驟文件中定義存取方法以優雅的方式處理這個方法。那些在多個地方使用自己的方法裏面並傳入要檢查作爲參數什麼

def result_set() 
    @result_set ||= 'nothing set yet' 
end 

認沽測試。

def check_result(result) 
    assert . . . 
    #or 
    result.j_element.should . . . 
end 

所有你目前投入的特徵文件,而不是具體的東西應該放在後面的匹配器的do-end塊內或輔助方法(如check_resultresult_set)。這使得了解你的場景應該更清楚地向讀者說明,這也將幫助你簡化步驟。

相關問題