Testing memastikan kode berperilaku sesuai harapan. Kotlin memudahkan testing lewat kotlin-test, JUnit 5, mockk, dan dukungan testing coroutine.

# Testing Fundamentals

Memahami mengapa kita menulis test, jenis-jenis test (unit, integration, e2e), pola Arrange-Act-Assert, dan test pyramid.

Buka →
# kotlin-test

Mengenal paket kotlin.test: assertEquals, assertTrue, assertFailsWith, dan peran sebagai lapisan assertion multiplatform.

Buka →
# JUnit Jupiter

Mengenal JUnit 5 (Jupiter): @Test, @BeforeEach, @AfterEach, @DisplayName, @Disabled, dan method assertion bawaan.

Buka →
# Assertions

Menguasai assertion dasar dan lanjutan: assertEquals, assertNotEquals, assertTrue, assertNull, assertNotNull, assertThrows, dan assertAll untuk grup assertion.

Buka →
# Parameterized Tests

Mengulang test yang sama dengan banyak input: @ParameterizedTest, @ValueSource, @CsvSource, dan @MethodSource.

Buka →
# Test Lifecycle

Mempelajari urutan @BeforeAll, @BeforeEach, @Test, @AfterEach, @AfterAll, serta perbedaan static vs instance method.

Buka →
# Mocking Fundamentals

Mengenal konsep mock: mengganti dependency dengan double terkontrol, perbedaan Stub vs Mock vs Spy vs Fake, dan kapan harus memakai mock.

Buka →
# MockK

Menguasai MockK: mockk<Class>(), every { } returns, verify { }, DSL Kotlin idiomatik untuk mocking.

Buka →
# Stubs, Mocks, dan Fakes

Taksonomi test doubles: kapan memakai Stub (return fixed), Fake (implementasi sederhana), atau Mock (verifikasi panggilan).

Buka →
# Coroutine Testing

Menguji coroutine dengan runTest dari kotlinx-coroutines-test: virtual time, TestDispatcher, dan skip delay otomatis.

Buka →
# Flow Testing

Menguji Flow dengan Turbine: flow.test { awaitItem(); awaitComplete(); awaitError() } dan alternatif tanpa library.

Buka →
# Integration Testing

Menguji integrasi beberapa komponen nyata: pola @SpringBootTest, Ktor testApplication, dan pilihan real database vs Testcontainers.

Buka →
# Database Testing

Strategi menguji repository: H2 in-memory untuk kecepatan, Testcontainers Postgres untuk kepercayaan, dan migration test untuk skema.

Buka →
# Test Fixtures

Setup bersama dengan @BeforeEach, fixture function, dan test data builder untuk menyusun objek uji yang ringkas dan konsisten.

Buka →
# Test Coverage

Mengukur cakupan test dengan JaCoCo: perbedaan line coverage vs branch coverage, kesalahpahaman umum tentang angka 100%, dan apa yang sebaiknya diuji.

Buka →
# Property-Based Testing

Menguji sifat (property) yang harus selalu benar dengan input acak: kotest property testing, jqwik, dan menemukan edge case otomatis.

Buka →
# Testcontainers

Menjalankan service nyata di Docker saat test: PostgreSQLContainer, GenericContainer, dan lifecycle container yang otomatis.

Buka →
# Testing Best Practices

Prinsip praktik testing: uji perilaku bukan implementasi, satu assertion per test, penamaan jelas, test cepat dan hermetic.

Buka →