Сформулируйте правильную фразу сценария

#scala #bdd

#scala #bdd

Вопрос:

Я хотел бы знать, соответствует ли следующая фраза Gherkin правилам BDD:

 final class KafkaSpec extends BddSpec {

  feature("Kafka distribution to SAP server via websocket") {

    scenario("Kafka consumer does not receive messages from Kafka server") {
      Given("Kafka server is NOT active")
      When("consumer client get started")
      val ex = SenderActor.run
      Then("print message `Failed to connect to Kafka`")
      ex.failed map { ex =>
        assertThrows[ConnectException](ex)
      }
    }

    scenario("Kafka consumer receives messages from Kafka server") {
      Given("Kafka server is ACTIVE")
      When("consumer client get started")
      Then("print message `Successfully connected to Kafka`")
      succeed
    }

  }
}  
  

Использую ли я правильное время? Правильно ли я использую Given-When-Then ?

Ответ №1:

Данные (контексты) хороши; обычно мы используем для них непрерывное настоящее или прошедшее время:

 Given the kafka server is active <-- continuous present
Given the kafka server was started <-- past tense
  

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

 When the consumer client was started <-- passive voice
When our consumer starts their client <-- active voice
  

Что касается Thens (результатов), мне действительно нравится слово «должен». Это побуждает людей задавать вопросы; должно ли это действительно произойти? Теперь? В этом выпуске? Есть ли какой-либо контекст, для которого этого не должно происходить или должно произойти что-то другое? Должно ли это все еще происходить, или этот сценарий изменился?

 Then the consumer interface should print the message, `Successfully connected to Kafka`.
  

Однако есть еще одна вещь: детали на этом последнем шаге кажутся мне слишком большими. Если сообщение изменилось, вам пришлось бы менять его везде. Вместо этого я сохраняю это в коде (вы можете абстрагироваться от шага) и сказал бы что-то вроде:

 Then the interface should tell the consumer that the connection was successful.
  

Это то, что мы обычно называем «декларативным, а не императивным». Здесь также можно использовать пассивный залог:

 Then the consumer should be told that the connection was successful.
  

Использование слова «должен» также помогает различать результаты одного сценария и данные другого; часто они пересекаются с результатом, формирующим контекст для другого сценария:

 Given Priscilla has an account
When she enters her username and password correctly
Then she should be on her home page.

Given Priscilla is on her home page...
  

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