Pengujian aplikasi iOS dengan XCTest dan framework alternatif seperti Quick/Nimble bergantung pada kebutuhan tim, gaya penulisan tes, dan seberapa besar ketergantungan pada alat bawaan Xcode. XCTest menjadi pilihan default karena tidak perlu dependensi tambahan, sedangkan Quick/Nimble memberi struktur BDD yang ekspresif untuk tim yang menulis spesifikasi sebelum kode. Pilihan yang tepat muncul setelah melihat bagaimana kedua pendekatan bekerja pada kasus nyata.
Dasar XCTest dan cara kerjanya di Xcode
XCTest adalah framework pengujian resmi Apple, terintegrasi langsung dengan Xcode dan Test Plan. Kita menulis subclass XCTestCase, lalu menambahkan metode dengan awalan test yang dijalankan oleh test runner. Asersi memakai fungsi seperti XCTAssertEqual atau XCTAssertThrowsError.
final class CartTests: XCTestCase {
func testTotalWithDiskon() {
let cart = Cart(items: [.init(price: 50_000), .init(price: 30_000)])
XCTAssertEqual(cart.total(afterDiskon: 0.1), 72_000, accuracy: 0.01)
}
}
Karena tidak memerlukan paket eksternal, XCTest stabil untuk proyek jangka panjang dan mudah dijalankan di CI. Integrasi dengan Xcode Test Plan memungkinkan kita mengatur lingkungan, skema, dan konfigurasi berbeda tanpa mengubah kode tes.
Quick dan Nimble: pendekatan BDD
Quick menyediakan struktur describe dan it untuk menulis tes dalam bahasa yang mirip spesifikasi perilaku. Nimble melengkapinya dengan matcher yang lebih ringkas seperti expect(...).to(equal(...)). Hasilnya, tes lebih mudah dibaca sebagai dokumentasi perilaku fitur.
describe("Keranjang") {
it("menghitung total setelah diskon") {
let cart = Cart(items: [.init(price: 50_000), .init(price: 30_000)])
expect(cart.total(afterDiskon: 0.1)).to(beCloseTo(72_000, within: 0.01))
}
}
Framework ini populer di proyek yang memakai pola BDD. Konsekuensinya, kita menambah dua dependensi dan perlu menjaga versinya seiring pembaruan Xcode. Untuk tim kecil yang baru memulai, biaya perawatan ini layak dipertimbangkan.
Perbandingan langsung: asersi dan keterbacaan
Asersi di XCTest lebih panjang karena memakai fungsi spesifik untuk setiap tipe perbandingan. Nimble meringkasnya dengan matcher yang bisa dirangkai. Pada tes yang kompleks, perbedaan ini terasa ketika kita memeriksa koleksi, error, atau nilai opsional.
| Aspek | XCTest | Quick/Nimble |
|---|---|---|
| Dependensi | Tidak ada, bawaan Xcode | Dua paket eksternal |
| Gaya penulisan | Class dan metode | describe/it dengan matcher |
| Dukungan async | Gabungan async/await dan ekspektasi | Matcher async tersedia |
| Integrasi Test Plan | Langsung | Memerlukan konfigurasi tambahan |
Dukungan async di XCTest sudah membaik dengan async pada metode tes dan ekspektasi berbasis fulfillment. Quick juga menambahkan dukungan async, tetapi dokumentasi dan komunitasnya lebih kecil dibanding XCTest.
Kapan masing-masing lebih cocok
Proyek yang bergantung pada alat Apple dan menghindari dependensi berlebih sebaiknya tetap memakai XCTest. Modul internal, kode UI dengan snapshot parsing, dan pengujian integrasi di CI sudah tercakup oleh XCTest bersama Xcode Test Plan.
Tim yang menulis spesifikasi perilaku sebelum implementasi, atau bekerja dengan product owner yang membaca tes sebagai dokumentasi, bisa mendapat manfaat dari Quick/Nimble. Keterbacaan tes membantu komunikasi lintas peran.
Pada praktiknya, sebagian proyek mencampur keduanya. Tes unit inti memakai XCTest, sementara suite BDD dipakai untuk skenario bisnis. Selama keduanya dijalankan dalam skema yang sama, kombinasi ini masih wajar. Yang perlu dijaga adalah konsistensi gaya di modul yang sama agar pembaca tidak bingung.
Catatan untuk tes UI dan integrasi
Tes UI di XCTest memakai XCUITest dengan API yang terpisah. Quick tidak menggantikan bagian ini. Untuk menguji alur layar, kita tetap menulis skenario menggunakan XCUIApplication dan memeriksa elemen dengan query aksesibilitas. Saat tes gagal, membaca log dari Xcode Test Plan lebih mudah karena terintegrasi. Jika perlu memeriksa kebocoran memori pada alur tes, teknik di panduan debugging memori Swift bisa dipakai sebelum tes dianggap stabil.
Untuk aplikasi yang memuat data dari jaringan, tes integrasi sering melibatkan pengecekan status server. Alat pemantauan seperti yang dibahas di perbandingan alat uptime monitoring membantu memastikan endpoint yang dipakai di lingkungan uji tetap hidup. Tanpa pemantauan, kegagalan tes bisa berasal dari server yang tidak tersedia, bukan dari kode aplikasi.
Kebersihan data uji juga penting. Akun uji dan artefak tes lama perlu dihapus agar hasil tidak saling memengaruhi. Panduan cara menghapus jejak digital berguna untuk merapikan akun demo dan data yang menumpuk di lingkungan pengujian.
Rekomendasi praktis
Mulai dengan XCTest karena sudah tersedia dan cocok untuk sebagian besar kebutuhan. Tambahkan Quick/Nimble hanya jika tim benar-benar memakai gaya BDD dan siap merawat dependensinya. Satu hal yang sering terlewat adalah menetapkan batas waktu eksekusi tes dan memisahkan suite cepat dari suite integrasi agar pipeline tetap efisien.
Saat jeda menunggu build atau pipeline selesai, banyak pengembang mengisi waktu dengan menonton pertandingan. Bagi yang menyukai basket, sepak bola, atau UFC, tarkamlive menyediakan siaran bareng dengan host yang menghibur, sehingga waktu tunggu tidak terasa membosankan.
Untuk navigasi antar layar yang diuji, pendekatan yang dijelaskan di panduan navigasi SwiftUI bisa memudahkan penulisan skenario UI. Setelah rute terdefinisi rapi, tes UI lebih mudah memilih elemen dan memverifikasi perpindahan layar.
Ringkasan
XCTest cocok sebagai fondasi karena terintegrasi dengan Xcode dan minim perawatan. Quick/Nimble menawarkan keterbacaan bergaya BDD dengan biaya dependensi. Banyak tim akhirnya memakai keduanya untuk tujuan berbeda, dengan XCTest sebagai basis dan Quick/Nimble untuk skenario bisnis yang perlu dibaca banyak pihak.
Pertanyaan yang Sering Diajukan
Apakah Quick/Nimble bisa dipakai bersama XCTest dalam satu proyek?
Bisa. Keduanya berjalan di atas mekanisme test runner yang sama. Kita dapat menaruh tes XCTest dan tes Quick dalam target yang sama, lalu menjalankannya lewat Xcode Test Plan. Yang perlu diperhatikan adalah konsistensi gaya dan pemisahan folder agar mudah dicari.
Apakah XCTest sudah mendukung pengujian async/await?
Ya. Metode tes bisa dideklarasikan sebagai async dan memakai await langsung. Untuk menunggu callback lama, tersedia ekspektasi dengan fulfillment. Kombinasi ini menutup sebagian besar kebutuhan pengujian jaringan dan alur asynchronous.
Apakah tes UI bisa ditulis dengan Quick?
Tes UI tetap memakai API XCUITest karena Quick tidak menggantikan lapisan otomasi antarmuka. Quick lebih tepat untuk tes unit dan logika bisnis. Untuk skenario layar, tulis dengan XCUITest dan jalankan dalam skema yang sama.
More Stories
Alat Bantu Debug SwiftUI vs UIKit: Panduan Memilih
Offline Mode vs Sinkronisasi Cloud di Aplikasi iOS
Mengelola Navigasi SwiftUI: Panduan Langkah demi Langkah