Regularnie pojawiają się dyskusje, czy testować "integracyjnie", czy "jednostkowo" i jedyne co wiem, to to, że chyba nikt na świecie nie wie, czym się różnią oba rodzaje testów. Spróbujmy na przykładzie. Mamy sobie CRUD'a do zapisywania jakiegoś pojedynczego typu (w przykładzie UserDTO
). Czy powinienem przetestować ten serwis tak jak w przykładzie, czy rozbić test na kawałki? Nie pytam o to, czy nie pominąłem jakiegoś przypadku, czy gdzieś powinienem dodać kolejną asercję, tylko czy powinienem mieć ileś tam testów na poszczególne metody, czy raczej taki pełniejszy scenariusz biznesowy, który testuje system jako ~black box'a.
internal class UsersModuleKtTest {
@Test
fun `post put get delete test`() = testApplication {
val client = createClient {
install(ContentNegotiation){
json()
}
}
application {
install(Koin){
modules(dbModule)
}
usersModule()
}
val emptyListResponse = client.get("/users"){
accept(ContentType.Application.Json)
contentType(ContentType.Application.Json)
}
assertEquals(HttpStatusCode.OK, emptyListResponse.status)
assertTrue(emptyListResponse.body<List<UserDto>>().isEmpty())
val postUserResponse = client.post("/users") {
contentType(ContentType.Application.Json)
accept(ContentType.Application.Json)
setBody(UserDto(null, "John", "Smith"))
}
val savedUser = postUserResponse.body<UserDto>()
assertEquals(HttpStatusCode.Created, postUserResponse.status)
assertNotNull(savedUser.userId)
val putResponse = client.put("/users/{userId}") {
url.parameters.set("userId", savedUser.userId.toString())
contentType(ContentType.Application.Json)
accept(ContentType.Application.Json)
setBody(UserDto(savedUser.userId, "Alice", "Doe"))
}
assertEquals(HttpStatusCode.OK, putResponse.status)
val getUserResponse = client.get("/users/{userId}"){
url.parameters.set("userId", savedUser.userId.toString())
contentType(ContentType.Application.Json)
accept(ContentType.Application.Json)
}
assertEquals(HttpStatusCode.OK, getUserResponse.status)
assertEquals(savedUser.userId, getUserResponse.body<UserDto>().userId)
assertEquals(savedUser.firstName, getUserResponse.body<UserDto>().firstName)
assertEquals(savedUser.lastname, getUserResponse.body<UserDto>().lastname)
val singleUserResponse = client.get("/users"){
accept(ContentType.Application.Json)
contentType(ContentType.Application.Json)
}
assertEquals(HttpStatusCode.OK, singleUserResponse.status)
assertEquals(1, singleUserResponse.body<List<UserDto>>().size)
}
}