2016-08-25 6 views
2

Я искал немного для этого, но не могу найти точный пример. У меня есть форма для заполнения как шаг. Поля формы выглядеть примерно так:Как создать определение шага для обработки динамического ввода данных?

Дата:
Валюта:
Всего:
Описание:

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

(When I enter the 'Date' and 'Currency' and 'Total' and 'Description') 
(When I enter the 'Date' and 'Total') 
(When I enter the 'Currency' and 'Description') 
etc... 

Я хотел бы, чтобы каким-то образом реализовать что-то подобное, вместо этого, в файле особенность:

When I enter the following details: 
    |Date  |x |  
    |Currency |USD | 
    |Total  |100 | 
    |Description |Test | 

И тогда один метод обработки любой комбинации данных, которые пользователь вводит в этот второй столбец.

Я нашел сайты, которые имеют данные этой таблицы приводом пример:

When I enter the following details: 
    |Date  |<date>  |  
    |Currency |<currency> | 
    |Total  |<total>  | 
    |Description |<description> | 

Example data: 
    |date |currency |total |description | 
    |x |USD  |100 |foo   | 
    |y |EUR  |200 |test  | 
    |z |HKD  |124 |bar   | 

Но это не то, что я после. Мне не нужно перебирать список предопределенных данных примера. Надеюсь, я достаточно четко изложил проблему, и кто-то знает, где можно найти пример такой реализации. Спасибо за любой совет!

+0

Это может быть только я, но ваша цель кажется мне не очень понятной. Вы хотите попробовать разные входы в качестве тестов, но вы не хотите использовать таблицу данных? Зачем? Это именно то, что нужно делать. Не могли бы вы немного подробнее рассказать о том, почему вы хотите избежать такого подхода? – px06

+0

Мне не нужно перебирать значения для одного теста. Разве это не то, что делает таблица данных? В нисходящем потоке наше приложение использует разные функциональные возможности и пути пользовательского интерфейса, основанные на том, что пользователь вводил в полях. В некоторых из этих сценариев они не заполнят все поля. Этот шаг является всего лишь «фидером» для последующих шагов, основанных на том, что пользователь вводил. Извините, если это не ясно ... трудно объяснить, что я пытаюсь сделать, не вычеркивая его. – gppanter

+0

, даже если это так, вы можете использовать «Сценарий сценария», как указано в нижнем ответе, который также создает таблицу. Но, используя это, вы также можете указать возможные результаты, которые шаг 'When' может выполнять в качестве тестовой переменной. Если я правильно понимаю, вы хотите протестировать набор входов и соответствующих выходов. – px06

ответ

1

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

When I enter the following details: 
    |Name  |Value| 
    |Date  |x | 
    |Currency |USD | 
    |Total  |100 | 
    |Description |Test | 

Вот один из возможных способов, чтобы использовать его в шаге:

@Given("^I enter the following details:$") 
public void i_enter_the_following_details(Map<String, String> details) throws Throwable { 
    for Map.Entry<String, String> entry : details.entrySet() { 
     String key = entry.getKey(); 
     String value = entry.getValue(); 
     switch (key) { 
      case "Date": 
       // add the date to the form 
       break; 
      // ... 
     } 
    } 
} 

Вы также можете получить таблицу как DataTable, List из значения List<List<String>> или List<Map<String>> путем объявления параметра с этим типом. Map<String, String> выглядит проще всего.

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

Другие примеры: here и here.

+0

Просто быстрый вопрос об этом. Например, если пользователь не вводит дату, сохраняется ли код даты? Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно, чтобы код выполнялся только тогда, когда данные поля действительно введены, и игнорируется, если это не так. Полагаю, я мог бы сделать это с помощью некоторых креативных «if/then» утверждений, но если мне это не нужно, это еще лучше. – gppanter

+0

О, я забыл обрабатывать дополнительные поля. Перераб. Также обратите внимание, что есть строка заголовка. –

+0

А, это может быть именно то, что я хочу. Thx, я дам это выстрел и отчитаю! – gppanter

0

Что я мог понять, вы пытаетесь выполнить комбинированное тестирование этих 4 полей в форме. Если это так, вам нужно взглянуть на параметр ScenaioOutline, который, я думаю, вы указываете на то, что вы называете таблицей данных. Это позволит вам упомянуть все ваши комбинации в качестве примера. Каждый пример будет подбираться и запускаться как отдельный сценарий. Вы можете изменить ваш Когда выглядеть -

Scenaio Outline: 
... 
... 
When I enter the following details : Date <date> Currency <currency>....... 
... 
... 
Examples: 
    |date |currency |total |description | 
    |x |USD  |100 |foo   | 
    |y |EUR  |200 |test  | 
    |z |HKD  |124 |bar   | 

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

OR - Если вы хотите получить данные из списка «Когда» в списке объектов, имеющих переменную экземпляра, соответствующую дате, валюте и т. Д., Вы можете использовать параметр «Список» в определении шага. Это избавит вас от написания выражений шаблонов. Тогда ваш шаг становится

When I enter the following details : 
date | currency | ....... 
<date> | <currency> | ....... 

Убедитесь, что имена переменных экземпляра соответствуют заголовкам таблицы в объекте, который вы создаете.