Какой может быть лучший подход для регрессионного набора для микросервисов, можно ли использовать для этого Scala?

Меня попросили подготовить регрессионный набор для тестирования микросервисов, для этого мне нужно: - Запустить скрипты - Запустить разные API (может быть несколько для сценариев, которые будут использоваться в следующем API) - Публиковать результат в каком-то презентабельном формате

Моим собственным первым выбором был Jmeter для этого, но старший ресурс не согласился, и меня попросили использовать SCALA, работая со Scalastest, я застрял с Futures, так как большая часть моего тестирования вращается вокруг вызова Restful API.

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


person Saquib Gul    schedule 10.03.2017    source источник
comment
Если вы хотите снизить производительность с помощью Scala, вы можете использовать Gatling gatling.io.   -  person Łukasz    schedule 10.03.2017


Ответы (2)


Определенно ДА, я использую scalatest для unit- тестирование, integration-testing, component-testing и shakedown-testing мой микросервис.

Я не использовал много JMeter, я попробовал его для проверки производительности моего микросервиса, это меня немного разочаровало, и я сразу же сдался.

Scalatest оказался для меня очень f#*$_&g продуктивным.

Пример очень простого интеграционного тестирования (я использую https://jsonplaceholder.typicode.com/posts/1 в качестве конечной точки API, которая является онлайн-API)

class SomeHttpFlowSpecs extends HttpFlowSpecs {

  feature("Getting user posts on my API server") {

    scenario("As a software engineer, I want to receive the user posts when I call the endpoint") {

      When("I send a GET request to the http endpoint")
      val response = doHttpGet("https://jsonplaceholder.typicode.com/posts/1")

      Then("I receive 200 response back with the user posts")
      assert(response.getStatusLine.getStatusCode == 200)

      val expectedJson =
        """
          |{
          |  "userId": 1,
          |  "id": 1,
          |  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
          |  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
          |}
        """.stripMargin

      assert(JSON.parseRaw(responseContent(response)) == JSON.parseRaw(expectedJson))
    }
  }
}

Я написал свой собственный HttpFlowSpecs как утилиту для выполнения HTTP-вызовов и обработки ответов. Звонки синхронны для меня, в отличие от того, что вы говорите Future ответов. Я использую хорошо известную apache httpclient для связи по http.

class HttpFlowSpecs extends extends FeatureSpec with GivenWhenThen with BeforeAndAfterAll {

  def doHttpGet(endpoint: String): CloseableHttpResponse = {
    val httpRequest = new HttpGet(endpoint)
    val response = (new DefaultHttpClient).execute(httpRequest)
    response
  }

  def doHttpPost(endpoint: String, content: String, contentType: String = "application/json"): CloseableHttpResponse = {
    val httpRequest = new HttpPost(endpoint)
    httpRequest.setHeader("Content-type", contentType)
    httpRequest.setEntity(new StringEntity(content))

    val response = (new DefaultHttpClient).execute(httpRequest)
    response
  }

  def responseContent(response: CloseableHttpResponse): String = {
    val responseBody: String = new BufferedReader(new InputStreamReader(response.getEntity.getContent))
      .lines().collect(Collectors.joining("\n"))

    println("Response body = " + responseBody)
    responseBody
  }
}

Вот очень простой conifers-spec, который я использую для тестирования.

Я использую pegdown - процессор Java Markdown со скалатестом для отчетов html, как показано ниже,

привязка

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

отчеты

Как я запускаю свои тесты

mvn clean test

Надеюсь, это будет полезно, дайте мне знать, если возникнут вопросы, буду рад помочь.

person prayagupd    schedule 10.03.2017
comment
Это действительно полезно, но, похоже, мне нужно перестроить то, что я пишу. Для http-вызовов я следовал за Play WS и инициировал систему Akka Actor и создавал WS-клиент для http-запроса, но это асинхронные вызовы, которые заставили меня задуматься, что для теста уровня компонента/интеграции мне нужно вызвать набор API получить ответ и использовать их сложно с асинхронными вызовами. Дайте мне знать, если я могу как-то связаться с вами, это будет очень полезно для меня. - person Saquib Gul; 15.03.2017
comment
Вы можете рассмотреть возможность использования AsyncFeatureSpec для асинхронных утверждений, что очень удобно для таких сценариев. Таким образом, вам не нужно ждать ответа вручную, пример здесь. В этом примере я использую akka-http в качестве клиента. Концептуально это будет похоже на PlayWSclient. напишите мне или создать задачу как вам удобно. Я постараюсь помочь, если смогу. Если я не втянут в проблемы с продукцией :) - person prayagupd; 15.03.2017

Я бы предпочел JMeter, основные функции:

  • У вас есть все необходимое из коробки (сэмплеры, пре/постпроцессоры, утверждения, отчеты) и т. д.)
  • Тесты JMeter можно масштабировать для запуска на нескольких машинах.
  • Тесты JMeter можно создавать с помощью графического интерфейса пользователя, знание языка программирования не требуется.

Существует также инструмент Gatling, в котором тесты создаются с использованием DSL, однако согласно Инструменты нагрузочного тестирования с открытым исходным кодом: какой из них следует использовать? JMeter лучше с точки зрения поддержки протоколов, масштабируемости и пропускной способности.

person Dmitri T    schedule 10.03.2017