Nano Hash - криптовалюты, майнинг, программирование

Схема сценария в scalatest

Я реализую свой тестовый фреймворк с помощью scalatest и думаю, что допустил ошибку, используя этот фреймворк вместо Cucumber.

Я пытаюсь использовать какие-то функции, такие как Scenario outline огурца, чтобы избежать поломки DRY.

вот моя проблема

  feature("Features of mus client") {
    scenario("GET message with mus client") {
      Given("a Musin message")
      val config: Properties = new Properties
      config.put("method", "POST")
      config.put("encoding", "UTF-8")
      config.put("uri", "http://localhost:9083/musClient")
      When("I make a request to f2e")
      val response = HttpClientTest.request(config, createJSON(READ))
      Then("The message it´s returned successfully")
      assert(response != null)
    }

    scenario("POST message with mus client") {
      Given("a Musin message")
      val config: Properties = new Properties
      config.put("method", "POST")
      config.put("encoding", "UTF-8")
      config.put("uri", "http://localhost:9083/musClient")
      When("I make a request to f2e")
      val response = HttpClientTest.request(config, createJSON(CREATE))
      Then("The message it´s returned successfully")
      assert(response != null)
    }

Как видите, у меня есть два сценария, где 99% — это одни и те же шаги, но переменная, которая изменяет запрос.

Любая идея, как сделать это элегантно и эффективно в scalatest

22.02.2017

Ответы:


1

И я тоже один из тех, кто выбрал scalatest вместо огурца, огурца было слишком много для меня (ME), чтобы написать файл функций, а затем вернуться к файлу scala/java и внести соответствующие изменения. Поддерживать два файла. На самом деле я играл в cucumber java, scala cucumber может быть более беглым. В любом случае, мне пока нравится scalatest для всех моих модульных тестов, тестирования компонентов и потокового тестирования.

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

class E2E extends FeatureSpec with GivenWhenThen {
  feature("Features of mus client") {

    Given("http config")
    val config: Properties = new Properties(){{
        put("method", "POST") //you are doing POST in both case by the way
        put("encoding", "UTF-8")
        put("uri", "http://localhost:9083/musClient")
     }}

    scenario("GET message with mus client") {

      When("I make a request to f2e")
      val response = HttpClientTest.request(config, createJSON(READ))

      Then("The message it´s returned successfully")
      assert(response != null)
    }

    scenario("POST message with mus client") {

      When("I make a request to f2e")
      val response = HttpClientTest.request(config, createJSON(CREATE))

      Then("The message it´s returned successfully")
      assert(response != null)

    }
  }
}

Но вы также можете использовать тестирование на основе свойств только для часть, которая меняется, проверка на основе свойств была очень быстрой и читабельной в spock framework.

Проверка на основе свойств в scalatest будет выглядеть так, как показано ниже, где я тестирую два разных входных параметра. (вам нужно import org.scalatest.prop.TableDrivenPropertyChecks._)

class TestE2E extends FeatureSpec with GivenWhenThen {

  val requestResponse =
    Table(
      ("request", "response"),
      (  "GET",   "GET-something"),
      ( "POST",   "POST-something")
    )

  feature("testMe") {

    forAll (requestResponse) { (givenRequestFromTable: String, expectedResponseFromTable: String) =>

      scenario("for input " + givenRequestFromTable) {

        When("input is " + givenRequestFromTable)
        val output = testMe(input = givenRequestFromTable)

        Then("responseFromTable has something appended to it")
        assert(output == expectedResponseFromTable)
      }
    }
  }

  def testMe(input: String) : String = {
     input + "-something"
  }
}

Будет два сценария, основанных на двух заданных свойствах: два теста

И для вас тесты будут такими, как показано ниже, на основе свойств, надеюсь, нет ошибки компиляции :)

import org.scalatest.prop.TableDrivenPropertyChecks._
import org.scalatest.prop.Tables.Table
import org.scalatest.{FeatureSpec, GivenWhenThen}

class PaulWritesSpecs extends FeatureSpec with GivenWhenThen {

  val requestResponse =
    Table(
      ("httpMethod", "requestType"),
      ("GET", READ),
      ("POST", CREATE))

  feature("Features of mus client") {

    forAll(requestResponse) { (httpMethod: String, requestType: String) => {

        scenario(s"$httpMethod message with mus client") {

          Given("http config")
          val config: Properties = new Properties() {{
            put("method", httpMethod)
            put("encoding", "UTF-8")
            put("uri", "http://localhost:9083/musClient")
          }}

          When("I make a request to f2e")
          val response = HttpClientTest.request(config, createJSON(requestType))

          Then("The message it´s returned successfully")
          assert(response != null)
        }
      }
    }
  }
}
22.02.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

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