2015-11-27 2 views
0

Я работаю над автоматизацией в jbehave. У меня есть сценарий, в котором у меня несколько шагов. Теперь из этих 2 шагов имеет одинаковое имя входного параметра. Для одного я передаю значение из таблицы примеров, а для другого i передаю значение в самом выражении, даже если оно принимает значение только из таблицы примеров.Проблема с примером таблицы jbehave

Я знаю, что могу изменить имя входного параметра в инструкции java/jbehave, но это невозможно, потому что оба оператора используются несколько раз, и для одного сценария я не могу сломать все существующие сценарии.

Любой ключ к этому или любому, кто сталкивался с подобной ситуацией, должен также прокомментировать это.

фрагмент кода

история файл

Scenario :

Given I pass value '1'

And I take value from temp file '<value>'

Examples

value |

2

Java файл:

@Given("I pass value '$value'") 
public void fn(@Named("value") int value) 
{ 
------ 
} 

@Given("I take value from temp '$value'") 
public void fn2(@Named("value") int value) 
{ 
----- 
} 

Теперь проблема в том, что для первого заявления, даже если я передаю значение «1» из утверждения, что оно принимает значение только из примера таблицы, которая является '2'.

+0

Я обновил вопрос. –

+0

Какую версию JBehave вы используете? Я тестировал ваше дело в последней версии, и он работал, как ожидалось. – krokodilko

+0

@kordirko Я использую 3.9.5. Последняя версия, которую я видел, - 4.0.4. Можете ли вы предоставить тестовый файл, с которым вы успешно выполнили этот сценарий? –

ответ

0

Я тестировал аналогичный сценарий в версиях 3.9.5 и 4.0.4 JBehave, и он отлично работал в обеих версиях.
Это мой сценарий:

Scenario: some scenario 

Given I pass value '1' 

Given I take value from temp file '<value>' 

Examples: 
|value| 
|2| 
|3| 

и вот мой Java-код:

public class MySteps { 

    @Given("I pass value '$value'") 
    public void fn(int value) 
    { 
     System.out.println("GIVEN : I pass value = " + value); 
    } 

    @Given("I take value from temp file '$value'") 
    public void fn2(@Named("value") int value) 
    { 
     System.out.println("GIVEN : I take value from temp = " + value); 
    } 
} 

Я создал проект в Eclipse, используя Maven jbehave-simple-archetype.
Вы можете клонировать этот проект в Eclipse, по этой ссылке: https://github.com/kordirko/jb_test
Чтобы изменить версию просто изменить его в pom.xml =><jbehave.core.version>3.9.5</jbehave.core.version>



========== EDIT = ===============

Рассмотрите возможность установки useDelimiterNamedParameters(true) опцию в конфигурации JBehve
http://jbehave.org/reference/stable/parametrised-scenarios.html
Они пишут в документации, что, начиная с версии 4.0.4 эта опция включена по умолчанию.

Мы можем настроить JBehave для интерпретации имени, содержащегося между разделителями, в качестве имени параметра и поиска его в параметрах, представленных в таблице примеров.Поведение по умолчанию поиска параметров переопределяется через ParameterControls:

new MostUsefulConfiguration() 
     .useParameterControls(new ParameterControls().useDelimiterNamedParameters(true)); 

В этом режиме метод шаг будет выглядеть значительно упрощена:

@Given("a stock of $symbol and a $threshold") 
public void aStock(String symbol, double threshold) { 
    // ... 
} 

Начиная с версии 4.0 , использование параметров-разделителей по умолчанию является поведением по умолчанию.


Я проверил этот вариант, и, казалось, работали как в 3.9.5 и 4.0.4 версии.

Это тестовый сценарий:

Scenario: some scenario 

Given I pass value '1' 
Given I pass value '<value>' 

........ 

Examples: 
|value| 
|2| 
|3| 

и метод Java без @Named аннотации:

@Given("I pass value '$value'") 
    public void fn(int value) 
    { 
     System.out.println("GIVEN : I pass value = " + value); 
    } 

Первый шаг Given I pass value '1' принимает 1 в качестве параметра.
Второй шаг Given I pass value '<value>' соответствует <value> по названию с столбцом с именем <value> из таблицы примеров и принимает значения из этой таблицы.

+0

В первой функции «fn» вы не указали параметр с @Named. Если вы сделаете то же самое, что и вторая функция, я думаю, вы получите ту же проблему, с которой я столкнулся. Я пропустил эту часть в вопросе сам, я отредактировал то же самое в вопросе. –

+0

@Pratik Zinzuvadiya Я добавил к ответу решение этой проблемы, используя параметр 'useDelimiterNamedParameters (true));'. – krokodilko

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