Несколько Дано в одном сценарии - PullRequest
2 голосов
/ 22 апреля 2019

У меня есть сценарий, который выглядит следующим образом:

scenario("Websocket client sends data to websocket server on SAP when is UP") {
  Given("Websocket server on SAP is ACTIVE")
  And("it supports websocket channel")
  When("Websocket client get started")
  Then("print message `Connection has been successfully established`")

  Given("Websocket server on SAP is ACTIVE")
  And("it does not support websocket channel")
  When("Websocket client get started")
  Then("throws RunException")
  succeed

} 

Как видите, Given повторяется дважды.Вопрос в том, было бы также правильно, если бы я просто оставил второй Given как следующий

scenario("Websocket client sends data to websocket server on SAP when is UP") {
  Given("Websocket server on SAP is ACTIVE")
  And("it supports websocket channel")
  When("Websocket client get started")
  Then("print message `Connection has been successfully established`")

  And("it does not support websocket channel")
  When("Websocket client get started")
  Then("throws RunException")
  succeed

} 

Ответы [ 2 ]

4 голосов
/ 22 апреля 2019

Как правило, плохая идея иметь сценарии, основанные на других сценариях для настройки их контекста.Это шаблон, который мы называем «GivenScenario».Это усложняет просмотр поведения (теперь вам нужно прочитать весь первый сценарий, чтобы понять контекст второго), и если первый сценарий не удался, второй даже не запустится.

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

Если у вас есть какое-то поведение, которое «всегда включено», большинство BDDинструменты помещают это в то, что они называют «Фон».Эквивалент этого в ScalaTest выглядит как черта «BeforeAndAfter» (я не так хорошо знаком с ScalaTest, так что кто-то исправит меня, если я ошибаюсь!).

Поэтому вместо того, чтобы это «всегда включено» активноВ сценарии websocket вы можете переместить поведение на «До».

Конечно, «фон» в ScalaTest не печатается при его запуске;это тихоНо вы могли бы обойти это, позвонив в любом случае, и переместив английский язык к названию (обратите внимание на добавление «active»):

class ExampleSpec extends FeatureSpect with BeforeAndAfter {

  before {
    server = startServer()
  }

  scenario("Websocket client sends data to active websocket server on SAP when is UP") {
    Given("it supports websocket channel")
    // etc...
  }
}

или первое значение:

class ExampleSpec extends FeatureSpect with BeforeAndAfter {

  before {
    server = startServer()
  }

  scenario("Websocket client sends data to websocket server on SAP when is UP") {

    Given("an active server with a client that supports websocket channel")
    // etc...
  }
}

(Опять же, я не знаком со ScalaTest, и это было всегда с тех пор, как я запрограммировал Scala, поэтому, пожалуйста, исправьте любые синтаксические ошибки; этот ответ более сфокусирован на принципе. В документации, которую я нашел на этом , все шаги показаны какв нижнем регистре.)

Единственный раз, когда я склонен использовать GivenScenarios, это когда я ленивый (или прагматичный), и есть (обычно человеческое) взаимодействие, которое приведет к одной или нескольким попыткам чего-то перед тем, как получитьуспех:

Given Florence Forgetful is at the login page
When she puts in the wrong username
Then she should be told there was an error
When she puts in the wrong password
Then she should be told there was still an error
When she puts in the right username and right password
Then she should be taken to her home page.

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

Если включитьподдержка включения и выключения в клиенте - это действие, которое может выполнять человек, тогда вы можете следовать той же схеме, но необходимость в двух «когда» подряд является хорошим признаком того, что теперь проиллюстрировано более одной возможностиздесь:

scenario("Websocket client sends data to websocket server on SAP when is UP") {
  Given("Websocket server on SAP is ACTIVE")
  And("websocket support is turned off")
  When("Websocket client get started")
  Then("throws RunException")
  When("websocket support is turned on")
  And("Websocket client get started") // <-- This is a second "When" here
  Then("print message `Connection has been successfully established`")
  succeed
} 

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

3 голосов
/ 22 апреля 2019

После ответа @Livivore укажите отдельные сценарии для поддерживаемого и неподдерживаемого канала соответственно:

scenario("Websocket client sends data to server over supported channel")
scenario("Websocket client sends data to server over unsupported channel")

Выделение дублированного кода в предложении Given может быть достигнуто с помощью приспособлений , например,

class HelloSpec extends fixture.AsyncFeatureSpec with Matchers with GivenWhenThen {
  type FixtureParam = String // FIXME: Provide real SapWebSocket type

  override def withFixture(test: OneArgAsyncTest): FutureOutcome = {
    Given("Websocket server on SAP is ACTIVE")
    val activeSapWebsocketFixtureParam = "activateSapWebSocket()" // FIXME: implement activateSapWebSocket()
    withFixture(test.toNoArgAsyncTest(activeSapWebsocketFixtureParam))
  }

  feature("Kafka distribution to a server via websocket") {
    scenario("Websocket client sends data to server over supported channel") {
      givenActiveSapWebsocket =>
        And("given websocket channel is SUPPORTED")
        When("Websocket client get started")
        Then("print message `Connection has been successfully established`")
        succeed
    }

    scenario("Websocket client sends data to server over unsupported channel") {
      givenActiveSapWebsocket =>
        And("given websocket channel is UNSUPPORTED")
        When("Websocket client get started")
        Then("throws RunException")
        succeed
    }
  }
}

Обратите внимание, как Given("Websocket server on SAP is ACTIVE") был перемещен в withFixture. Также обратите внимание на использование fixture.AsyncFeatureSpec вместо AsyncFeatureSpec для обеспечения поддержки прибора. Это должно вывести

[info] Feature: Kafka distribution to a server via websocket
[info] - Scenario: Websocket client sends data to server over supported channel
[info]   + Given Websocket server on SAP is ACTIVE 
[info]   + And given websocket channel is SUPPORTED 
[info]   + When Websocket client get started 
[info]   + Then print message `Connection has been successfully established` 
[info] - Scenario: Websocket client sends data to server over unsupported channel
[info]   + Given Websocket server on SAP is ACTIVE 
[info]   + And given websocket channel is UNSUPPORTED 
[info]   + When Websocket client get started 
[info]   + Then throws RunException 

Лично я не стал бы беспокоиться о приспособлении и сохранял бы дублирование ради читабельности исходного кода теста, однако я бы определенно оставил сценарии раздельными.

...