我一直在尝试为我的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()
}
}
}