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.

  • 👥 Disebut juga: Pengujian multi-pengguna, karena pemicunya adalah akses simultan, bukan hanya volume yang besar.
  • 🎯 Apa yang menjadi targetnya: Data basis data bersama, modul bersama, dan kode aplikasi bersama yang diakses oleh lebih dari satu sesi.
  • 🔒 Apa yang diukur: Tingkat kebuntuan (deadlock), penguncian, kode berutas tunggal, dan akses terbatas ke sumber daya bersama.
  • 🧭 Cara kerjanya: Identifikasi alur kerja yang rentan terhadap konkurensi, tetapkan target konkurensi, buat skrip untuk tindakan nyata, lalu tingkatkan kemampuan pengguna secara bertahap.
  • 🐞 Kelas cacat: Kondisi persaingan (race condition), kebuntuan (deadlock), pembaruan yang hilang, kerusakan data, dan kelaparan thread.
  • ⚠️ Batasan yang jujur: Ketidakpastian, panggilan balik asinkron, dan tumpukan panggilan yang tidak informatif membuat kegagalan sulit direproduksi.

Apa itu pengujian konkurensi dalam pengujian perangkat lunak dengan banyak pengguna simultan?

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.

Diagram pengujian konkurensi yang menunjukkan beberapa pengguna mengakses sumber daya aplikasi yang sama secara bersamaan.

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.

Pertanyaan Umum Demo Slot

Nomor Uji beban Pengujian ini mengukur perilaku di bawah volume yang diharapkan dari waktu ke waktu. Pengujian konkurensi menargetkan momen yang sama, sehingga cacat dapat muncul hanya dengan dua pengguna jika keduanya mengakses satu catatan yang sama.

Bagian multi-thread dari pengujian thread tumpang tindih dengannya. Pengujian thread menanyakan apakah satu jalur bisnis tetap berfungsi setelah integrasi; pengujian konkurensi menanyakan apa yang dilakukan akses simultan setelah jalur tersebut sudah berfungsi.

Hitung angkanya dari penggunaan puncak yang diamati, bukan dari angka bulat. Mulailah dengan dua sesi untuk membuktikan logikanya bersifat atomik, lalu tingkatkan secara bertahap menuju puncak yang terukur dan margin di atasnya.

Model pembelajaran mesin memberi peringkat modul berdasarkan riwayat cacat sebelumnya dan kompleksitas status bersama, mengarahkan penguji ke alur yang paling mungkin gagal saat terjadi tumpang tindih. Pengelompokan log di seluruh pengujian berulang kemudian mengisolasi interleaving yang mendahului setiap kegagalan.

Kopilot GitHub Membuat draf skrip pengguna virtual, pembatas, dan pembantu pernyataan dengan cepat. Penguji tetap menentukan sumber daya mana yang dibagikan dan apa keadaan akhir yang benar, karena pengujian yang dihasilkan jarang memaksa tumpang tindih yang sebenarnya.

Tingkat isolasi, batas waktu penguncian, ukuran kumpulan koneksi, dan pengindeksan semuanya memengaruhi bagaimana persaingan muncul. Catat semua itu setiap kali Anda menjalankan program, karena hasil yang diperoleh pada satu tingkat isolasi tidak memberikan informasi apa pun tentang tingkat isolasi lainnya.

Ulangi skenario yang sama berkali-kali dari kondisi data yang bersih, simpan log dengan stempel waktu, dan persempit rentang waktu antara dua tindakan yang bersaing. Menggunakan debugger seringkali menyembunyikan kesalahan dengan mengubah waktu kejadian.

Ya, untuk persaingan yang sensitif terhadap volume. Tabel kecil memungkinkan basis data menyimpan semuanya di memori dan mengunci sebentar, sehingga pemblokiran yang muncul di lingkungan produksi tetap tidak terlihat. Sesuaikan jumlah baris dan ukuran indeks sedekat mungkin dengan lingkungan yang memungkinkan.

Ringkaslah postingan ini dengan: