Percepat tes, kata mereka.
Dan sekarang, hampir setengah tahun telah berlalu, ketika kami menulis ulang tes fungsional lama yang tidak terpotong, tidak stabil, dan beralih ke tes independen komponen yang cepat. Karena itu, saatnya berbagi :)
Bagi mereka yang tidak tahu,
tes komponen adalah tes yang sepenuhnya terisolasi dari lingkungan global dan memungkinkan Anda menguji kasus-kasus tertentu yang tidak dapat dicakup oleh tes unit.
Enam bulan yang lalu, pelepasan fitur yang digunakan untuk mengambil lebih dari satu jam, mengingat bahwa kode tersebut telah sepenuhnya diuji untuk waktu yang lama, tetapi cabang master tidak dapat mencapai bangunan hijau di bambu, dan kemudian muncul pertanyaan: bagaimana hidup?
Memang, dalam hal ini, tes kerusakan lebih dari baik, tetapi menyingkirkannya dan “mencetak” skor untuk tes jauh dari pilihan terbaik :) Kemudian, tim mikro kecil diorganisir oleh ketua tim:
- Timlida
- Pengembang Backend
- Insinyur QA
- Admin
Setelah bekerja sama dengan cepat, kami membagi tugas kami dan salah satunya adalah mengatur lingkungan untuk menulis tes komponen. Dan perjalanan saya dimulai.
Pada awal pengembangan, kami memiliki 140+ tes fungsional yang dijalankan di beberapa utas di lingkungan yang berbeda (Frontend, Mobile, Backend) dan mereka membutuhkan waktu ~ 5-7 menit; juga sering harus me-restart mereka untuk mencapai bangunan hijau. Dan tes ini tidak lagi jatuh karena kode tertulis yang baru, tetapi karena masalah di lingkungan, yaitu, di suatu tempat API tidak merespon, di suatu tempat turunnya layanan microservice, dll. Ini menghentikan pekerjaan seluruh departemen, karena majelis dimulai hampir setiap 5-10 menit: seseorang berkumpul kembali, seseorang mendorong kode baru ...
Setelah paruh pertama minggu itu, kami sampai pada kesimpulan bahwa kami akan "membasahi" API dan layanan pihak ketiga kami, yang akan memberi kami lingkungan pengujian yang sepenuhnya terisolasi. Tetapi muncul pertanyaan: untuk menulis sesuatu sendiri atau ... Jadi, ini "atau" semuanya berakhir - dengan pencarian singkat, dalam perjalanan saya bertemu - waktu operasi kecil dalam bentuk server Mock "http-api-mock".
http-api-mock adalah server mock yang ringan dan bebas instalasi yang ditulis dalam Go dengan dokumentasi yang baik.
Setelah ratusan upaya untuk meluncurkan, serta secara umum mempelajari subjek mok, saya masih berhasil menulis ulang 1 tes fungsional, yang membuat iklan baru di situs dan, setelah melewati semua lingkaran neraka, yakin bahwa judul pada halaman sesuai dengan judul di badan objek.
Bayangkan didapat! Tes yang ditulis ulang ternyata 3 kali lebih cepat dari yang sebelumnya, karena di sini kami tidak memeriksa kreasi, moderasi, tetapi segera mengembalikan objek iklan yang diinginkan dari Mock dan memenangkannya. Kemenangan kecil ini menjadi insentif yang baik untuk pengembangan lebih lanjut dari topik ini, sehingga, setelah seminggu lagi, kami memiliki paket baru dalam codeception yang disebut "komponen", yang sudah memiliki kelas pembantu dasar untuk bekerja dengan server Mock kami dan diluncurkan pada waktu itu saya di kotak pasir.
Kelas pembantu dasar dapat membuat iklan dalam bentuk file json di direktori config server tiruan kami, memberikan iklan yang diinginkan oleh id, dll. Hampir seperti API.
Sisa dari sihir itu menunggu kita lebih jauh - sekarang tinggal mengatur rencana perakitan dalam bambu. Sehingga tes kami sekarang melalui CI&CD kami.
Admin membantu kami dengan ini - dengan pengaturan meluncurkan semua tes ini di buruh pelabuhan, yang memungkinkan kami untuk meningkatkan wadah kami dengan server Mock untuk setiap pembuatan dan menjalankan pengujian kami di lingkungan yang sepenuhnya terisolasi tanpa menyebarkan kode kami ke backend pengujian, yang juga tidak bisa Jangan mempercepat tes kami.
Untuk mengerjakan semua keajaiban ini, kami harus menambahkan file konfigurasi baru dengan alamat API baru dan layanan eksternal, serta meningkatkan salinan database mysql, dan juga membuat tugas baru dalam rencana pembangunan dengan meluncurkan server tiruan kami.
Sekarang untuk kode kita ada API yang sepenuhnya baru yang, terlepas dari masalah lingkungan apa pun, akan memberi kita apa yang kita inginkan.
Waktu berlalu, tes ditulis ulang, dan 140 tes fungsional berubah menjadi 103 tes komponen, yang berjalan paralel dalam ~ 30 detik.

Dari pro
Sangat gesit . Karena fakta bahwa mereka benar-benar independen dari lingkungan pengujian, mereka tidak perlu pergi jauh untuk mendapatkan data.
Stabil Tes tidak perlu khawatir tentang apakah API kami atau layanan lain jatuh di sana, jadi kami selalu yakin bahwa hasilnya akan datang kepada kami.
Mudah ditulis . Sebenarnya, dalam proses penulisan ulang, banyak yang diputuskan dengan menyalin kode dari uji fungsional lama ke komponen baru dan menyiapkan titik akhir untuk itu di server Mock.
Dari minusnya
Dukungan Sekarang, setiap pengembang yang telah membuat perubahan pada respons yang dikembalikan untuk titik akhir spesifik di API juga pergi ke repositori dengan konfigurasi untuk server tiruan dan mengoreksi jawabannya di sana.
Banyak file . Mereka memutuskan untuk menyimpan data dengan konfigurasi dalam bentuk file, yaitu, setiap jawaban untuk titik akhir terletak sebagai file dan mungkin hilang di suatu tempat.
Hasil:
TesItu: 140+ tes fungsional = 5-7 menit.
Sekarang: 103 tes komponen = ~ 30 detik.
Membangun StabilitasItu: Setiap perakitan ketiga jatuh karena masalah.
Itu menjadi: Jatuh hanya ketika pengembang memecahkan logika beberapa metode.
Dalam rencana masa depan kita harus menulis ulang tes penerimaan (gui) - juga menjalankannya di dalam wadah dan mengisolasi mereka dari sisa lingkungan.