2016-10-03 60 views
0

我在Cucumber-jvm中有以下場景,並且想知道寫這個的最好方法是什麼。黃瓜場景在DataTable中聲明條件

Given I create a process 
When I execute the following tasks with parameters: 
|Task Name| param1 | param2| param3| 
... 
Then each task should have outcomes: 
|Task Name| outcome1 | outcome2| outcome3| 

接近這個最好的方法是什麼?

我需要執行When Task1,然後Task1,然後是When Task2 Then Task2等,因爲狀態信息在下一個任務開始時會丟失。而不是先調用When Task1,2,3,然後先調用Then Task1,2,3。

還會有很多任務+50,因此將其分解爲單獨的步驟並不理想。

我可以將When/Then合併爲一步,但看起來不正確。

有什麼建議嗎?

回答

1

如何使用方案大綱。這將把每個任務作爲一個場景來運行。

要避免重複Given step,您可以在步驟定義java中設置一個靜態布爾變量,並將其作爲標誌檢查。

Scenario Outline: 
Given I create a process 
When I execute the following task <TaskName> with parameters: 
|<Parameter1>|<Parameter2>|<Parameter3>| 
Then each task <TaskName> should have outcomes: 
|<Outcome1>|<Outcome2>|<Outcome3>| 

Examples: 
|TaskName|Parameter1|Parameter2|Parameter3|Outcome1|Outcome2|Outcome3| 
|task1|t1param1|t1param2|t1param3|t1out1|t1out2|t1out3| 
|task2|t2param1|t2param2|t2param3|t2out1|t2out2|t2out3| 
....... 

如果您有可變數量的參數和結果,請使用符號分隔的字符串對其進行修改。您可以在步驟定義中使用@Transform annotation來獲取參數或結果的對象。

Scenario Outline: 

Given I create a process 
When I execute the following task <TaskName> with parameters <parameters> 
Then each task <TaskName> should have outcomes <outcomes> 

Examples: 
| TaskName | Parameters | Outcomes | 
| task1 | t1param1,t1param2,t1param3| t1out1,t1out2,t1out3 | 
| task2 | t2param1,t2param2,t2param3| t2out1,t2out2,t2out3 | 
....... 

如果對其他任務的結果一個任務,那麼你必須在你如何處理他們小心任何依賴。你甚至可以添加一個重置步驟,例如,殺死當前進程等,如果在任何任務中需要,則在當前的步驟之後。


最後一個場景---這是一個很大的黑客,它依賴於場景ID保持不變。 如下所示添加示例表中最後一步的方案數量。

Scenario Outline: 

    Given I create a process 
    When I execute the following task <TaskName> with parameters <parameters> 
    Then each task <TaskName> should have outcomes <outcomes> 
    ***And Last step to run for last scenario 3*** 

    Examples: 
    | TaskName | Parameters | Outcomes | 
    | task1 | t1param1,t1param2,t1param3| t1out1,t1out2,t1out3 | 
    | task2 | t2param1,t2param2,t2param3| t2out1,t2out2,t2out3 | 
    | task3 | t3param1,t3param2,t3param3| t3out1,t3out2,t3out3 | 


Include in StepDefinition.java 

private Scenario scenario; 

@Before 
public void before(Scenario sce) { 
    this.scenario = sce; 
    System.out.println("SCENARIO ID -- " +scenario.getId()); 
} 

你會得到像場景輪廓的字符串 - **feature-description ; scenariooutline-description ; example-description ; rownumber + 1**。例如 - validating-sample;so1;se1;2。這將用於示例表的第一行。

對於場景大綱情況,您可以用分隔符「;」並使用最後一部分中減去1。把這個邏輯的方法後getCurrentExamplesRow()

​​
+0

謝謝Grasshopper,我正在執行的任務是相互依賴的,必須按指定的順序執行。我不認爲這會是一個問題,因爲這將是一個無狀態的調用任務。 – IanWatson

+0

我會測試一下並很快回復 – IanWatson

+0

有沒有辦法突破場景大綱?即在迭代示例後執行單個語句嗎? – IanWatson

0

您的問題是造成有這一步

When I execute the following tasks with parameters: 
|Task Name| param1 | param2| param3| 
... 

這是用黃瓜一個真正的窮人的方式。相反,你應該與格式

When I xxx 

你的任務是再尋找替代XXX(地名)的一個步驟中替換這一步的每個實例。這些名稱應該描述執行所有任務的組合效果。

這真的不要緊,你有什麼任務,或者你有多少任務,你總是可以找到一個封裝了一大堆的名稱。

現在的任務列表中你必須履行你的新命名的任務(HOW),可進一步降低您的堆棧來定義。這可能出現在你的步驟定義,步驟定義的輔助方法或更好的實際代碼中。

找到這個單一名稱的過程稱爲抽象。它的東西,你每天使用 - 你做了一杯茶,不會

fill the kettle with 350ml of cold water 
switch of the kettle just before its boiled 
pour 5ml of water into each cup to warm them 
switch on the kettle until its boiled 
... 
... 
zzzzzz 

你在你的情況下,執行什麼是一樣愚蠢的話說某人所有的東西,而不是make some tea

黃瓜使用自然語言的全部意義就是讓劇作家使用自然語言的力量寫的東西很簡單和表現力。每次你將一些細節放在一個場景中,你就無法有效地使用語言。

+0

感謝您爲我解釋抽象! – IanWatson

+0

爲什麼我想要增加在Java上編寫所有任務時的維護開銷,因爲它的通用性足以在數據表中。這也允許所有場景都可以輕鬆測試和更改。我不支持你的回答或觀點。 – IanWatson

+0

當您在場景中編寫數據表時,會增加維護開銷。未通過代碼檢查的數據表是手動維護的,並且未被解釋是容易出錯的。當某些事情中斷或者你需要改變某些事情時,這會傷害你。關於場景中的某些事情的每個細節都必須在其他位置,因此最終會有兩個定義,分別是場景中的事物和代碼/步驟定義中的事物。所有這些都會產生更大的維護成本。 – diabolist