Написание файлов функций BDD короче и чище - PullRequest
3 голосов
/ 20 января 2011

У меня есть много сценариев, которые идентичны, они отличаются только данными, которые им передаются. Это пример:

Добавление: привязка фактов из отчета к документу Excel
Чтобы связать факты с документом Excel
Как пользователь, имеющий доступ к отчету
Я хочу нажать на значение факта в отчете

Сценарий: любой элемент URI
Учитывая, что я вошел как администратор с администратором
И я выбрал образец проекта
И я выбрал просмотр представления отчета, содержащего данные из factcollection1 и всех периодов и всех клиентов
Когда я нажимаю на ячейку Excel C2
И я нажимаю на значение в 2 столбце строки, озаглавленной любой элемент URI
Тогда ячейка Excel C2 должна содержать значение некоторого интернет-адреса

Сценарий: двоичный элемент Base64
Учитывая, что я вошел как администратор с администратором
И я выбрал образец проекта
И я выбрал просмотр представления отчета, содержащего данные из factcollection1 и всех периодов и всех клиентов
Когда я нажимаю на ячейку Excel F3
И я нажимаю на значение в 2 столбце строки, озаглавленной двоичный элемент base64
Тогда ячейка Excel F3 должна содержать значение asdf

Сценарий: логический элемент
Учитывая, что я вошел как администратор с администратором
И я выбрал образец проекта
И я выбрал просмотр представления отчета, содержащего данные из factcollection1 и всех периодов и всех клиентов
Когда я нажимаю на ячейку Excel J3
И я нажимаю на значение в 2 столбце строки, озаглавленной логический элемент
Тогда ячейка Excel J3 должна содержать значение true

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

до сценария:
Учитывая, что я вошел как администратор с администратором
И я выбрал образец проекта
И я выбрал просмотр представления отчета, содержащего данные из factcollection1 и всех периодов и всех клиентов

сценарий:
Когда я нажимаю на ячейку Excel XX
И я нажимаю на значение в столбце YY строки под названием ZZ
Тогда ячейка Excel YY должна содержать значение WW

и некоторые данные таблицы, например:

| XX | YY |          ZZ        |              WW              |
| C2 | 2  | any uri item       |    some internet address     |
| F3 | 2  | base64 binary item |               asdf           |
| J3 | 2  | boolean item       |        true                  |

Я нашел решение.

Существует сценарий с этой способностью.

Scenario Outline: display label in selected language
Given I am logged as <username> with <password>
  And I have clicked on <button> button
  Then result should be some result

Examples:
  | username | password | button |
  |  john    |  doe     | first  |
      |  foo     |  bar     | second |

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Вы можете использовать Scenario Outline вместо Scenario. Ваш пример будет выглядеть примерно так:

Scenario Outline: 
  Given I am logged as admin with admin
  And I have selected Sample Project
  And I have chosen to view report presentation view containing data from factcollection1 and all periods and all clients
  When I click on excel cell '<Cell>'
  And I click on the value in '<Column>' column of the row entitled '<Row>'
  Then Excel cell '<Cell>' should contain value '<CellValue>'

Examples: 
  | Cell | Column | Row                | CellValue             |
  | C2   | 2      | any uri item       | some internet address |
  | F3   | 2      | base64 binary item | asdf                  |
  | J3   | 2      | boolean item       | true                  |
1 голос
/ 20 января 2011

Это очень интересный вопрос, и я потратил некоторое время на изучение того, что я называю «Спецификации на основе данных». Отчасти это обусловлено возможностями «row-test» или «data-driven-test», которые предлагают многие распространенные тестовые среды.

Не то чтобы я использовал термины «Сценарий» и «Спецификация» как синонимы, однако я предпочитаю последнее.

Подобно обычному модульному тесту, спецификация BDD состоит из трех частей. Распространенным шаблоном является формула «Дано X, когда Y, то Z». Что вы обнаружили, так это то, что для многих ваших спецификаций часть «Х» остается неизменной. Всякий раз, когда я сталкиваюсь с такой ситуацией, я пытаюсь создать класс Fixture , чтобы абстрагировать это. Например, один из этих классов может быть LoggedInUserFixture, который настраивает зарегистрированного пользователя и делает его доступным для теста.

Очень часто вы обнаружите необходимость составить этот прибор с другими приборами, чтобы создать настройку для вашей спецификации. Например, вам может потребоваться LoggedInUserFixture и UserWithSampleProjectSelected для одной спецификации. Самый простой способ сделать это - создать еще один класс приборов, который настроит его дочерние приборы и сделает их индивидуально доступными для вашего теста.

Я все еще сопротивляюсь желанию извлечь общий шаблон для создания приборов и сделать так, чтобы тестовая среда поддерживала это.

Чтобы вернуться к предложению использовать данные для определения спецификаций, я думаю, что это допустимые и полезные шаблоны, я обычно заставляю данные управлять созданием своего прибора (тогда у приспособления есть соответствующий конструктор для ввода данных). Подробнее см. SubSpec's Theorie.

...