2016-10-03 17 views
0

私はCucumber-jvmで次のようなシナリオを持ち、これを書いている最善の方法を知りました。DataTableのCucumberシナリオアサート条件

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| 

これに最も近い方法は?

次のタスクが開始されたときに状態情報が失われるため、タスク1のとき、タスク1の後、タスク2のとき、タスク2などを実行する必要があります。 Task1,2,3のすべてを最初に起動し、次にTask1,2,3を最初に実行する代わりに、

また、多くのタスク+50があるので、これを別々のステップに分割するのは理想的ではありません。

When/Thenを1つのステップにマージできますが、それは正しいとは思われません。

提案がありますか?

答えて

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 | 
....... 

他のタスクの結果に関する一つのタスクの任意の依存関係があるなら、あなたはあなたがそれらを処理する方法で注意する必要があります。いずれかのタスクで必要に応じて現在のThen thenステップの後に、現在のプロセスなどを強制終了するようなリセットステップを追加することもできます。


最後のシナリオ---これはシナリオ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です。これは、examplesテーブルの最初の行になります。

シナリオの大文字小文字の場合、区切り記号「;」で区切ることができます。そして、このステップ

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

これはキュウリを使用するには、本当に貧しいの方法ですを持っていることによってgetCurrentExamplesRow()

​​
+0

ありがとうGrasshopper、私が実行しているタスクはお互いに依存しており、指定された順序で実行する必要があります。タスクを呼び出すためのステートレスな呼び出しであるため、これが問題になるとは思わない。 – IanWatson

+0

私はこれを試してすぐに回答します – IanWatson

+0

シナリオ概要から脱出する方法はありますか?つまり、例の反復の後に単一のthen文を実行するか? – IanWatson

0

あなたの問題が発生している方法では1入れ、このロジックを差し引いた後、最後の部分を使用します。代わりに、あなたは

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

シナリオでデータテーブルを書き込むと、保守オーバーヘッドが増えています。コードでチェックされず、手作業で管理され、エラーが発生しやすいと説明されていないデータテーブル。何かが壊れたり、何かを変える必要があるとき、これはあなたを傷つけます。シナリオ内の何かがどのように行われているかについての詳細はどこか別の場所になければならないので、シナリオ内のものとコード/ステップ定義内のものの2つの定義になります。このすべてが、より大きなメンテナンスコストを生み出します。 – diabolist

関連する問題