В предыдущей части мы видели, как 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”