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:
| Function | Tujuan |
|---|---|
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.
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_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:
[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=0Mari kita telaah bagian kunci dari file di atas:
- Object
KotlinTest: meniru APIkotlin.testagar contoh dapat dijalankan tanpa menambah dependensi. Setiap pemanggilan assertion menambah penghitungpassataufail, mirip dengan cara runner JUnit mengumpulkan hasil test. assertEquals(expected, actual, message): membandingkan kedua nilai dengan==. Pesan opsional dipakai sebagai label agar lulusan lebih mudah dibaca.assertTrue(value, message): assertion sederhana untuk booleantrue. Jikavaluefalse, helper akan menandai kegagalan.assertFailsWith(exceptionClass, blok): menangkap Throwable yang dilempar blok. Jika tipe pengecualian cocok, test lulus; jika tidak ada pengecualian atau tipe berbeda, test gagal.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.
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.
| Function | Tujuan |
|---|---|
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 #
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 #
- kotlin.test stdlib API
— rujukan assertion
assertEquals,assertTrue, danassertFailsWithdari paketkotlin.test - JUnit 5 API reference
— rujukan API JUnit Jupiter yang menjadi runner default
kotlin.testdi JVM
Selanjutnya #
kotlin.test cocok untuk assertion dasar. Ketika butuh lifecycle, conditional execution, atau parameterized test, kita beralih ke JUnit 5 (Jupiter) — materi chapter berikutnya.