Tes Tidak Bermasalah: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan
Tes yang gagal secara acak mengajarkan tim Anda untuk mengabaikan kegagalan. Pelajari cara memastikan tes tidak stabil, melacak penyebab sebenarnya, dan memperbaikinya, dengan demo yang menunjukkan apa yang benar-benar berhasil.
- tes tidak stabil lolos dan gagal pada kode yang sama, tanpa perubahan.
- Penyebab umum adalah waktu, status bersama, data tidak stabil, layanan eksternal, dan perbedaan lingkungan.
- Ganti tidur tetap dengan menunggu kondisi tertentu, dan berikan setiap pengujian datanya sendiri.
- Percobaan ulang dapat menyembunyikan bug yang sebenarnya. Karantina tes yang tidak stabil, perbaiki dalam tenggat waktu, atau hapus tes tersebut.
Build menjadi merah, seseorang mengklik “jalankan kembali”, build lolos, dan semua orang melanjutkan. Tampaknya tidak berbahaya, namun pengujian yang tidak stabil secara perlahan menghancurkan hal paling berharga yang dimiliki rangkaian pengujian: kepercayaan masyarakat terhadapnya. Ketika kegagalan biasanya berupa gangguan, bug yang sebenarnya juga bisa diatasi.
Panduan ini membahas mengapa pengujian menjadi tidak stabil dan cara memperbaiki setiap penyebabnya dengan benar. Kami menjalankan demo pengaturan waktu dan status bersama dengan Python 3.13, dan angka yang ditampilkan berasal dari proses tersebut. Itu adalah demonstrasi kecil yang dirancang untuk membuat kelemahan mudah dilihat, sehingga tingkat kegagalan Anda akan berbeda.
Apa itu tes yang tidak stabil?
Tes yang tidak stabil memberikan hasil yang berbeda pada kode yang sama. Ini lolos pada satu proses dan gagal pada proses berikutnya, meskipun tidak ada perubahan pada produk. Tesnya mungkin salah, atau kodenya mungkin mengandung bug yang terputus-putus. Kemungkinan kedua itulah yang menjadi alasan mengapa Anda tidak boleh mengabaikannya begitu saja.
Mengapa tes yang tidak stabil sangat mahal
- Kehilangan kepercayaan. Begitu orang menganggap warna merah berarti “mungkin tidak stabil”, mereka berhenti menyelidiki kegagalan sebenarnya.
- Waktu yang terbuang. Pengembang menghabiskan waktu berjam-jam untuk menjalankan kembali pipeline dan memeriksa kegagalan yang tidak ada hubungannya dengan perubahannya.
- Penayangan lebih lambat. Penggabungan dan pelepasan menunggu tayangan ulang, sehingga melemahkan tujuan CI/CD.
- Bug tersembunyi. Kondisi balapan pada produk dapat terlihat seperti kebisingan pengujian, dan hal tersebut merupakan hal yang merugikan dalam produksi.
Sekilas tentang penyebab umum
| Sebab | Tanda khas | Perbaikan biasa |
|---|---|---|
| Pengaturan waktu dan asinkron | Gagal lebih banyak ketika CI sedang sibuk | Tunggu suatu kondisi |
| Keadaan bersama | Gagal tergantung pada urutan pengujian | Isolasi data, setel ulang status |
| Tanggal dan keacakan | Gagal pada waktu atau hari tertentu | Kontrol jam dan benih |
| Penyeleksi yang rapuh | Gagal setelah perubahan UI | Gunakan pencari lokasi yang stabil |
| Layanan eksternal | Gagal ketika ketergantungan lambat | Mengejek atau mematikannya |
| Perbedaan lingkungan | Lulus secara lokal, gagal di CI | Sejajarkan dengan wadah |
| Batasan sumber daya | Gagal dalam proses paralel | Tune pekerja, perbaiki perselisihan |
Penyebab 1: Pengaturan waktu dan tidur yang tetap
Ini adalah penyebab paling umum. Sebuah tes mengasumsikan bahwa pekerjaan latar belakang akan selesai setelah penundaan yang tetap. Untuk melihat efeknya, kami menulis pengujian kecil yang pengerjaannya memerlukan waktu hingga 2 ms, sedangkan pengujian hanya menunggu 1 ms sebelum memeriksa:
def flaky_timing():
result = {}
def work():
time.sleep(random.uniform(0, 0.002))
result["done"] = True
threading.Thread(target=work).start()
time.sleep(0.001) # hope it has finished
assert result.get("done")
Cara mengatasinya adalah menunggu kondisi sebenarnya, dengan batas atas yang besar:
def fixed_timing():
result = threading.Event()
def work():
time.sleep(random.uniform(0, 0.002))
result.set()
threading.Thread(target=work).start()
assert result.wait(timeout=1) # continues as soon as it is ready
Kami menjalankan setiap versi 200 kali:
| Versi | Kegagalan dari 200 |
|---|---|
| Memperbaiki tidur | 102 |
| Tunggu suatu kondisi | 0 |
Hasilnya lebih dari sekedar keandalan. Versi tetap berpindah pada saat pekerjaan selesai, jadi biasanya lebih cepat juga. Tidur yang lebih lama akan membuat versi pertama lebih jarang gagal, namun setiap proses akan menjadi lebih lambat, dan masih bisa gagal pada mesin CI yang sibuk.
Prinsip yang sama berlaku dalam pengujian browser. Gunakan menunggu otomatis Penulis drama, atau Selenium menunggu secara eksplisit, alih-alih time.sleep:
# Playwright: retries until true or a timeout is reached
expect(page.get_by_text("Order placed")).to_be_visible()
# Selenium: an explicit wait for a condition
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "confirmation"))
)
Penyebab 2: Status bersama dan urutan pengujian
Saat pengujian berbagi data, pengujian yang satu dapat memengaruhi pengujian lainnya, dan hasilnya bergantung pada urutan pengujian tersebut. Kedua pengujian ini menggunakan satu daftar bersama:
store = []
def test_add():
store.append("x")
assert len(store) == 1
def test_empty():
assert store == []
| Memesan | test_add | test_empty |
|---|---|---|
| kosong, lalu tambahkan | Lulus | Lulus |
| tambahkan, lalu kosongkan | Lulus | Gagal |
Proses kami mengkonfirmasi hal ini, dan itulah sebabnya sebuah suite dapat memakan waktu berbulan-bulan dan kemudian rusak ketika seseorang menambahkan proses paralel atau plugin pemesanan acak. Obatnya adalah isolasi:
- Berikan setiap pengujian data baru, menggunakan perlengkapan yang mengatur dan membersihkannya. tutorial pytest kami menunjukkan caranya.
- Buat catatan unik, seperti email dengan akhiran acak, sebagai pengganti “pengguna uji” bersama.
- Bungkus pengujian basis data dalam transaksi dan kembalikan, jika pengaturan Anda mengizinkannya.
- Jalankan pengujian secara acak secara teratur, sehingga masalah ini muncul lebih awal.
Penyebab 3: Tanggal, zona waktu, dan keacakan
Ujian yang dilakukan sepanjang minggu bisa gagal pada hari Sabtu, tengah malam, atau hari terakhir setiap bulan. Jadikan waktu sebagai masukan, daripada membaca jam di dalam logika Anda:
def is_weekend(today=None):
today = today or datetime.date.today()
return today.weekday() >= 5
is_weekend(datetime.date(2026, 11, 7)) # True (a Saturday)
is_weekend(datetime.date(2026, 11, 9)) # False (a Monday)
Tes-tes tersebut memberikan jawaban yang sama setiap hari. Demikian pula, tetapkan benih tetap untuk nilai acak dalam pengujian, dan catat benih tersebut saat Anda menggunakan data acak sehingga Anda dapat mereproduksi kegagalan. Jangan berasumsi urutan tertentu dari kumpulan, kamus dari sumber eksternal, atau kueri basis data tanpa ORDER BY.
Penyebab 4: Selector rapuh
Pengujian yang menemukan tombol dengan div:nth-child(3) > span rusak karena perubahan tata letak apa pun, dan mungkin gagal hanya untuk ukuran atau varian layar tertentu. Lebih memilih pencari lokasi berdasarkan apa yang dilihat pengguna, atau atribut pengujian khusus. Panduan kami untuk Pencari penulis naskah menjelaskan urutan untuk mencobanya. Animasi adalah sumber masalah lain yang sering terjadi, jadi pertimbangkan untuk menonaktifkannya di lingkungan pengujian.
Penyebab 5: Layanan dan jaringan eksternal
Jika pengujian memanggil penyedia pembayaran sebenarnya atau API pihak ketiga, maka hasilnya bergantung pada waktu aktif dan batas tarif orang lain. Tirukan panggilan tersebut untuk sebagian besar pengujian, dan simpan sejumlah kecil pemeriksaan kontrak terpisah terhadap layanan sebenarnya, sehingga Anda tetap mengetahui jika ada perubahan. Panduan kami untuk pengujian unit vs integrasi menjelaskan cara membaginya.
Kiat: “Lulus secara lokal, gagal di CI” biasanya berarti perbedaan dalam kecepatan, zona waktu, sumber daya, atau versi. Menjalankan pengujian pada image container yang sama secara lokal dan di CI akan menghapus banyak di antaranya. Tutorial Docker Compose kami dapat membantu.
Cara mendiagnosis tes yang tidak stabil
- Konfirmasi. Jalankan pengujian berkali-kali tanpa perubahan. Dengan pytest, loop shell sederhana berfungsi, dan plugin seperti
pytest-repeatmemberi Anda--count=100. - Rekam bukti. Simpan log, tangkapan layar, dan jejak untuk setiap kegagalan. Penampil jejak penulis naskah sangat berguna di sini.
- Tekankan kondisinya. Jalankan dengan CPU terbatas, secara paralel atau acak. Membuatnya lebih sering gagal membuatnya lebih mudah untuk dipelajari.
- Uji sendiri. Jika selalu lolos sendiri tetapi gagal di suite, curigai status bersama.
- Cari polanya. Periksa mesin mana, waktu, dan pengujian di sekitar yang terlibat.
- Periksa produknya. Tanyakan dengan jujur apakah ini bisa menjadi kondisi balapan nyata dalam aplikasi Anda.
Apakah percobaan ulang otomatis merupakan perbaikan?
Percobaan ulang adalah jaring pengaman jangka pendek yang bermanfaat, dan bukan merupakan obat. Percobaan ulang otomatis tunggal di CI dapat membuat pekerjaan tetap berjalan saat Anda menyelidikinya, namun pengujian yang memerlukan percobaan ulang agar dapat lulus tetap memberi tahu Anda sesuatu. Lebih buruk lagi, bug produk yang terputus-putus dan gagal 20% biasanya akan melalui percobaan ulang tanpa diketahui.
Gunakan percobaan ulang dengan aturan berikut: batasi menjadi satu atau dua, catat setiap tes yang memerlukannya, dan perlakukan daftar itu sebagai daftar tugas Anda. Tes yang dilaporkan sebagai “lulus pada percobaan ulang” harus dianggap sebagai masalah yang perlu diselidiki, bukan keberhasilan.
Proses tim untuk pengujian yang tidak stabil
- Ukur. Lacak pengujian mana yang gagal, lalu teruskan penerapan yang sama. Banyak alat CI dan reporter pengujian yang dapat menunjukkan hal ini.
- Karantina. Pindahkan pengujian tidak stabil yang telah dikonfirmasi keluar dari proses pemblokiran, sehingga tidak lagi mengganggu semua orang, namun tetap menjalankannya dan melacaknya.
- Tetapkan pemilik dan tenggat waktu. Karantina tanpa tenggat waktu hanya akan menjadi kuburan.
- Perbaiki atau hapus. Jika suatu tes tidak layak untuk diperbaiki, hapus tes tersebut, dan periksa apakah cakupannya masih ada di tempat lain.
- Mencegah. Jalankan pengujian baru beberapa kali sebelum digabungkan. Sebuah tes yang gagal sekali dalam lima puluh kali percobaan lebih baik dilakukan sekarang daripada dalam enam bulan.
Perlakukan pengujian yang tidak stabil sebagai bug dengan prioritas, dan bukan sebagai kebisingan latar belakang. Tingkat keparahan dan prioritas juga berlaku di sini, seperti yang dibahas dalam tingkat keparahan vs prioritas. Jika kelemahan tersebar luas, baca tentang kesalahan otomatisasi pengujian yang lebih luas, dan pertimbangkan apakah Anda melakukan terlalu banyak pengujian di tingkat browser.
Penutup
Tes yang tidak stabil terasa acak, tetapi jarang terjadi. Hampir setiap orang memiliki asumsi tentang waktu, keteraturan, data, atau lingkungan yang tidak selalu benar. Pilih pengujian yang paling sering gagal dalam proses Anda minggu ini. Jalankan lima puluh kali, temukan asumsinya, dan perbaiki selamanya. Satu perbaikan nyata mengajarkan sebuah tim lebih dari seratus tayangan ulang yang pernah ada.
Pertanyaan yang sering diajukan
Apa itu tes yang tidak stabil?
Tes yang tidak stabil lolos pada beberapa proses dan gagal pada proses lainnya tanpa perubahan apa pun pada kode. Penyebabnya mungkin pada pengujian, lingkungan, atau produk.
Apa yang menyebabkan tes tidak stabil?
Penyebab paling umum adalah asumsi waktu, status bersama antar pengujian, penyeleksi tidak stabil, layanan eksternal, penanganan tanggal, dan perbedaan antara CI dan mesin lokal.
Haruskah saya menghapus pengujian yang tidak stabil?
Pertama-tama cobalah untuk memperbaikinya. Jika suatu tes bernilai rendah dan mahal untuk diperbaiki, menghapusnya tidak masalah, namun pastikan cakupan pentingnya ada di tempat lain.
Haruskah saya mencoba ulang pengujian yang gagal secara otomatis?
Sebagai jaring pengaman terbatas, ya, tapi catat setiap percobaan ulang dan selidiki. Percobaan ulang saja menyembunyikan masalah dan dapat membiarkan bug nyata yang terputus-putus mencapai produksi.
Bagaimana cara menemukan tes yang tidak stabil?
Cari pengujian yang gagal dan meneruskan penerapan yang sama, menggunakan riwayat CI Anda atau alat pelaporan. Anda juga dapat menjalankan pengujian yang mencurigakan berkali-kali dalam satu lingkaran.
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengujian perangkat lunakUser Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata
Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…
Baca artikel →Basis data & SQLPenjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari
Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …
Baca artikel →Basis data & SQLPernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum
SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …
Baca artikel →Pengembangan perangkat lunakApa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja
Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …
Baca artikel →Pengembangan perangkat lunakPenjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh
Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…
Baca artikel →Pengembangan perangkat lunakGenerator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata
Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…
Baca artikel →Kecerdasan buatanApa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana
Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…
Baca artikel →DevOpsPenerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih
Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…
Baca artikel →Otomatisasi pengujianTes Tidak Stabil: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan
Pengujian yang tidak stabil dijelaskan dengan demo yang kami jalankan: penyebab utama, cara mengonfirmasi dan mendiagnosisnya, perbaikan waktu yang …
Baca artikel →Pengujian perangkat lunakLoad Testing vs Stress Testing: Perbedaan, Metrik dan Contoh k6
Penjelasan pengujian beban vs pengujian stres: apa yang dibuktikan masing-masing, pengujian lonjakan dan rendam, metrik yang penting, mengapa rata-r…
Baca artikel →Pengujian perangkat lunakKasus Uji vs Skenario Uji: Perbedaan Utama, Contoh, dan Kapan Menggunakan Masing-masing
Penjelasan kasus uji vs skenario pengujian: definisi yang jelas, tabel berdampingan, satu fitur pengaturan ulang kata sandi yang diambil dari skenar…
Baca artikel →Basis data & SQLOptimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu
Pengoptimalan kueri SQL diuji pada sejuta baris: membaca rencana eksekusi, menambahkan indeks yang tepat, memperbaiki filter yang tidak dapat disarg…
Baca artikel →Basis data & SQLSQL UNION vs UNION ALL: Perbedaan, Contoh dan Kinerja Diuji
SQL UNION vs UNION ALL dijelaskan dengan kueri yang kami jalankan: duplikat, aturan yang diikuti keduanya, bug data nyata, kinerja terukur, INTERSEC…
Baca artikel →Pengembangan perangkat lunakTutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu
Tutorial JavaScript Fetch API diuji pada server lokal: GET dan POST, mengapa 404 tidak muncul, bantuan yang dapat digunakan kembali, string kueri, b…
Baca artikel →Pengembangan perangkat lunakPenanganan File Python: Baca, Tulis, CSV, JSON dan pathlib Dengan Contoh
Penanganan file Python dijelaskan dengan kode yang kami jalankan: mode terbuka, dengan, membaca file besar, CSV, JSON, pathlib, file biner, penulisa…
Baca artikel →Pengembangan perangkat lunakKelas dan Objek Python: Tutorial OOP Dengan Contoh Nyata
Kelas dan objek Python dijelaskan dengan kode yang kami jalankan: __init__, metode, atribut kelas vs instance, warisan, properti, metode dunder, kel…
Baca artikel →Kecerdasan buatanApa Itu Model Bahasa Besar? Bagaimana LLM Bekerja, Dijelaskan Tanpa Hype
Apa yang dimaksud dengan model bahasa besar? LLM dijelaskan dalam bahasa sederhana: token, penyematan, perhatian, pelatihan, jendela suhu dan kontek…
Baca artikel →DevOpsPerintah Linux untuk Pemula: Panduan Terminal Penting Dengan Contoh
Perintah Linux untuk pemula, dikelompokkan berdasarkan tugas: navigasi, file, melihat log, grep, pipa, izin, proses dan arsip, dengan contoh analisi…
Baca artikel →Otomatisasi pengujianSelenium vs Penulis Drama: Perbedaan Utama, Perbandingan Kode, dan Mana yang Harus Dipilih
Selenium vs Playwright dibandingkan: arsitektur, menunggu, dukungan browser dan bahasa, debugging, pengujian yang sama di kedua alat, saran migrasi …
Baca artikel →Pengujian perangkat lunakPartisi Ekivalensi: Teknik Desain Tes Dijelaskan Dengan Contoh yang Dikerjakan
Penjelasan partisi ekivalensi: cara menemukan partisi yang valid dan tidak valid, contoh yang berfungsi untuk usia, kata sandi dan kupon, pengujian …
Baca artikel →Pengujian perangkat lunakSeverity vs Priority dalam Pengujian Perangkat Lunak: Perbedaan, Matriks dan Contoh Nyata
Keparahan vs prioritas dalam pengujian perangkat lunak dijelaskan: definisi yang jelas, matriks empat arah dengan contoh, skala level, siapa yang me…
Baca artikel →Basis data & SQLTutorial Subkueri SQL: Jenis, Subkueri yang Berkorelasi, dan ADA Dengan Contoh
Tutorial subkueri SQL dengan kueri yang kami jalankan: subkueri skalar, IN, FROM dan SELECT, subkueri yang berkorelasi, EXISTS, jebakan NOT IN NULL …
Baca artikel →Basis data & SQLPenjelasan Transaksi SQL dan ACID: COMMIT, ROLLBACK dan Tingkat Isolasi
Transaksi SQL dan ACID dijelaskan dengan transfer bank yang kami jalankan: COMMIT, ROLLBACK, savepoint, kunci, tingkat isolasi, pembacaan kotor, keb…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →