Given-When-Then: apa itu, struktur skenario dan contoh

Penulis: IT Sectr Diterbitkan: 2026-04-10 Waktu membaca: 8 mnt

Given-When-Then — adalah pola struktural untuk mendeskripsikan skenario pengujian, yang dipinjam oleh BDD dari domain-driven design dan diadaptasi untuk Behaviour-Driven Development. Format ini membagi skenario menjadi tiga bagian logis: prasyarat (Given), tindakan (When) dan hasil yang diharapkan (Then). Menurut Martin Fowler (2023), Given-When-Then bukan sekadar format pengujian, melainkan alat berpikir yang mendisiplinkan analisis persyaratan dan perancangan skenario sebelum dimulainya implementasi.

Poin-poin utama

  • Given-When-Then — pola deskripsi skenario dari tiga blok: konteks, tindakan, hasil
  • Given menetapkan keadaan awal sistem dan data sebelum menjalankan tindakan yang diuji
  • When mendeskripsikan peristiwa atau tindakan yang memicu logika yang diuji
  • Then memeriksa perubahan keadaan yang diharapkan atau nilai yang dikembalikan
  • Arrange-Act-Assert — padanan Given-When-Then dalam pengujian unit, tetapi tanpa orientasi pada bahasa bisnis

Apa itu Given-When-Then?

Given-When-Then — adalah pola deskripsi perilaku yang pertama kali dirumuskan oleh Dan North pada tahun 2006 sebagai bagian dari metodologi Behavior-Driven Development. Pola ini memecahkan masalah deskripsi skenario pengujian yang tidak terstruktur, yang sering kali berisi campuran prasyarat, tindakan, dan pemeriksaan dalam urutan sembarang.

Ide utama dari pola ini adalah pemisahan tanggung jawab antara tiga blok. Setiap blok bertanggung jawab atas tepat satu aspek skenario: keadaan sebelum, peristiwa selama, dan pemeriksaan setelah. Ini membuat skenario dapat dibaca, diverifikasi, dan diotomatisasi. Menurut penelitian pengembang framework Cucumber (2024), skenario yang secara ketat mengikuti pola Given-When-Then membutuhkan waktu 42% lebih sedikit untuk dipahami oleh anggota tim baru.

Asal-usul pola

Dan North meminjam ide struktur tiga bagian dari formulation of tests dalam TDD dan metodologi Test-by-Example (diciptakan oleh Brian Marick). Marick mengusulkan untuk mendeskripsikan persyaratan melalui contoh (examples) yang sekaligus berfungsi sebagai pengujian. Given-When-Then memformalkan ide ini, mengubah contoh yang tidak terstruktur menjadi pola yang dapat diulang.

Lingkup penerapan

Pola Given-When-Then diterapkan tidak hanya dalam skenario BDD di Gherkin, tetapi juga dalam pengujian unit biasa di JUnit, XCTest, dan framework lainnya. Komentar dalam kode yang membagi pengujian menjadi tiga blok adalah praktik umum untuk meningkatkan keterbacaan basis pengujian. Google merekomendasikan pendekatan ini dalam bukunya “Software Engineering at Google” (2020).

Struktur tiga blok

Setiap blok Given-When-Then memiliki semantik dan aturan pengisian yang ditentukan secara ketat. Pelanggaran terhadap aturan ini menyebabkan skenario yang sulit diotomatisasi atau dipahami.

Given: prasyarat

Blok Given mendeskripsikan keadaan sistem sebelum menjalankan tindakan yang diuji. Ini mencakup: objek yang ada (pengguna, pesanan, pengaturan), keadaan aktif (terautentikasi, terhubung ke jaringan), serta nilai awal data. Setiap Given harus dapat diverifikasi — jika keadaan sistem tidak sesuai dengan Given, skenario harus dilewati atau lingkungan pengujian harus dipersiapkan terlebih dahulu.

When: tindakan

Blok When mendeskripsikan satu peristiwa yang memulai perilaku yang diuji. Ini bisa berupa pemanggilan metode, penekanan tombol, penerimaan notifikasi atau respons dari server. Aturan kunci — satu When per skenario. Jika perlu memeriksa urutan tindakan, buatlah skenario terpisah, bukan rantai When.

kotlin
// Given: membuat data pengujian
val user = User(email = "test@example.com", balance = 500.0)
val product = Product(price = 150.0)

// When: melakukan tindakan
val result = PurchaseUseCase().buy(user, product)

// Then: memeriksa hasil
assertEquals(PurchaseResult.Success, result)
assertEquals(350.0, user.balance)

Then: hasil yang diharapkan

Blok Then memeriksa apakah sistem telah beralih ke keadaan yang diharapkan. Ini mencakup: nilai yang dikembalikan, perubahan keadaan objek, pemanggilan layanan eksternal (melalui verifikasi mock), serta perubahan UI. Setiap blok Then dapat berisi beberapa pemeriksaan, tetapi semuanya merujuk pada satu tindakan.

Given-When-Then dan Arrange-Act-Assert

Given-When-Then dan Arrange-Act-Assert (AAA) — adalah dua varian dari pola tiga bagian yang sama, tetapi dengan audiens target yang berbeda. Memahami perbedaan mereka membantu memilih format yang tepat untuk tugas tertentu.

AspekGiven-When-ThenArrange-Act-Assert
Asal-usulBDD, analisis bisnisPengujian unit
BahasaAlami (Gherkin)Kode (Kotlin, Swift, Java)
AudiensSeluruh tim + klienPengembang
Tingkat detailTingkat tinggiDetail
OtomatisasiCucumber, SpecFlowJUnit, XCTest, Mockito

Kapan menggunakan Given-When-Then

Pola Given-When-Then optimal untuk skenario yang didiskusikan dengan klien atau analis: kriteria penerimaan fitur, skenario penggunaan, pemeriksaan regresi. Sintaks Gherkin memungkinkan penulisan skenario semacam itu tanpa pengetahuan pemrograman.

Kapan menggunakan Arrange-Act-Assert

Arrange-Act-Assert — adalah pilihan alami untuk pengujian unit yang memeriksa metode atau kelas tertentu. Format AAA tidak memerlukan framework tambahan dan bekerja di bahasa pemrograman apa pun. Untuk pengembangan iOS, Apple merekomendasikan AAA dalam dokumentasi XCTest (2024).

Contoh skenario di Kotlin

Mari kita lihat contoh praktis Given-When-Then di Kotlin untuk aplikasi Android. Contoh pertama — pengujian keranjang belanja menggunakan MockK. Contoh kedua — pengujian logika notifikasi push.

Contoh 1: keranjang belanja

kotlin
class CartTest {
    fun `apply discount when total exceeds threshold`() {
        // Given
        val cart = Cart()
        cart.addItem(Item("Laptop", price = 1000.0))
        cart.addItem(Item("Mouse", price = 50.0))
        val discount = DiscountCalculator(0.1)

        // When
        val total = discount.applyIfEligible(cart)

        // Then
        assertEquals(945.0, total)
        assertTrue("Discount was not applied", total < 1050.0)
    }
}

Contoh 2: notifikasi push dengan coroutine

Contoh kedua mendemonstrasikan Given-When-Then dengan kode asinkron. Di sini Given menetapkan status Firebase Cloud Messaging, When — penerimaan notifikasi push, Then — pemeriksaan pemrosesan.

kotlin
class PushNotificationTest {
    fun `handle push notification when app in background`() = runTest {
        // Given
        val prefs = mockk<SharedPreferences>()
        every { prefs.getString("token", null) } returns "fcm-token-abc"
        val handler = PushHandler(prefs)

        // When
        val data = RemoteMessage().apply {
            putData("type", "order_update")
            putData("order_id", "123")
        }
        val result = handler.handleNotification(data)

        // Then
        assertEquals(NotificationAction.OpenOrder("123"), result)
    }
}

Contoh 3: skenario Gherkin untuk otorisasi

Contoh ketiga — skenario BDD dalam Gherkin, yang menunjukkan Given-When-Then dalam konteks pengujian penerimaan:

gherkin
Feature: User Authorization
  Scenario: User cannot login with expired token
    Given the user has an expired refresh token
    When they try to access the protected profile screen
    Then they should see the login screen
    And the app should clear all cached data

Praktik terbaik penulisan skenario

Penggunaan efektif Given-When-Then memerlukan kepatuhan terhadap beberapa praktik yang telah terbukti. Mereka memastikan keterbacaan, kemudahan pemeliharaan, dan kemampuan otomatisasi skenario.

Satu When per skenario

Aturan ketat: satu skenario — satu tindakan. Jika perlu memeriksa urutan beberapa When, buatlah beberapa skenario, di mana hasil sebelumnya menjadi prasyarat untuk yang berikutnya. Ini membuat skenario atomik dan mudah dipahami.

Hindari data spesifik di Given

Given harus mendeskripsikan esensi, bukan angka spesifik. Alih-alih “Given pengguna Ivanov dengan saldo 500 rubel” — “Given pengguna dengan saldo cukup”. Data spesifik dipindahkan ke Scenario Outline dengan tabel Examples. Ini membuat skenario universal dan dapat digunakan kembali.

  • Tulis Then sebagai pernyataan yang terukur — “pengguna harus melihat layar login”, bukan “pengguna harus diarahkan”
  • Gunakan And untuk langkah serupa — jika diperlukan beberapa Given, gabungkan melalui And, jangan buat Given kedua
  • Jangan campur tingkat abstraksi — Given-When-Then harus berada pada satu level: bisnis atau teknis, bukan campuran
  • Dokumentasikan alasan skenario — komentar di awal file .feature dengan deskripsi aturan bisnis membantu konteks

Given-When-Then dalam pipeline CI/CD

Integrasi skenario Given-When-Then ke dalam pipeline integrasi berkelanjutan mengubahnya dari dokumentasi menjadi perlindungan terhadap regresi. Setiap permintaan merge dalam proyek seluler secara otomatis menjalankan skenario BDD dan memblokir penggabungan jika setidaknya satu skenario gagal.

Menjalankan skenario secara otomatis

Skenario BDD di Cucumber untuk Android dijalankan melalui tugas Gradle ./gradlew cucumber. Untuk iOS (Quick/Nimble) — melalui xcodebuild test. Dalam sistem CI (GitHub Actions, GitLab CI, Bitrise) pengujian BDD dijalankan pada emulator atau perangkat nyata. Laporan dihasilkan dalam format HTML, yang dapat dipahami oleh manajer: skenario hijau — lulus, merah — gagal dengan indikasi langkah.

Dokumentasi hidup di repositori

File .feature disimpan di repositori di samping kode dan menjalani code review. Analis membuat permintaan merge dengan skenario baru sebelum dimulainya pengembangan (BDD-first). Pengembang menulis step definitions dan implementasi agar skenario ini menjadi hijau. Ketika semua skenario lulus — fungsionalitas siap. Pendekatan ini, yang dijelaskan dalam buku Gojko Adzic “Specification by Example” (2011), mengubah persyaratan menjadi artefak yang dapat dieksekusi.

Pertanyaan yang sering diajukan

Apakah Given-When-Then sama dengan Arrange-Act-Assert?

Secara struktur — ya, ini adalah pola tiga bagian yang sama. Perbedaannya terletak pada audiens: Given-When-Then berorientasi pada bahasa bisnis dan digunakan dalam BDD dengan Gherkin, sedangkan Arrange-Act-Assert adalah format teknis untuk pengujian unit. Pilihan tergantung pada konteks dan tim.

Berapa banyak pemeriksaan yang bisa ada di blok Then?

Tidak ada batasan, namun disarankan tidak lebih dari 3–5 pemeriksaan per Then. Jika pemeriksaan lebih banyak, skenario mungkin menguji terlalu banyak dalam satu tindakan. Bagilah menjadi beberapa skenario dengan Then yang berbeda.

Apakah wajib menulis Given-When-Then di Gherkin?

Tidak. Pola dapat digunakan di framework pengujian apa pun, cukup dengan membagi pengujian dengan komentar atau baris kosong menjadi tiga blok. Gherkin hanya diperlukan jika skenario ditulis dalam format file .feature untuk Cucumber atau SpecFlow.

Bagaimana dengan prasyarat yang panjang di Given?

Disarankan untuk memindahkan prasyarat yang berulang ke Background (Gherkin) atau metode @Before (JUnit). Jika prasyaratnya kompleks, gunakan pola Builder untuk membuat data pengujian. Ini menjaga Given tetap pendek dan mudah dibaca.

Bisakah blok When kosong?

Tidak. When adalah blok wajib yang mendeskripsikan tindakan. Jika skenario hanya memeriksa keadaan tanpa tindakan (misalnya, “saat memuat aplikasi, data harus di-cache”), When mendeskripsikan pemicu: “ketika aplikasi dijalankan”.

Ringkasan

  • Given-When-Then — pola tiga bagian untuk deskripsi skenario: prasyarat, tindakan, hasil yang diharapkan
  • Given menetapkan konteks dan keadaan awal, When — tindakan tunggal, Then — pemeriksaan hasil
  • Arrange-Act-Assert dan Given-When-Then — pola yang sama dengan audiens dan tingkat abstraksi yang berbeda
  • Pola diterapkan dalam BDD (Gherkin, Cucumber) dan dalam pengujian unit biasa (JUnit, XCTest) melalui komentar
  • Aturan kunci: satu When per skenario — setiap tindakan harus diuji secara terpisah
  • Prasyarat yang berulang dipindahkan ke Background atau metode @Before untuk mengurangi duplikasi
  • Scenario Outline dengan tabel Examples memungkinkan parametrisasi Given-When-Then dengan kumpulan data berbeda tanpa duplikasi kode

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga