Kapan Anda memiliki cukup pengujian otomatis untuk percaya diri dalam pipa integrasi berkelanjutan Anda?


10

Integrasi berkelanjutan dengan pengujian berguna untuk memastikan bahwa Anda memiliki kode "shippable" yang diperiksa setiap saat.

Namun, benar-benar sulit untuk mengikuti serangkaian tes yang komprehensif dan seringkali, sepertinya build akan menjadi buggy.

Berapa banyak tes yang harus Anda rasakan percaya diri dalam pengujian pipa CI Anda? Apakah Anda menggunakan semacam metrik untuk memutuskan kapan ada cukup tes?

Jawaban:


16

Secara umum

Kapan Anda memiliki cukup pengujian otomatis untuk percaya diri dalam pipa integrasi berkelanjutan Anda?

Jawabannya mungkin menjadi jelas jika Anda memikirkan apa yang ingin Anda yakini. Pada akhirnya, ia memetakan 1-1; setiap tes membuat Anda yakin tentang satu hal yang diuji:

  • Pengujian unit memberi Anda kepercayaan diri bahwa kelas (atau modul) melakukan apa yang diuji.
  • Pengujian integrasi memberi Anda kepercayaan diri bahwa beberapa unit bekerja bersama dalam cara yang diuji.
  • Pengujian ujung ke ujung memberi Anda keyakinan bahwa seluruh aplikasi melakukan hal tertentu, seperti yang dijelaskan dalam tes.

Dari cara Anda merumuskan pertanyaan, Anda mungkin berpikir dalam pengertian bisnis gambaran besar sekarang, misalnya:

Saya ingin yakin bahwa aplikasi saya bisa melakukan X .

Jadi, Anda menulis tes ujung ke ujung yang mencoba melakukan X dan memeriksa apakah melakukan itu dengan benar.

Lebih konkret

Itu semua sangat merujuk pada diri sendiri, tapi itu karena itu yang terjadi. Tidak ada yang lebih dari itu.

Misalnya, bayangkan Anda menulis aplikasi untuk membuat resep memasak. Salah satu fitur adalah bahwa, jika Anda menambahkan jumlah yang berbeda dari beberapa jenis keju yang berbeda, itu memberi Anda suhu dan waktu yang tepat sehingga semuanya mencair.

Jadi Anda dapat menulis unit test untuk Anda CheeseMeltCalculator, di mana Anda memberikan 100 g Gouda dan 200 g keju Emmental, dan kemudian Anda memeriksa bahwa suhu dan waktu berubah dengan benar. Itu berarti Anda sekarang dapat yakin bahwa itu CheeseMeltCalculatorbekerja untuk 100g Gouda dan keju 200g. Sekarang jika Anda mengulangi tes ini dengan 300g Gouda, bukan 200g, Anda bisa cukup percaya diri bahwa itu bekerja dengan benar untuk nilai yang berbeda. Anda dapat menambahkan tes untuk 0, -1dan int.MaxValueg dari Gouda untuk yakin bahwa kode tidak naik (atau naik dengan benar seperti yang dimaksudkan) untuk input aneh.

Anda dapat menulis tes integrasi untuk memeriksa yang CheeseMeltCalculatordimasukkan dengan benar ke dalam seluruh suhu makanan dan proses perhitungan waktu. Jika ini salah, tetapi CheeseMeltCalculatortes di atas baik-baik saja, Anda dapat yakin bahwa bug ada di kalkulator lain atau cara data dari kalkulator berbeda digabungkan.

Dan akhirnya Anda dapat menulis tes ujung ke ujung untuk membuat seluruh resep, dan salah satu hal yang Anda periksa adalah suhu dan waktu hasil. Jika 2 level tes sebelumnya baik-baik saja, tetapi ini tidak beres, maka Anda dapat kembali yakin bahwa bagian-bagian itu benar dan kesalahannya adalah sesuatu tentang bagaimana perhitungan suhu diintegrasikan ke dalam aplikasi. Misalnya, mungkin input pengguna tidak ditransfer dengan benar.

Dan akhirnya , jika semua tes itu baik-baik saja, maka Anda dapat yakin bahwa " jika Anda menambahkan jumlah yang berbeda dari beberapa jenis keju yang berbeda, itu memberi Anda suhu dan waktu yang tepat sehingga semuanya mencair "

Cerpen Panjang

Intinya adalah Anda tidak dapat melakukan tes "itu berfungsi dengan benar". Anda hanya dapat menguji "Jika saya melakukan X, Y terjadi".

Namun, ini persis hal yang harus dalam spesifikasi teknis untuk proyek tersebut. Pernyataan seperti " jika Anda menambahkan jumlah yang berbeda dari beberapa jenis keju yang berbeda, itu memberi Anda suhu dan waktu yang tepat sehingga semuanya mencair " tidak hanya memberi harapan yang jelas kepada klien tentang apa yang akan dilakukan produk jadi, tetapi juga dapat diubah dalam tes otomatis.

informasi tambahan

Pengguna Richard menambahkan info ini dalam edit:

Martin Fowler memiliki ringkasan yang sangat bagus di situs webnya tentang strategi paling umum: https://martinfowler.com/articles/microservice-testing/

Saya tidak ingin menghapus ini, tetapi saya ingin mengatakan ini: Dibandingkan dengan jawaban ini, ini bukan "ringkasan", melainkan penjelasan yang jauh lebih mendalam, dengan grafik yang bagus dan segalanya.

Saran saya adalah: Jika semuanya masuk akal bagi Anda setelah membaca jawaban saya, Anda sudah selesai. Jika masih tampak tidak jelas, sisihkan sedikit waktu dan bacalah artikel yang tertaut.


Ini adalah pandangan konseptual yang bagus. Apakah Anda memiliki metrik contoh yang akan berguna dalam memberikan kepercayaan pada cakupan pengujian kami?
stonefruit

@stonefruit Tidak juga, tapi saya rasa saya memiliki jawaban yang tepat yang Anda butuhkan: Testivus On Test Coverage
R. Schmitz

@stonefruit Mengenai angka dalam perumpamaan itu, 80%, itu adalah angka yang lebih sering Anda dengar dalam konteks ini. Terutama karena prinsip pareto - cakupan 20% terakhir adalah 80% dari pekerjaan. Dengan kata lain, ini merupakan pekerjaan 4 kali lebih banyak untuk mendapatkannya dari 80% menjadi 100%, seperti halnya untuk mendapatkannya hingga 80% di tempat pertama. Itu seringkali berlebihan, tetapi bayangkan Anda menulis kode kontrol untuk satelit: Jika bug muncul, Anda tidak bisa memperbaikinya saja; mendapatkan cakupan hingga 100% adalah investasi yang berharga saat itu.
R. Schmitz

Sepertinya saya programmer ketiga. ha ha. Saya kira pada akhirnya, itu kembali ke mengambil pendekatan berbasis risiko, seperti yang Anda sebutkan dengan contoh satelit.
stonefruit

1
@stonefruit Mungkin Anda yang pertama. Jika Anda memiliki proyek yang ada dengan cakupan 0%, jangan mulai pawai kematian hingga 80%. Sebaliknya, sungguh, " hanya menulis beberapa tes bagus ". Mungkin menggunakan paruh terakhir hari Jumat untuk menulis tes, sesuatu seperti itu. Dalam pengalaman saya, Anda akan secara otomatis membuat tes dengan rasio upaya-hadiah terbaik terlebih dahulu, dan setiap tes akan memberi Anda kepercayaan diri yang lebih tinggi.
R. Schmitz

4

Tidak ada metrik yang dapat Anda hitung yang akan memberi Anda kepercayaan diri yang Anda cari. Keyakinan dibangun dengan melakukan sesuatu, dan kemudian berhasil atau gagal dan belajar sesuatu darinya.

Satu-satunya "metrik" yang saya temukan yang memberi saya kepercayaan diri dalam cakupan pengujian kami adalah:

  1. Jumlah cacat yang ditemukan dalam produksi
  2. Bisakah Anda memperbaiki basis kode dan mengandalkan cakupan tes Anda untuk menangkap cacat regresi?

Tes otomatis bukan peluru perak. Anda perlu melacak berapa banyak cacat produksi yang ditemukan selama setiap siklus rilis. Ketika nomor ini turun, Anda memberikan perangkat lunak yang lebih baik. Tes otomatis dan Integrasi Berkelanjutan hanyalah alat yang Anda gunakan untuk memberikan perangkat lunak yang lebih baik.

Satu-satunya metrik yang dapat Anda ukur adalah "Apakah Anda memberikan perangkat lunak yang lebih baik?"

Dan bahkan kemudian, itu subjektif.


Dibandingkan dengan jawaban lain, jawaban ini membahas kemungkinan metrik. Saya telah berpikir untuk membuat metrik yang disarankan lebih bermakna. Mungkin di samping menemukan jumlah cacat yang ditemukan dalam produksi, berikan skor setiap cacat berdasarkan manajemen risiko dan tempatkan ambang batas (mis. 30 titik cacat ditemukan dalam 3 bulan terakhir). Mencapai ambang batas mungkin merupakan indikasi melakukan peninjauan sistem untuk kemungkinan bug, sebelum hutang teknis untuk kode kereta meningkat secara eksponensial.
stonefruit

2

Kapan Anda memiliki cukup pengujian otomatis untuk percaya diri dalam pipa integrasi berkelanjutan Anda?

Di sebagian besar lingkungan ekonomi Anda tidak akan memiliki anggaran untuk menerapkan kepercayaan yang cukup (> 99%) tetapi Anda harus mengelola anggaran terbatas: Ini semua tentang rasio biaya / manfaat.

  • Beberapa tes otomatis murah untuk menerapkan beberapa sangat mahal.
  • Tergantung pada manajemen risiko Anda yang sebenarnya, beberapa risiko harus ditanggung oleh tes sementara yang lain tidak.

Jadi pada kenyataannya tes mudah / murah / berisiko akan dilaksanakan sedangkan tes mahal / tidak mungkin tidak.

Salah satu sub-tujuan pengembangan perangkat lunak adalah untuk menciptakan arsitektur yang mudah / murah untuk diuji (desain untuk diuji dengan menerapkan Uji-driven_development ) agar pengujian otomatis terjangkau.

Saya berasumsi bahwa prinsip Pareto_preple dapat diterapkan untuk perangkat lunak yang dapat dikelola / diuji di sini, juga: Dikatakan bahwa dengan menghabiskan uang ekstra 20% lebih banyak, Anda mendapat manfaat tambahan 80%. Untuk mencapai sisa 20% lebih banyak manfaat, Anda perlu mengeluarkan uang ekstra 80%.

Anda dapat menerapkan Metrik Tes seperti cakupan kode dan cakupan mutasi untuk menunjukkan potensi kode sumber yang belum teruji.

Tetapi bahkan dengan cakupan 100% Anda tidak dapat memastikan bahwa kode Anda bebas dari bug.

Manajemen suka codemetrics. Jika "cakupan kode> = 80%" diberlakukan oleh manajemen sedangkan pengembang tidak mendukung / menyukai pengujian otomatis, ada cara untuk menulis kode uji dengan cakupan tinggi yang tidak membuktikan apa pun yang memberikan perasaan aman yang salah.


1

Kuncinya di sini bukan untuk mengkhawatirkan tentang cakupan yang lengkap tetapi dalam mengelola risiko perubahan Anda.

Katakanlah Anda menggunakan pipa Anda untuk menggunakan versi yang sama persis seperti yang sudah ada di Produksi - apa risiko kesalahan regresi? Nol (karena tidak ada perubahan).

Sekarang, katakanlah saya ingin mengubah tulisan di salah satu layar. Saya telah menambahkan tes untuk memverifikasi bahwa teks sekarang ditampilkan dengan benar (mari kita asumsikan demi argumen itu adalah bagian teks yang BENAR-BENAR penting). Tes lain apa yang saya perlukan untuk memverifikasi tidak ada kesalahan regresi? Secara realistis tidak ada ...

Jadi jumlah tes otomatis yang diperlukan untuk setiap rilis untuk hidup bukan fungsi dari ukuran aplikasi Anda, tetapi ukuran perubahan Anda. Jika Anda membuat perubahan kecil, risiko rendah maka Anda akan memerlukan tes yang jauh lebih sedikit untuk mengurangi risiko.

Tapi tunggu dulu ... bukankah ini berbaris sangat baik dengan titik CI dan CD?

Ya! Dengan mempertahankan semua perubahan dan delta Anda sangat kecil, Anda mengurangi banyak risiko regresi melalui proses alih-alih pengujian. Terlebih lagi, pertanyaannya tidak benar-benar menjadi salah satu otomatisasi (itu hanya alat yang akan kami gunakan) - itu hanya masalah pengujian dan selera risiko. Lupakan otomatisasi sepenuhnya, tes apa yang akan Anda lakukan terhadap perubahan untuk memastikan perubahan tidak menimbulkan masalah? Jawaban untuk pertanyaan itu tidak berubah dari proses pengujian manual ke sistem CI - satu-satunya keuntungan adalah bahwa banyak dari tes regresi tersebut sebelumnya telah dikembangkan dalam fungsi sebelumnya dan CI mendorong Anda untuk membuat perubahan yang lebih kecil, lebih aman.

TLDR

Tes Anda adalah untuk mengurangi risiko perubahan. Penempatan dengan delta nol tidak memiliki risiko dan karenanya tidak membawa risiko. Dengan menjaga perubahan Anda kecil, menjadi lebih mudah untuk mengidentifikasi tes yang diperlukan untuk memvalidasinya - penggunaan kembali otomatisasi adalah bonus.


0

Metriknya sama dengan saat Anda menguji produk secara manual.

Secara praktis, mudah untuk mengidentifikasi zona-zona berkeyakinan rendah ini: dengan asumsi bahwa Anda mengirim produk, saya kira Anda memiliki beberapa langkah manual pasca-pipa yang meningkatkan kepercayaan diri Anda akan dapat dikirim. Ini adalah area yang harus Andaotomatiskan untuk meningkatkan kepercayaan diri pada proses otomatis itu sendiri.

Otomasi Anda adalah upaya berkelanjutan. Ini tumbuh dan membaik dengan meningkatnya produk Anda. Cacat adalah alasan untuk memikirkan kembali kode Anda, bersama dengan memikirkan kembali CI. Dan sisi yang cerah di sini adalah bahwa kepercayaan terhadap produk itu sendiri dapat dicapai - kepercayaan terhadap otomatisasi juga dapat dicapai.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.