Являются ли определения шагов огурца глобальными?

Я только изучаю Cucumber и замечаю, что если две полностью отдельные функции имеют два шага, которые случайно сформулированы одинаково, Cucumber предлагает для них только одно определение шага. Означает ли это, что определения шагов являются глобальными и предназначены для совместного использования?

Пример

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

Банкир пишет:

Feature: Transaction Fees
    Scenario: Cutomer withdraws cash from an out-of-netwrok ATM
        Given that a customer has withdrawn cash from an out-of-netwrok ATM
        When I calculate the transaction fees
        Then I must include an out-of-netwrok ATM charge

Брокерский парень пишет

Feature: Transaction Fees
    Scenario: Cutomer places a limit order
        Given that a customer has placed a limit order
        When I calculate the transaction fees
        Then I must include our standard limit-order charge

Обратите внимание, что предложение When одинаково для обоих сценариев. Хуже того, оба парня поместили этот сценарий в файл с именем transaction-fee.feature (конечно, в разных каталогах).

Cucumber дает следующие рекомендации по определению шагов:

You can implement step definitions for undefined steps with these snippets:

this.Given(/^that a customer has withdrawn cash from an out\-of\-netwrok ATM$/, function (callback) {
  // Write code here that turns the phrase above into concrete actions
  callback.pending();
});

this.When(/^I calculate the transaction fees$/, function (callback) {
  // Write code here that turns the phrase above into concrete actions
  callback.pending();
});

this.Then(/^I must include an out\-of\-netwrok ATM charge$/, function (callback) {
  // Write code here that turns the phrase above into concrete actions
  callback.pending();
});

this.Given(/^that a customer has placed a limit order$/, function (callback) {
  // Write code here that turns the phrase above into concrete actions
  callback.pending();
});

this.Then(/^I must include our standard limit\-order charge$/, function (callback) {
  // Write code here that turns the phrase above into concrete actions
  callback.pending();
});

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

  1. Означает ли это, что должно быть только одно определение шага, которое нужно ввести только в один из двух файлов определения шага?
  2. Связывает ли огурец файлы функций с одноименными файлами step_definition? Другими словами, связывает ли он transaction-fee.feature с transaction-fee.steps.js? Если все определения шагов являются глобальными, то я могу ошибочно предположить, что настройка файла / каталога предназначена только для организации и ничего не значит в отношении среды выполнения.

Заранее благодарим за ваше время и пояснения.


person Naresh    schedule 03.10.2014    source источник


Ответы (1)


step defs прикреплены к объекту World, который в приведенном выше коде имеет значение this.

  1. Должно быть только одно определение шага. Они предназначены для совместного использования. IIRC, Cucumber Boo, стр. 149 (https://pragprog.com/book/hwcuc/the-cucumber-book) подробно разбирается в этом дизайнерском решении. Хотя это рубин, я думаю, что это то же самое во всех реализациях огурца.

  2. Cucumber не связывает файлы функций и файлы step_definition. Дерево файлов / соглашение только для удобства.

person Jeff Price    schedule 03.10.2014
comment
Спасибо - теперь все ясно! Это заставляет меня задуматься, как масштабировать это на больших проектах, не спотыкаясь друг о друге. - person Naresh; 04.10.2014
comment
Очень преднамеренно обращаясь с корнишоном :) В приведенном вами примере я бы рассмотрел конфликт как возможный запах кода. Почему ваш код банкомата и ваш брокерский код находятся в одной и той же кодовой базе, которая тестируется одним и тем же набором тестов? Я бы подумал, что это будут очень разные системы. - person Jeff Price; 04.10.2014
comment
Однако, возможно, это единое приложение для выставления счетов, которое просматривает транзакции и составляет единый оператор для клиента, и в этом случае, возможно, конфликт вовсе не является конфликтом. Given настраивает объект транзакции, When вызывает calculate_fee () для этого и возвращает набор элементов строки, Then проверяет, найдена ли соответствующая позиция. В этом случае у вас может быть то же самое, когда я рассчитываю комиссию за транзакцию, а также то же самое. Тогда я должен включить комиссию (\ w +). Так что на самом деле вы не спотыкаетесь, вы применяете свой API и дизайн. - person Jeff Price; 04.10.2014
comment
Потрясающие! Еще раз спасибо за ваши вдумчивые комментарии. - person Naresh; 04.10.2014