Testing, Debugging, dan Kualitas Kode · 4/7
Unit, integration, dan end-to-end
Berapa biaya masing-masing, apa yang ditangkap masing-masing, dan berapa banyak yang sebenarnya kamu perlukan.
Baca 25 menit
Setelah pelajaran ini kamu bisa
- Membedakan test unit, integration, dan end-to-end
- Menjelaskan pertukaran yang dibuat masing-masingnya
- Menentukan berapa banyak yang kamu inginkan dari masing-masingnya
- Menjelaskan biaya sebuah test yang flaky
| Unit | Integration | End-to-end | |
|---|---|---|---|
| Menguji | Satu function atau component | Beberapa bagian bersamaan | Seluruh aplikasi di browser |
| Kecepatan | Milidetik | Puluhan ms sampai detik | Detik sampai menit |
| Menangkap | Kesalahan logika | Kesalahan perakitan | Apa pun, termasuk konfigurasi deploy |
| Melewatkan | Semua soal perakitan | Perilaku browser sungguhan | Tidak ada — tapi lambat |
| Saat gagal | Kamu tahu persis di mana | Kira-kira di mana | Di suatu tempat di aplikasinya |
| Alat | vitest | vitest | Playwright, Cypress |
Saran klasiknya adalah sebuah piramida: banyak unit test yang cepat, lebih sedikit integration test, dan segelintir test end-to-end. Alasannya hitungan, bukan ideologi.
Hitungan di balik piramidanya. Bandingkan total waktu jalan dan apa yang ditangkap masing-masing komposisi.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Test yang flaky
Test flaky kadang lolos dan kadang gagal tanpa perubahan kode. Ia lebih buruk daripada test yang tidak ada, karena ia menghancurkan otoritas suite-nya: begitu orang menjalankan ulang CI supaya jadi hijau, kegagalan sungguhan pun ikut dijalankan ulang.
| Penyebab | Perbaikan |
|---|---|
| Menunggu jumlah ms yang tetap | Tunggu sebuah kondisi — await screen.findByRole(...) |
| Test berbagi state | Reset di antara test; proyek ini membersihkan tabelnya di beforeEach |
| Bergantung pada urutan test | Setiap test harus menyiapkan sendiri semua yang dibutuhkannya |
Tanggal sungguhan dan Math.random() | Suntikkan nilainya, atau bekukan waktunya |
| Panggilan jaringan sungguhan | Stub — internet bukan fixture test-mu |
| Perbedaan zona waktu atau locale | Tetapkan keduanya; jalankan CI dengan TZ berbeda untuk menangkapnya |
Tugas praktik
Jalankan bun run test dan catat total waktunya. Lalu jalankan bun run test curriculum dan bandingkan. Sekarang sengaja buat sebuah test bergantung pada urutan: di progress.node.test.ts, pindahkan satu test ke atas beforeAll yang membuat user-nya lalu lihat ia gagal. Kegagalan itulah bentuk dari ketergantungan urutan.
Hasil yang diharapkan
Seluruh suite dalam beberapa detik; kegagalan yang jelas saat setup-nya dilewati.