#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.