Pipeline CI/CD Saya Berjaya Selama 3 Bulan — Kemudian Saya Membaca Log
Tanda semak hijau memang menyenangkan. Setiap pull request berjaya. Setiap deploy berfungsi.
Kemudian, seorang pengguna melaporkan ciri yang rosak. Ia telah rosak selama berminggu-minggu.
Saya membuka log pipeline. Build kami yang berjaya itu telah menipu kami.
Proses kami kelihatan sempurna:
- Linting
- Unit tests
- Integration tests
- Build
- Deploy
Setiap langkah mempunyai kadar kejayaan 100% selama berbulan-bulan.
Butang eksport tidak melakukan apa-apa apabila diklik. Tiada ralat yang muncul. Saya menjejaki punca masalah kepada perubahan dari 11 minggu yang lalu. Pipeline berjaya. Semakan kod (code review) telah diluluskan. Ciri tersebut sudah rosak dari awal lagi.
Masalahnya bukan pada kod kami. Ia adalah pada kod ujian kami.
Ujian integrasi kami menggunakan mock untuk segalanya. Kami melakukan mock pada keseluruhan perkhidmatan eksport. Ujian tersebut menyemak mock dan bukannya kod sebenar. Mock tersebut sentiasa mengembalikan status berjaya.
Kami terperangkap dalam jerat over-mocking:
- Unit tests: Melakukan mock pada segalanya untuk mengasingkan unit. Ini tidak mengapa.
- Integration tests: Melakukan mock pada segalanya demi kelajuan. Ini adalah satu kesilapan.
- E2E tests: Terlepas aliran khusus ini.
Ujian integrasi kami hanyalah ujian unit yang mahal. Ia mengesahkan bahawa mock kami berfungsi. Ia tidak mengesahkan bahawa kod kami berfungsi.
Saya melakukan tiga perubahan untuk membetulkan perkara ini:
Hadkan mock kepada unit tests sahaja. Integration tests mesti mengakses pangkalan data, API, dan sistem fail yang sebenar. Jika sesuatu ujian itu perlahan, jangan sembunyikannya dengan mock. Gunakan kelajuan tersebut sebagai isyarat untuk melakukan pengoptimuman.
Tambah contract tests. Ini memastikan mock anda sepadan dengan tingkah laku perkhidmatan sebenar. Jika mock mengembalikan data yang tidak akan diberikan oleh perkhidmatan sebenar, contract test akan gagal.
Jejaki liputan (coverage) sebenar. Kami berhenti melihat kadar kejayaan yang ringkas. Kami melihat apa yang sebenarnya diuji oleh ujian tersebut. Angka liputan kami jatuh dari 94% kepada 67%. Ini adalah metrik yang paling jujur yang kami miliki.
Pipeline yang hijau tidak bermakna kod anda berfungsi. Ia bermakna ujian anda berjaya. Kedua-duanya adalah perkara yang berbeza.
Pepijat (bug) yang paling berbahaya adalah pepijat yang dikatakan "baik-baik sahaja" oleh pipeline anda.
Tanya diri anda soalan-soalan ini:
- Adakah ujian saya menangkap pepijat atau sekadar mengesahkan mock?
- Adakah integration tests saya benar-benar melakukan integrasi?
- Jika saya membuang semua mock, berapa banyak ujian yang masih berjaya?
- Adakah saya mengukur liputan (coverage) atau keyakinan (confidence)?
Pipeline yang tidak pernah gagal bukanlah sesuatu yang boleh dipercayai. Ia tidak diuji.
Sumber: https://dev.to/kollittle/my-cicd-pipeline-passed-for-3-months-then-i-read-the-logs-4mbj
