Apa itu Pengujian Konkurensi dalam Pengujian Perangkat Lunak?
⚡ Ringkasan Cerdas
Pengujian konkurensi mendeteksi cacat yang hanya muncul ketika beberapa pengguna bertindak pada aplikasi yang sama pada saat yang bersamaan, mengungkap kebuntuan, pembaruan yang hilang, dan masalah penguncian yang tidak pernah terungkap oleh pemeriksaan fungsional berurutan.
Apa itu Pengujian Konkurensi?
Pengujian konkurensi adalah teknik pengujian yang digunakan untuk mendeteksi cacat pada aplikasi ketika banyak pengguna masuk. Dengan kata lain, teknik ini memantau efek yang terjadi ketika banyak pengguna melakukan tindakan yang sama secara bersamaan.
Pengujian konkurensi juga disebut sebagai pengujian multi-penggunaMenguji program konkuren lebih menantang daripada menguji program sekuensial, karena adanya nondeterminisme dan masalah sinkronisasi: pengujian yang sama dapat berhasil pada satu kali eksekusi dan gagal pada eksekusi berikutnya tanpa perubahan satu baris kode pun.
Diagram di bawah ini mengilustrasikan idenya — beberapa pengguna mengakses sumber daya aplikasi yang sama pada saat yang bersamaan, dan pengujian mengamati apa yang dilakukan aplikasi dengan data yang tumpang tindih tersebut.
Mengapa Pengujian Konkurensi
Dua pertanyaan membenarkan upaya tersebut, dan keduanya tidak terlihat dalam pengujian fungsional oleh pengguna tunggal.
- Ini mengidentifikasi efek dari mengakses catatan basis data, modul, atau kode aplikasi yang sama secara bersamaan.
- Ini mengidentifikasi dan mengukur tingkat kebuntuan (deadlock), penguncian (locking), penggunaan kode berutas tunggal (single-threaded code), dan akses terbatas ke sumber daya bersama.
Suatu fitur bisa berfungsi dengan benar untuk satu pengguna tetapi tetap kehilangan data untuk pengguna kedua yang datang sepersekian detik kemudian, itulah sebabnya teknik ini digunakan bersamaan dengan... pengujian kinerja alih-alih di dalam pengujian fungsional.
Cara Melakukan Pengujian Konkurensi
Pengujian konkurensi mengikuti urutan yang dapat diulang. Langkah-langkah di bawah ini bergerak dari cakupanping untuk resolusi.
- Langkah 1) Identifikasi alur yang rentan terhadap konkurensi. Cari status bersama: login simultan, reservasi kursi atau saham, pembaruan saldo, pekerjaan batch yang menulis ke tabel yang sama, dan komponen single-threaded apa pun dalam jalur tersebut.
- Langkah 2) Tetapkan target konkurensi. Tentukan berapa banyak pengguna yang harus bertindak pada saat yang bersamaan, berdasarkan puncak penggunaan sebenarnya dan bukan angka bulat.
- Langkah 3) Merancang kasus uji. Masing-masing Kasus cobaan Menghubungkan sumber daya bersama, tindakan yang bersaing, dan keadaan akhir yang diharapkan — misalnya, dua sesi penarikan dari satu akun tidak boleh keduanya berhasil.
- Langkah 4) Buat skrip dan pilih alatnya. Diperlukan generator beban yang dapat menghasilkan pengguna virtual yang dapat dikonfigurasi; JMeter adalah pilihan open-source yang umum, dan pengaturan thread-group-nya dipetakan langsung ke skenario konkurensi.
- Langkah 5) Ramp secara bertahap. Tingkatkan jumlah pengguna bersamaan secara bertahap, bukan secara tiba-tiba.ping menuju target, sehingga level di mana pertentangan dimulai terlihat jelas.
- Langkah 6) Pantau dan analisis. Perhatikan penundaan penguncian, penyebaran waktu respons, tingkat kesalahan, dan pemblokiran basis data secara bersamaan — cacat konkurensi sering kali muncul sebagai anomali waktu sebelum muncul sebagai kesalahan.
- Langkah 7) Atasi dan jalankan kembali. Perbaiki penyebab sinkronisasi, pengindeksan, atau penguncian, lalu ulangi proses yang sama untuk memastikan perilaku tersebut berubah, bukan hanya bergeser.
Cacat Konkurensi Umum
Cacat konkurensi terbagi menjadi sejumlah kecil kelas yang mudah dikenali, dan penamaan kelas yang tepat biasanya langsung mengarah pada perbaikannya.
| Cacat | Apa yang terjadi | Gejala khas |
| Kondisi balapan | Hasilnya bergantung pada sesi mana yang selesai lebih dulu. | Jumlah total yang benar pada beberapa percobaan, salah pada percobaan lainnya. |
| jalan buntu | Dua sesi masing-masing memegang satu kunci yang dibutuhkan sesi lainnya. | Transaksi macet alih-alih mengembalikan kesalahan. |
| Pembaruan hilang | Penulisan kedua menimpa penulisan pertama tanpa membacanya. | Perubahan yang disimpan akan hilang tanpa pemberitahuan. |
| Korupsi data | Struktur bersama hanya ditulis sebagian. | Catatan dalam keadaan tidak memungkinkan transaksi valid apa pun untuk dibuat. |
| Kelaparan | Satu sesi tidak pernah mendapatkan sumber daya yang ditunggunya. | Satu jalur pengguna mengalami batas waktu (timeout) meskipun sistem tampak sehat. |
Karena kegagalan ini bersifat sementara, setiap proses perlu dicatat log dan stempel waktunya; jika tidak, cacat tersebut tidak dapat dilaporkan secara kredibel melalui proses manajemen cacat.
Contoh Pengujian Konkurensi
Bayangkan sebuah toko online yang menyimpan unit terakhir suatu produk. Dua pembeli membuka barang tersebut pada detik yang bersamaan dan keduanya menekan tombol Beli.
- Skenario: Dua sesi membaca stok = 1, keduanya lolos pengecekan ketersediaan, dan keduanya menulis stok = 0.
- Hasil yang diharapkan: Satu pesanan dikonfirmasi, pesanan lainnya menerima pesan kehabisan stok, dan stok tidak pernah menjadi negatif.
- Indikator kerusakan: Kedua pesanan dikonfirmasi, atau stok berakhir di -1, yang menunjukkan bahwa pengecekan ketersediaan dan pengurangan tidak dieksekusi sebagai satu langkah atomik.
- Variasi yang layak dicoba: Dua sesi yang sama mengedit satu catatan profil, dua persetujuan atas permintaan yang sama, dan sebuah pekerjaan batch memperbarui tabel saat pengguna menyimpan.
Pola yang sama berlaku secara umum: temukan satu sumber, dua penulis, dan tidak ada jaminan urutan. Menjalankan skenario selama pengujian sistem, sebelum beban ditambahkan, menjaga diagnosis tetap bersih.
Keunggulan Pengujian Konkurensi
- Hal ini secara relatif mengurangi jumlah upaya yang dibutuhkan untuk menguji sebuah aplikasi dengan membatasi ruang lingkup interaksi bersamaan pada beberapa komponen yang banyak digunakan dan telah diuji dengan baik.
- Enkapsulasi memungkinkan perilaku sebagian dari suatu program untuk dianalisis tanpa meninjau seluruh basis kode.
- Hal ini membantu meningkatkan keandalan dan kekokohan program yang berjalan secara bersamaan.
- Hal ini mengungkap batasan penguncian dan pemblokiran sejak dini, sehingga keputusan kapasitas didasarkan pada persaingan yang terukur, bukan pada perkiraan.
Kekurangan Pengujian Konkurensi
Kekurangan-kekurangan di bawah ini biasanya ditemui oleh penguji saat melakukan pengujian konkurensi.
- Aplikasi tersebut perlu diuji pada berbagai platform.
- Skenario konkurensi memerlukan pengujian yang lebih intensif daripada skenario sekuensial.
- Fungsi tidak langsung mengembalikan hasilnya kepada pemanggil; sebaliknya, hasilnya dapat dikirimkan kemudian melalui notifikasi, blok, fungsi callback, atau mekanisme serupa, yang membuat pengujian menjadi lebih sulit.
- Alur informasi atau program tidak tercermin dalam tumpukan panggilan.
- Jumlah jalur eksekusi dalam sistem bisa sangat besar, karena proses-proses dalam sistem konkuren berinteraksi satu sama lain saat sedang dieksekusi.
- Program konkuren memiliki rasio kegagalan yang lebih tinggi daripada program sekuensial.
- Mendebug program konkuren itu sulit, karena memasang debugger mengubah waktu yang menyebabkan kegagalan.

