Cucumber-JVM рассматривает все взаимозаменяемые взаимосвязи

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

Учитывая

Feature: Grab that cash with both hands and make a stash
 Scenario: Spend it
 Given Jack has 5 dollars
 When Jack wants to buy Lear Jet
 Then He doesn't have enough cash
 Scenario: aquire it
 Given Jack is broke
 But his wealth is slowly growing
 When Jack has 5 dollars
 Then He can afford a pack of gum
 Scenario: own it
 Given Jack is broke
 But he has a job that paid 5 dollar an hour
 When He works an hour
 Then Jack has 5 dollars
@Given("^Jack has 5 dollars$")
public void set_it() throws Throwable {
 this.jack = new Person();
 jack.setCashAmount(5);
}
@When("^Jack has 5 dollars$")
public void wait_it() throws Throwable {
 jack.waitFor(wealth(is(equalTo(5))));
}
@Then("^Jack has 5 dollars$")
public void check_it() throws Throwable {
 assertThat("Jack should have 5 dollars by now",
 jack.getCashAmount(),
 is(equalTo(5)));
}

Когда

Я запускаю эту функцию с огурцом (с плагином mvn/intelliJ plugin/eclipse/волшебным хрустальным шаром/другой смешной средой)

Тогда

Получаю следующее сообщение:

cucumber.runtime.DuplicateStepDefinitionException: Duplicate step definitions in my.project.MySteps.wait_it() in file:[...] and my.project.MySteps.set_it() in file:[...]
 at cucumber.runtime.RuntimeGlue.addStepDefinition(RuntimeGlue.java:33)
 at cucumber.runtime.java.JavaBackend.addStepDefinition(JavaBackend.java:151)
 at cucumber.runtime.java.MethodScanner.scan(MethodScanner.java:68)
 at cucumber.runtime.java.MethodScanner.scan(MethodScanner.java:41)
 at cucumber.runtime.java.JavaBackend.loadGlue(JavaBackend.java:86)
...

И куча других нерелевантных строк, из которых я вас пощажу.

Diagnostic

Огурцы, по-видимому, не имеют разницы между @Given("a"), @When("a") и @Then("a")@And и @But, которые я действительно не знаю, для чего они предназначены в первую очередь, поскольку эти являются просто синтаксическим сахаром для "того же, что и я сделал" )

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

  • Шаг "Данный" должен установить предварительные условия тестирования
  • A "Когда" шаг должен вызвать действие или ждать один
  • Шаг "Затем" должен последовать за состоянием системы.

Что мне там не хватает?

Есть ли способ сказать Cucumber, как полагаться не только на regexp, но и на типы шагов (что для меня должно быть по умолчанию)?

2 ответа

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

Шаг действия обычно можно сформулировать так, чтобы он содержал глагол, чтобы различать настройки и утверждения, я согласен, что иногда это довольно сложно. Вы должны были бы придумать свои собственные соглашения здесь, одна из возможностей могла бы быть следующей:

Given Jack is broke
 When Jack earns 5 dollars
 Then Jack should have 5 dollars


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

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

Взгляните внутрь cucumber-java.jar - вы найдете разные наборы аннотаций для разных языков в пакете cucumber.api.java (нелатинские алфавиты тоже), например. en_pirate версия: Avast, Aye, Blimey, Gangway, Letgoandhaul;)

Нет никакого конкретного порядка или семантики каждого из них - они просто держатели регулярных выражений.

ИЗМЕНИТЬ

Аннотации не зависят от выражений, используемых в файлах функций. Вы можете использовать значение по умолчанию "Дано/Когда/Тогда" в файлах функций и аннотации en_pirate Avast, Aye, Blimey - огурцы будут соответствовать им.

Однако сами файлы функций анализируются парсером Gherkin (как это справедливо указано ниже @Ar3s), и вы можете использовать один из поддерживаемых разговорных языков, поставив

#language:

в первой строке вашего файлового файла. Вы можете найти сопоставления между английскими ключевыми словами по умолчанию и другими языками в Gherkin i18n JSON. Тем не менее, язык файла функций и язык аннотаций не должны совпадать.

licensed under cc by-sa 3.0 with attribution.