Рубрики
Без рубрики

Сокращение шаблонности в тестах Vert.x, написанных на Kotlin

В предыдущей части мы рассмотрели, как Kotlin может снизить уровень шума в асинхронных тестах. В этой части мы будем… Помечен тегами vertx, kotlin, тестирование, java.

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

При тестировании вертикали нам нужно сказать junit развернуть вертикаль перед тестированием и отменить ее развертывание после этого. Это довольно просто, но добавление в каждый отдельный тестовый файл может быть утомительным:

  private lateinit var deploymentId: String

  @BeforeEach
  fun deployVerticle(): Unit = runBlocking(vertx.dispatcher()) {
    deploymentId = vertx.deployVerticle(verticleClass.java, DeploymentOptions()).await()
  }

  @AfterEach
  fun undeployVerticle(): Unit = runBlocking(vertx.dispatcher()) {
    vertx.undeploy(deploymentId).await()
  }

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

Мы должны убедиться, что это достаточно гибко, поэтому в этом случае нам нужны некоторые параметры конфигурации. Мы должны быть в состоянии:

  • Укажите, какую вертикаль мы хотели бы протестировать
  • Передайте конфигурацию этой вертикали, например, URI базы данных или временный каталог
  • При необходимости настройте развертывание
  • Запустите тестовый код в потоках Vert.x

Итак, давайте определим этот вспомогательный класс:

abstract class AsyncTest(
  private val vertx: Vertx,
  private val verticleClass: KClass,
  private val deploymentOptions: DeploymentOptions = DeploymentOptions()
) {
  private lateinit var deploymentId: String

  open fun deployVerticle(): String = runBlocking(vertx.dispatcher()) {
    vertx.deployVerticle(verticleClass.java, deploymentOptions).await()
  }

  @BeforeEach
  fun assignDeploymentId() {
    deploymentId = deployVerticle()
  }

  @AfterEach
  fun undeployVerticle(): Unit = runBlocking(vertx.dispatcher()) {
    vertx.undeploy(deploymentId).await()
  }

  protected fun runTest(block: suspend () -> Unit): Unit = runBlocking(vertx.dispatcher()) {
    block()
  }
}

Если у нас есть такие вещи, как Http-клиенты, мы также можем разместить их здесь и сделать доступными для всех тестов. Теперь, когда мы хотим протестировать вертикаль, мы просто расширяем этот класс, добавляя тесты:

@ExtendWith(VertxExtension::class)
class TestMainVerticle(vertx: Vertx) : AsyncTest(vertx, MainVerticle::class) {

  @Test
  fun `service is healthy when deployed`() = runTest {
    val request = httpClient.request(HttpMethod.GET, 8080, "localhost", "/health").await()
    val response = request.send().await()
    val responseJson = response.body().await().toJsonObject()

    assertEquals("up", responseJson.getString("status"))
  }
}

Наш вспомогательный класс позаботится о том, чтобы:

  • Вертикаль развертывается и не развертывается для каждого теста
  • Тесты, заключенные в runTest , автоматически запускаются в потоке Vert.x

Резюме

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

Источник

Полный проект можно найти в этом репозитории GitHub .

Оригинал: “https://dev.to/wowselim/reducing-boilerplate-in-vert-x-tests-written-in-kotlin-4002”