如何在Ktor中测试时只启动一次应用程序,而不是每次测试启动一次



我一直在尝试为我的Ktor应用程序编写一些测试,并遵循了这里的文档:

https://ktor.io/docs/testing.html#end-结束

使用这样的测试设置:

import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.testing.*
import kotlin.test.*
class ApplicationTest {
@Test
fun testRoot() = testApplication {
val response = client.get("/")
assertEquals(HttpStatusCode.OK, response.status)
assertEquals("Hello, world!", response.bodyAsText())
}
}

问题是,当在每个测试中使用testApplication时,当我有大约220个应该运行的测试时,测试会崩溃,因为我的应用程序每次启动都会读取一个json文件,导致";打开的文件太多";错误

我想做的是运行应用程序一次,然后将我的所有HTTP请求发送到该应用程序的这个实例,然后关闭该应用程序。

相反,上面发生的情况是,对于200多个测试中的每一个,应用程序都会被启动和关闭,从而导致内存错误。

如何只运行一次应用程序?

解决了它!

我们可以在beforeAll函数中启动应用程序,而不是在每次测试中启动它。下面是一个如何做到这一点的例子:

import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import io.ktor.server.testing.*
import io.ktor.test.dispatcher.*
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
class MyApiTest {
lateinit var JSON: Json
@Test
fun `Test some endpoint`() = testSuspend {
testApp.client.get("/something").apply {
val actual = JSON.decodeFromString<SomeType>(bodyAsText())
assertEquals(expected, actual)
}
}
companion object {
lateinit var testApp: TestApplication
@JvmStatic
@BeforeAll
fun setup()  {
testApp = TestApplication {  }          
}
@JvmStatic
@AfterAll
fun teardown() {
testApp.stop()
}
}
}

相关内容

  • 没有找到相关文章

最新更新