Paket kotlin.test menyediakan kumpulan assertion minimal yang berjalan di seluruh target Kotlin: JVM, JS, dan Native. Karena bersifat multiplatform, kode test yang kita tulis dengan kotlin.test dapat dipakai ulang di banyak platform tanpa perubahan. Chapter ini memperkenalkan tiga function paling sering dipakai: assertEquals, assertTrue, dan assertFailsWith, serta menjelaskan peran kotlin.test sebagai lapisan tipis di atas framework runner bawaan tiap platform.

Apa Itu kotlin-test #

kotlin.test bukan test runner melainkan lapisan assertion yang menyembunyikan perbedaan antar platform. Di JVM, kotlin.test secara default memilih JUnit 5 (atau JUnit 4/TestNG bila dikonfigurasi) sebagai runner. Di JS dan Native, paket ini menggunakan implementasi minimal sendiri. Dengan demikian, satu kode test assertEquals(4, 2 + 2) akan berjalan di mana saja Kotlin berjalan.

Berikut tiga function yang paling sering dipakai:

FunctionTujuan
assertEquals(expected, actual)Membandingkan kesetaraan dua nilai
assertTrue(condition)Memastikan kondisi boolean bernilai true
assertFailsWith<E> { ... }Memastikan blok melemparkan tipe pengecualian tertentu

Penulisan dengan kotlin.test #

Pada produksi kita menulis test seperti berikut. Contoh ini memakai kotlin.test resmi (disediakan oleh kotlin-test.jar), jadi untuk kompilasi mandiri kita pakai re-implementasi lokal yang meniru API-nya.

kotlin Contoh: pakai kotlin.test resmi
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
import kotlin.test.assertFailsWith

class KalkulatorTest {
    @Test
    fun `jumlah dua angka positif`() {
        assertEquals(4, 2 + 2)
    }

    @Test
    fun `bilangan lebih besar`() {
        assertTrue(5 > 3)
    }

    @Test
    fun `melempar IAE saat penyebut nol`() {
        assertFailsWith<IllegalArgumentException> {
            require(false) { "gagal" }
        }
    }
}

Karena blok di atas memerlukan runner JUnit untuk eksekusi, berikut versi runnable dengan main() yang meniru perilaku ketiga assertion tersebut menggunakan implementasi lokal:

kotlin
// kotlin_test_demo.kt
// Mendemonstrasikan API kotlin.test (assertEquals, assertTrue, assertFailsWith)
// dengan re-implementasi lokal agar file tetap runnable tanpa dependency.
// Untuk produksi, pakai `kotlin.test` resmi dari kotlin-test.jar.

// Re-implementasi sederhana agar contoh lulus dengan kotlinc standar.
object KotlinTest {
    private var pass = 0
    private var fail = 0

    fun <T> assertEquals(expected: T, actual: T, message: String = "") {
        val label = if (message.isEmpty()) "assertEquals" else message
        if (expected == actual) {
            println("[LULUS] $label: $actual")
            pass++
        } else {
            println("[GAGAL]  $label: expected=$expected actual=$actual")
            fail++
        }
    }

    fun assertTrue(value: Boolean, message: String = "assertTrue") {
        if (value) {
            println("[LULUS] $message")
            pass++
        } else {
            println("[GAGAL]  $message: kondisi false")
            fail++
        }
    }

    fun assertFailsWith(exceptionClass: kotlin.reflect.KClass<*>, blok: () -> Unit, message: String = "assertFailsWith") {
        try {
            blok()
            println("[GAGAL]  $message: tidak ada pengecualian")
            fail++
        } catch (e: Throwable) {
            if (exceptionClass.isInstance(e)) {
                println("[LULUS] $message: ${e::class.simpleName} terlempar")
                pass++
            } else {
                println("[GAGAL]  $message: tipe salah ${e::class.simpleName}")
                fail++
            }
        }
    }

    fun ringkasan() {
        println()
        println("Total: pass=$pass fail=$fail")
    }
}

fun main() {
    // assertEquals
    KotlinTest.assertEquals(4, 2 + 2, "penjumlahan dasar")
    KotlinTest.assertEquals("Budi", "Bu" + "di", "string concat")

    // assertTrue
    KotlinTest.assertTrue(5 > 3, "5 > 3")
    KotlinTest.assertTrue(listOf(1, 2, 3).contains(2), "list contains 2")

    // assertFailsWith
    KotlinTest.assertFailsWith(IllegalArgumentException::class, {
        require(false) { "angka negatif" }
    }, "require(false) melempar IAE")

    KotlinTest.ringkasan()
}

Output yang Dihasilkan:

text
[LULUS] penjumlahan dasar: 4
[LULUS] string concat: Budi
[LULUS] 5 > 3
[LULUS] list contains 2
[LULUS] require(false) melempar IAE: IllegalArgumentException terlempar

Total: pass=5 fail=0

Mari kita telaah bagian kunci dari file di atas:

  1. Object KotlinTest: meniru API kotlin.test agar contoh dapat dijalankan tanpa menambah dependensi. Setiap pemanggilan assertion menambah penghitung pass atau fail, mirip dengan cara runner JUnit mengumpulkan hasil test.
  2. assertEquals(expected, actual, message): membandingkan kedua nilai dengan ==. Pesan opsional dipakai sebagai label agar lulusan lebih mudah dibaca.
  3. assertTrue(value, message): assertion sederhana untuk boolean true. Jika value false, helper akan menandai kegagalan.
  4. assertFailsWith(exceptionClass, blok): menangkap Throwable yang dilempar blok. Jika tipe pengecualian cocok, test lulus; jika tidak ada pengecualian atau tipe berbeda, test gagal.
  5. ringkasan(): mencetak total pass dan fail. Pada runner JUnit, laporan ini dihasilkan otomatis oleh test runner.

Mendukung Banyak Platform #

Karena kotlin.test adalah abstraksi multiplatform, file test yang sama dapat dijalankan di JVM, JS, dan Native. Misalnya project Kotlin Multiplatform (KMP) yang berisi modul commonMain dengan kode shared dan modul jvmMain/jsMain/nativeMain untuk implementasi platform-specific. Test ditulis di commonTest dan memakai assertEquals dari kotlin.test. Runner yang sesuai diaktifkan berdasarkan target kompilasi.

kotlin Contoh: test di commonTest KMP
import kotlin.test.Test
import kotlin.test.assertEquals

class StringTest {
    @Test
    fun `panjang string`() {
        assertEquals(5, "kotlin".length)
    }
}

Daftar Lengkap Assertion #

Selain tiga function yang sudah dibahas, kotlin.test menyediakan beberapa helper lain yang sering dipakai. Berikut ringkasan praktis untuk referensi sehari-hari.

FunctionTujuan
assertNotEquals(unexpected, actual)Memastikan dua nilai berbeda
assertNull(value) / assertNotNull(value)Memeriksa nullability
assertFalse(condition)Memastikan boolean false
assertContains(haystack, needle)Memastikan koleksi/string mengandung elemen
assertFails { blok }Memastikan blok melemparkan pengecualian apa pun
expect<T> { blok }Memastikan blok mengembalikan nilai bertipe T

Function assertFails berbeda dari assertFailsWith — yang pertama menerima pengecualian apa pun, sedangkan yang kedua harus cocok dengan tipe spesifik. Untuk test yang ingin memastikan hanya tipe tertentu yang dilempar, assertFailsWith lebih ketat dan aman.

Konfigurasi Gradle #

kotlin Contoh: dependensi kotlin-test
dependencies {
    testImplementation(kotlin("test"))
    testImplementation(kotlin("test-junit5"))
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
}

tasks.test {
    useJUnitPlatform()
}

Akses kotlin("test") adalah shorthand Gradle untuk dependensi org.jetbrains.kotlin:kotlin-test dengan versi yang otomatis mengikuti versi plugin Kotlin. Pendekatan ini memastikan versi kotlin-test selaras dengan versi kompilator yang dipakai.

Referensi Lanjutan #

Selanjutnya #

kotlin.test cocok untuk assertion dasar. Ketika butuh lifecycle, conditional execution, atau parameterized test, kita beralih ke JUnit 5 (Jupiter) — materi chapter berikutnya.