Kami memiliki tiga set suite uji:
- Suite "kecil", hanya membutuhkan beberapa jam untuk berlari
- Suite "sedang" yang membutuhkan waktu beberapa jam, biasanya berlari setiap malam (setiap malam)
- Suite "besar" yang membutuhkan waktu + minggu untuk beroperasi
Kami juga memiliki banyak suite tes yang lebih pendek, tapi saya tidak fokus pada mereka di sini.
Metodologi saat ini adalah menjalankan suite kecil sebelum setiap komit ke trunk. Kemudian, suite menengah berjalan setiap malam, dan jika pada pagi hari ternyata gagal, kami mencoba untuk mengisolasi mana dari komitmen kemarin yang harus disalahkan, kembalikan yang melakukan dan coba lagi pengujian. Proses serupa, hanya pada frekuensi mingguan dan bukan malam hari, dilakukan untuk suite besar.
Sayangnya, suite menengah gagal cukup sering. Itu berarti bahwa bagasi sering tidak stabil, yang sangat menjengkelkan ketika Anda ingin membuat modifikasi dan mengujinya. Ini menjengkelkan karena ketika saya check out dari bagasi, saya tidak tahu pasti itu stabil, dan jika tes gagal saya tidak tahu pasti apakah itu salah saya atau tidak.
Pertanyaan saya adalah, adakah metodologi yang diketahui untuk menangani situasi semacam ini dengan cara yang akan membuat bagasi selalu dalam kondisi prima? misalnya "komit ke cabang precommit khusus yang kemudian akan memperbarui trunk secara berkala setiap kali malam berlalu".
Dan apakah itu penting jika itu adalah sistem kontrol sumber terpusat seperti SVN atau yang didistribusikan seperti git?
Ngomong-ngomong aku adalah pengembang junior dengan kemampuan terbatas untuk mengubah banyak hal, aku hanya mencoba memahami jika ada cara untuk mengatasi rasa sakit yang aku alami ini.
Jawaban:
Satu-satunya cara untuk memperbaiki akar penyebab ketidakstabilan adalah dengan memisahkan kode sehingga perubahan lebih terisolasi, seperti yang disarankan oleh jawaban lain.
Namun, sebagai pengembang individu, jika Anda ingin membangun yang lebih stabil untuk Anda kerjakan secara pribadi, itu relatif mudah dipecahkan. Alih-alih bekerja dari ujung, Anda hanya menarik bangunan terakhir yang melewati test suite semalam ke pohon kerja Anda. Jika Anda bisa membuat cabang fitur untuk setiap perubahan, maka cabut cabang dari bangunan stabil terakhir.
Ya, pohon Anda akan tertinggal beberapa hari, tetapi sebagian besar waktu itu tidak masalah. Lakukan pekerjaan Anda terhadap bangunan stabil, sehingga Anda tahu perubahan Anda adalah orang-orang yang melanggar tes apa pun, lalu sebelum Anda check-in, perbarui ke yang terbaru dan lakukan integrasi normal Anda. Kemudian setelah Anda check-in, kembali ke kandang terakhir.
Anda masih harus melakukan pekerjaan integrasi yang berantakan, tetapi apa yang saya sukai dari metode ini adalah mengisolasi pekerjaan integrasi ke waktu yang lebih nyaman bagi saya, dan memberi saya basis kode yang stabil untuk pengembangan ketika tidak nyaman. Saya punya ide yang jauh lebih baik ketika perubahan saya yang kemungkinan merusak build versus milik orang lain.
sumber
Saya tahu Anda mencoba menghindari ini, tetapi wawasan sebenarnya di sini adalah untuk menyadari bahwa ada sesuatu yang salah dengan basis kode Anda: Anda perlu menjalankan serangkaian pengujian yang membutuhkan waktu seminggu hanya untuk memastikan kode Anda stabil!
Cara yang paling menguntungkan untuk memperbaiki masalah ini adalah mulai memisahkan basis kode Anda dan menguji menjadi sub-unit (independen).
Ada keuntungan besar untuk ini:
Pada manajemen flipside dari struktur VCS Anda akan menjadi lebih rumit, tetapi pada minggu penuh untuk tes penuh Anda, saya pikir Anda bisa menahan rasa sakit!
Saya masih merekomendasikan menggunakan strategi cabang "stabil" dan "pengembangan" dalam beberapa bentuk atau lainnya, tetapi ada banyak cara untuk melakukannya dan Anda dapat memilih yang paling cocok untuk organisasi Anda (repositori meta dengan revisi tetap yang menunjuk ke repositori terpisah untuk setiap unit, cabang stabil dan cabang dev, cabang fitur ....)
sumber
Untuk SVN, saya tidak tahu tentang hal seperti "pra-komit". Saya pikir ini cenderung menghasilkan komit dan kembalikan ketika tes gagal. Seperti yang dikatakan doc-brown, satu-satunya cara ada untuk melakukan pada cabang sementara dan menggabungkannya dengan bagasi nanti.
Menggunakan yang didistribusikan seperti git atau lincah, saya pikir itu mungkin. Menggunakan repositori "pengujian" dan repositori "stabil". Anda mendorong rep tes, menguji setiap malam, dan jika semuanya berjalan dengan baik, Anda mendorong dari tes ke stabil. Jika tidak, Anda mengembalikan rep pengujian. Saya agak tidak yakin bagaimana sejarah versi akan terlihat ketika Anda mendorong dari pengujian ke stabil, tapi saya pikir itu mungkin untuk mengecualikan hal-hal yang rusak rollback saat melakukannya. Sedikit bereksperimen terlebih dahulu akan menjadi yang paling aman.
Alternatif lain adalah dengan menguji batang lokal setiap orang setiap malam. Kemudian, orang-orang dengan tes yang lulus diizinkan untuk mendorongnya ke server pusat di pagi hari.
sumber
IMHO ini tidak ada hubungannya dengan VCS yang Anda gunakan. Menggunakan cabang "sedang diuji" mungkin solusi, yang dapat direalisasikan dengan VCS terpusat atau didistribusikan juga. Tapi jujur, saya pikir hal terbaik dalam situasi Anda adalah mencoba untuk mengoptimalkan test suite menengah (tampaknya berisi tes yang paling penting) sehingga berjalan lebih cepat, jadi dan Anda dapat menggunakannya untuk pra-komit-ke-trunk tes, sama seperti Anda melakukannya sekarang dengan "suite kecil" Anda.
sumber
Tes sedang gagal: Apakah benar bahwa sebagian besar waktu tes yang sama gagal?
Jika ada kegagalan, apakah selalu ada tes terkait yang sama yang gagal?
Jika benar: Mungkin Anda dapat secara selektif memilih beberapa tes menengah yang sering gagal (satu tes untuk setiap kelas kesalahan) dan menjalankannya dalam set kecil.
Apakah sebagian besar tes integrasi-tes yang menggunakan database nyata? Jika demikian, mungkinkah untuk menggantinya dengan unittest yang memiliki database-mocked?
sumber
Anda perlu membuat tes Anda berjalan lebih cepat, tidak ada cara lain untuk menyelesaikan lingkaran ini.
Pertimbangkan masalahnya: Anda ingin memastikan bahwa ketika Anda check out, Anda memiliki kode yang berfungsi. Tentu, Anda dapat menunda komit dan melakukan percabangan sampai sebelum rilis, tetapi itu hanya akan menunda timbulnya masalah sampai integrasi. Seperti dalam, apakah Anda harus menjalankan suite selama seminggu setelah setiap penggabungan? Metodologi bukan solusinya, solusi itu murni teknis.
Inilah yang saya sarankan:
1) Jadikan tes serumah mungkin, dan maksimalkan penggunaan kembali lingkungan.
2) Dapatkan lahan uji-suite untuk menjalankannya. Jika daripada 8 modul besar Anda berakhir dengan 50, Anda dapat memutar banyak instance Amazon EC2 dan menjalankan seluruh rangkaian secara paralel. Saya yakin ini membutuhkan biaya, tetapi akan menghemat banyak waktu pengembang.
sumber
Hal utama yang Anda anggap remeh dalam pertanyaan Anda adalah bahwa semua komitmen harus lulus tes. Meskipun ini adalah aturan yang baik untuk diikuti dan tampaknya masuk akal, kadang-kadang itu tidak praktis. Kasus Anda adalah contoh (meskipun MadKeithV benar,) dan saya bisa membayangkan memiliki cabang VCS sehingga murni bisa sulit jika tidak ada kerja sama yang cukup di antara para penyembah.
Kenyataannya apa yang Anda inginkan adalah entah bagaimana mengetahui mana yang lulus atau gagal. "Cabang pra-komit" seperti yang Anda sarankan akan berhasil, tetapi itu mungkin membutuhkan upaya ekstra dari pengembang ketika mereka membuat komitmen, yang mungkin sulit untuk dijual.
Pendekatan serupa yang bisa lebih mudah adalah meninggalkan bagasinya agar orang-orang dapat istirahat sesuka mereka, dan memiliki cabang untuk melakukan yang tidak rusak. Sebuah skrip otomatis dapat melewati komit saat dibuat ke bagasi, menjalankan tes pada mereka dan menambahkannya ke cabang jika lulus.
Atau Anda bisa menjadi sangat sederhana dan memiliki skrip yang mencantumkan komit yang lewat dalam file teks (yang mungkin atau mungkin tidak sendiri dikendalikan oleh versi).
Atau memiliki sistem batch yang menerima permintaan cabang / revisi untuk diuji (dari mana saja di pohon), dan mengujinya dan memasukkannya ke bagasi (atau cabang lain) jika lulus.
sumber