Mengapa Anda menjalankan tes unit pada server CI?
Tentunya, pada saat sesuatu dikomitmenkan untuk dikuasai, pengembang telah menjalankan semua pengujian unit sebelumnya dan memperbaiki kesalahan yang mungkin terjadi dengan kode baru mereka. Bukankah itu poin dari unit test? Kalau tidak, mereka baru saja melakukan kode yang rusak.
master
harus selalu waras, dan sebaiknya secara otomatis digunakan pada setiap penggabungan ke lingkungan pementasan untuk QA & pengujian internal.Jawaban:
Atau tidak. Ada banyak alasan mengapa ini bisa terjadi:
Tetapi poin sebenarnya adalah menjalankan tes pada mesin yang bukan mesin pengembang. Satu yang dikonfigurasi secara berbeda.
Ini membantu mengatasi masalah di mana tes dan / atau kode bergantung pada sesuatu yang spesifik untuk kotak pengembang (konfigurasi, data, zona waktu, lokal, apa pun).
Alasan bagus lainnya untuk CI build untuk menjalankan tes:
sumber
Sebagai pengembang yang tidak menjalankan semua tes integrasi dan unit sebelum membuat komit ke kontrol sumber, saya akan menawarkan pertahanan saya di sini.
Saya harus membuat, menguji, dan memverifikasi bahwa aplikasi berjalan dengan benar di:
Tambahkan Fortran (dengan kompiler Intel dan GNU), Python (dan berbagai versi tergantung pada OS) dan komponen skrip bash / bat dan, well, saya pikir Anda dapat melihat hal-hal berputar keluar
Jadi itu enam belas mesin yang harus saya miliki, hanya untuk menjalankan beberapa tes beberapa kali sehari. Hampir menjadi pekerjaan penuh waktu hanya untuk mengelola infrastruktur untuk itu. Saya pikir hampir semua orang akan setuju bahwa itu tidak masuk akal, terutama mengalikannya dengan jumlah orang dalam proyek. Jadi kami membiarkan server CI kami melakukan pekerjaan.
Tes unit tidak menghentikan Anda melakukan kode rusak, mereka memberi tahu Anda jika mereka tahu Anda telah merusak sesuatu. Orang-orang dapat mengatakan "unit test harus cepat", dan melanjutkan tentang prinsip dan pola desain serta metodologi, tetapi pada kenyataannya kadang-kadang lebih baik membiarkan komputer yang kami rancang untuk tugas berulang dan monoton melakukan hal itu dan hanya terlibat jika mereka beri tahu kami bahwa mereka telah menemukan sesuatu.
sumber
Terlepas dari jawaban Oded yang sangat baik:
Saya pernah bekerja di perusahaan yang memiliki banyak bug pada penyebaran karena proses penggabungan dan penyebaran. Ini disebabkan oleh kerangka kerja aneh yang membuat pengujian dan CI sulit. Itu bukan pengalaman yang menyenangkan untuk menemukan bahwa kode yang bekerja dengan baik pada pengembangan tidak tiba tepat untuk produksi.
sumber
Anda akan berpikir begitu kan - tetapi pengembang adalah manusia dan mereka terkadang lupa.
Juga, pengembang sering gagal menarik kode terbaru. Tes terbaru mereka mungkin berjalan baik maka pada saat check-in, orang lain melakukan perubahan besar.
Tes Anda juga dapat mengandalkan sumber daya lokal (tidak dicentang). Sesuatu yang tidak akan diambil unit test lokal Anda.
Jika Anda berpikir semua hal di atas fantastis, ada tingkat di atas CI (setidaknya di TFS) yang disebut Gated di mana bangunan yang memiliki tes gagal disimpan dan tidak berkomitmen pada basis kode.
sumber
Saya biasanya mengatur CI saya untuk dijalankan di setiap komit tunggal. Cabang tidak digabung menjadi master sampai cabang diuji. Jika Anda mengandalkan menjalankan tes pada master, maka itu membuka jendela untuk membangun yang akan rusak.
Menjalankan tes pada mesin CI adalah tentang hasil yang dapat direproduksi. Karena server CI memiliki lingkungan bersih yang diketahui berasal dari VCS Anda, Anda tahu bahwa hasil pengujiannya benar. Saat berjalan secara lokal, Anda bisa lupa untuk mengkomit beberapa kode yang diperlukan agar mereka lulus, atau memiliki kode yang tidak dikomit yang membuat mereka lulus ketika mereka seharusnya gagal.
Ini juga dapat menghemat waktu pengembang dengan menjalankan berbagai suite secara paralel, terutama jika beberapa tes lambat, multi-menit yang tidak mungkin dijalankan secara lokal setelah setiap perubahan.
Pada pekerjaan saya saat ini, penyebaran produksi kami terjaga keamanannya pada CI melewati semua tes. Script deploy akan mencegah penyebaran kecuali mereka lewat. Ini membuat mustahil untuk secara tidak sengaja lupa menjalankannya.
CI yang menjadi bagian dari alur kerja juga membebani pengembang. Sebagai pengembang, apakah Anda biasanya menjalankan linter, analisa statis, uji unit, cakupan kode, dan uji integrasi untuk setiap perubahan tunggal? CI dapat, sepenuhnya otomatis dan tanpa perlu memikirkannya - mengurangi keletihan keputusan.
sumber
Pada saat sesuatu berkomitmen untuk dikuasai, pengembang seharusnya sudah menjalankan semua tes unit ... tetapi bagaimana jika belum? Jika Anda tidak menjalankan tes unit pada server CI, Anda tidak akan tahu sampai orang lain menarik perubahan ke mesin mereka dan menemukan tes yang baru saja rusak.
Selain itu, pengembang mungkin telah melakukan kesalahan dan mereferensikan sumber daya lokal khusus untuk mesin mereka. Ketika mereka memeriksa kode dan menjalankan CI gagal, masalah segera diidentifikasi dan dapat diperbaiki.
sumber
Dengan asumsi (bertentangan dengan jawaban lain) bahwa pengembang cukup disiplin dan melakukan tes unit sebelum melakukan, mungkin ada beberapa alasan:
sumber
Dimungkinkan untuk membayangkan kasus ketika perubahan A tidak merusak tes, dan perubahan B tidak merusak tes, tetapi A dan B bersama - sama melakukannya. Jika A dan B dibuat oleh pengembang yang berbeda, hanya server CI yang akan mendeteksi bug baru. A dan B bahkan mungkin dua bagian dari kalimat yang lebih panjang yang sama.
Bayangkan sebuah kereta yang dikendarai oleh dua lokomotif A dan B. Mungkin satu lebih dari cukup dan ini adalah perbaikan untuk diterapkan. Namun jika kedua "perbaikan" diterapkan menghapus keduanya, kereta tidak akan bergerak.
Juga, tidak semua pengembang menjalankan semua tes Unit, sementara sebagian besar pengembang yang baik melakukannya.
sumber
Mari kita ajukan pertanyaan yang setara:
Ada beberapa alasan untuk melakukan CI, tetapi poin utama CI adalah untuk mendapatkan gambaran tentang status kode dari waktu ke waktu. Manfaat utama (dari beberapa) ini memberikan, adalah bahwa kita dapat mengetahui kapan build rusak, mencari tahu apa yang memecahkannya, dan kemudian memperbaikinya.
Jika kodenya tidak pernah rusak, mengapa kita menggunakan CI? Untuk mengirimkan build untuk pengujian, build malam akan cukup baik.
sumber