How Kotlin Makes API Test Automation with RestAssured Easier
Márcio Corrêa

Márcio Corrêa @marciorc_

About: Senior QA Engineer | Test Automation Specialist | Quality Advocate | Mind Mapper

Location:
Marília/SP, Brazil
Joined:
Jun 22, 2020

How Kotlin Makes API Test Automation with RestAssured Easier

Publish Date: Mar 4
0 0

If you work with API test automation, you’ve probably heard of RestAssured, a powerful library for testing REST APIs in Java. But what if I told you that you can make your tests even more efficient, readable, and maintainable by using Kotlin? 😉

Kotlin is a modern, concise, and feature-rich language that pairs perfectly with RestAssured. In this post, I’ll show you some Kotlin features that can supercharge your API tests!

1 - Concise and Readable Syntax

Kotlin is famous for its clean and concise syntax. This means less boilerplate code and more clarity. Check out how a simple test becomes cleaner:

val response = given()
    .header("Content-Type", "application/json")
    .body("""{"name": "John", "age": 30}""")
    .`when`()
    .post("/users")
    .then()
    .statusCode(201)
    .extract()
    .response()
Enter fullscreen mode Exit fullscreen mode

Fewer lines, less confusion, more productivity! 🚀

2 - Multiline Strings (Triple Quotes)

Tired of concatenating strings to create JSON payloads? With Kotlin, you can use multiline strings with """

val jsonPayload = """
    {
        "name": "John",
        "age": 30,
        "email": "john@example.com"
    }
"""
Enter fullscreen mode Exit fullscreen mode

Simple and organized, right?

3 - Extension Functions

Kotlin allows you to create extension functions, which are perfect for adding custom functionality to RestAssured. For example:

fun RequestSpecification.withJsonBody(body: String): RequestSpecification {
    return this.header("Content-Type", "application/json").body(body)
}

val response = given()
    .withJsonBody("""{"name": "John"}""")
    .`when`()
    .post("/users")
    .then()
    .statusCode(201)
    .extract()
    .response()
Enter fullscreen mode Exit fullscreen mode

This makes your code more modular and reusable. 💡

4 - Null Safety

Nothing worse than an unexpected NullPointerException, right? With Kotlin’s null safety system, you can avoid these issues:

val email: String? = response.path("email") // Can be null
println(email ?: "Email not found") // Handles null values
Enter fullscreen mode Exit fullscreen mode

Sleep well knowing your code won’t break because of a null! 😴

5 - Data Classes

Need to represent domain objects or DTOs? Kotlin’s data classes are perfect for this. They automatically generate methods like toString(), equals(), and hashCode():

data class User(val id: Int, val name: String, val email: String)

val user = User(1, "John", "john@example.com")
println(user) // Output: User(id=1, name=John, email=john@example.com)
Enter fullscreen mode Exit fullscreen mode

Less code, more productivity! 🎉

6 - Coroutines (Asynchronous Programming)

If your tests involve asynchronous calls, Kotlin’s coroutines can be a lifesaver:

import kotlinx.coroutines.*

fun fetchUserAsync(): Deferred<Response> = GlobalScope.async {
    given()
        .get("/users/1")
        .then()
        .extract()
        .response()
}

fun main() = runBlocking {
    val response = fetchUserAsync().await()
    println(response.body().asString())
}
Enter fullscreen mode Exit fullscreen mode

Asynchronous programming without the headache! 🌐

7 - DSL (Domain-Specific Language)

Kotlin allows you to create DSLs (Domain-Specific Languages), which can make your tests even more expressive

fun apiTest(block: RequestSpecification.() -> Unit): Response {
    return given().apply(block).`when`().get().then().extract().response()
}

val response = apiTest {
    header("Authorization", "Bearer token")
    queryParam("id", 1)

Enter fullscreen mode Exit fullscreen mode

Fluent and easy-to-understand code? Yes, please! 😍

Complete API Test Example

Here’s a complete example of an API test using Kotlin and RestAssured:

import io.restassured.RestAssured.*
import io.restassured.response.Response
import org.hamcrest.Matchers.*
import org.junit.Test

class ApiTest {

    @Test
    fun testCreateUser() {
        val jsonPayload = """
            {
                "name": "John",
                "age": 30,
                "email": "john@example.com"
            }
        """

        val response: Response = given()
            .header("Content-Type", "application/json")
            .body(jsonPayload)
            .`when`()
            .post("/users")
            .then()
            .statusCode(201)
            .body("name", equalTo("John"))
            .extract()
            .response()

        println("User created with ID: ${response.path<String>("id")}")
    }

    @Test
    fun testGetUser() {
        val response: Response = given()
            .queryParam("id", 1)
            .`when`()
            .get("/users")
            .then()
            .statusCode(200)
            .body("name", equalTo("John"))
            .extract()
            .response()

        println("User details: ${response.body().asString()}")
    }
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

Kotlin is a powerful language that pairs perfectly with RestAssured for API test automation. With its concise syntax, null safety, extension functions, and coroutine support, you can write more efficient, readable, and maintainable tests.

So, are you ready to take your API tests to the next level with Kotlin? If you’re already using Kotlin or have any questions, drop a comment below! Let’s chat! 🚀

Comments 0 total

    Add comment