2016-10-03 3 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| 

Каков наилучший способ приблизиться к этому?

Мне нужно выполнить команду Task1, затем Task1, а затем Task2 Then Task2 и т. Д. Из-за потери информации о состоянии при запуске следующей задачи. Вместо того, чтобы сначала запускать все, когда Task1,2,3 сначала следует, а затем 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 | 
....... 

Если есть зависимость от одной задачи на исход другой задачи, то вы должны быть осторожны в том, как вы с ними справиться. Вы даже можете добавить шаг сброса, например, убить текущий процесс и т. Д. После вашего текущего шага, если это необходимо в любой из задач.

Последний сценарий --- Это большой взлом, зависящий от идентификатора сценария, остающегося таким же. Добавьте счетчик сценариев в таблицу примеров для последнего шага, как показано ниже.

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()

@Then("^Last step to run for last scenario (\\d+)$") 
public void lastStep(int size) { 

    // Will be called only for last scenario in examples... 
    if(size==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 

Ваша задача затем найти замену (имена) для ххх. Эти имена должны описывать, что представляет собой совокупный эффект выполнения всех ваших задач.

Неважно, какие задачи у вас есть или сколько задач у вас есть, вы всегда можете найти имя, которое инкапсулирует всю партию.

Теперь список задач, которые вы выполняете для своей новой задачи (КАК), можно определить дальше по стеку. Это может быть в ваших определениях шагов, вспомогательных методах определения шагов или еще лучше в вашем реальном коде.

Процесс нахождения этого единственного имени называется абстракцией. Его то, что вы используете каждый день - вы делаете чашку чая, не

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

Смежные вопросы