Apa relevansi Pengujian Unit dalam lingkungan "Rilis rilis awal sering"?

10

Lebih dari satu tahun terakhir, saya telah mendorong tim saya menuju mode pengembangan rilis-awal-rilis-sering (AKA: Pengembangan Aplikasi Cepat, bukan Agile). Untuk informasi lebih lanjut tentang cara kami menutup bangunan, lihat jawaban saya di sini: Cara sederhana untuk meningkatkan kualitas rilis di lingkungan RAD

Ketika kami mengadopsi RAD, orang-orang cukup mandiri dan mereka melakukan pengujian unit terlebih dahulu; tes terintegrasi terjadi jauh kemudian dalam proses. Itu adalah proses alami bagi mereka tanpa banyak penegakan formal. Sekarang situasinya sangat berbeda:

  1. Seluruh platform terintegrasi dengan baik dengan build / release yang mapan di sisi klien tanpa hot spot.

  2. Persyaratan fungsionalitas baru terus datang dan kami membuatnya secara bertahap seiring berjalannya waktu.

  3. Keseluruhan dinamika sistem sangat penting karena walaupun kelompok-kelompok pembangunan independen mungkin mengikuti proses dengan benar, kegagalan-kegagalan besar muncul karena rumit, keadaan yang tidak jelas.

  4. Banyak bagian dari sistem melibatkan algoritma baru dan input penelitian sehingga tantangan (dan karenanya mekanisme untuk pengujian) tidak selalu diramalkan dengan benar, seperti pengujian fitur dalam perangkat lunak yang terdefinisi dengan baik.

Baru-baru ini, saya mencoba untuk mendapatkan gambaran keseluruhan yang lebih baik untuk melihat apakah kita perlu perbaikan proses. Ketika saya duduk dengan tim saya, banyak dari mereka menolak: "Kami tidak melakukan pengujian unit lagi!" sementara yang lain berpikir kita tidak boleh mulai sekarang karena itu tidak akan pernah efektif.

Apakah tes unit berguna dalam sistem yang relatif matang? Haruskah kita setidaknya perlu menimbang ruang lingkup pengujian tergantung pada jatuh tempo unit? Apakah pengujian unit akan memperlambat laju pengembangan? Apakah ada kebutuhan untuk mengevaluasi pengujian unit dengan cara yang berbeda?

Apa praktik terbaik pengujian untuk platform dewasa di lingkungan rilis-awal-rilis-sering?

Dipan Mehta
sumber
Saya pikir idenya adalah merilis kode semi-kerja lebih awal dan sering, tetapi bagian "semi-kerja" tersirat. Tes unit membantu dengan itu. Tetapi tes unit mungkin tidak cukup. Anda mungkin juga menginginkan sisi pengujian integrasi.
ccoakley

Jawaban:

15

Tes unit tidak terutama untuk menemukan bug di tempat pertama - mereka untuk memastikan bahwa rilis sistem Anda berikutnya adalah sama stabilnya dengan rilis sebelumnya. Semakin pendek siklus rilis Anda, semakin penting artinya Anda dapat menjalankan tes ini secara otomatis alih-alih melakukannya secara manual.

Tentu saja, jika Anda memiliki sistem dengan beberapa bagian independen, dan Anda bekerja di antara dua rilis hanya pada sebagian kecil dari sistem, Anda mungkin dapat menghilangkan beberapa unit test yang untuk bagian lain dari sistem. Tetapi Anda harus menggunakan (dan memperpanjang) unit test untuk bagian-bagian di mana Anda bekerja.

Hal lain adalah ketika sistem tumbuh, akan ada lebih banyak dan lebih banyak kebutuhan untuk tes integrasi tambahan - tetapi itu tidak berarti Anda akan membutuhkan lebih sedikit unit test.

Pertanyaan sesungguhnya di balik pertanyaan Anda mungkin mungkin berbeda. Apakah semakin sulit untuk menulis unit test karena sistem Anda menjadi semakin besar? Apakah "unit" tes Anda benar-benar unit tes, atau apakah mereka tidak menguji hal-hal dalam isolasi lagi? Ini mungkin karena mereka bergantung pada bagian-bagian sistem tingkat rendah yang telah stabil dari waktu ke waktu.

Hal-hal ini terjadi karena pengembang cenderung menggunakan kembali pustaka dan kode yang ada dengan merujuk langsung pada mereka. Seringkali memiliki efek bahwa tes unit menulis menjadi lebih sulit, karena mereka sering harus memberikan lingkungan yang lebih kompleks dan lebih banyak data uji. Jika itu adalah masalah Anda, maka Anda harus belajar tentang konsep-konsep kunci Dependency Injection dan Prinsip Segregasi Antarmuka , yang dapat membantu Anda membuat kode lebih dapat diuji unit.

Doc Brown
sumber
"Ini sering memiliki efek bahwa tes unit menulis menjadi lebih sulit, karena mereka seringkali harus menyediakan lingkungan yang lebih kompleks dan lebih banyak data uji." <- Tes unit harus semudah sistem yang sederhana dan kompleks. Anda tidak perlu membutuhkan lebih dari setengah lusin pengaturan untuk setiap kelas. Jika tidak, itu hanya berarti kelas Anda telah tumbuh terlalu besar. Selain itu, uji unit tidak boleh dikaitkan dengan lingkungan apa pun. (Tapi Anda mungkin sudah tahu itu, hanya mengatakan ...)
Sleeper Smith
@ SleeperSmith: ya, dan untuk memungkinkan untuk menulis tes unit sederhana seperti itu, mungkin ide yang baik untuk menerapkan DI dan ISP - itulah yang saya tulis di atas. Maaf jika saya tidak cukup jelas tentang itu.
Doc Brown
4

Anda harus mempertimbangkan untuk melihat pengembangan yang digerakkan oleh tes, di mana tes dirancang terlebih dahulu dan menjelaskan bagaimana kode baru akan bekerja saat ditulis. Anda kemudian lulus ujian.

Dalam pengalaman saya ini cenderung membuat kode lebih ramping dan lebih dipikirkan, terutama untuk perpustakaan, dan itu adalah bagian dari spesifikasi runnable (artinya selalu dokumentasi yang benar).

Yang mengatakan, tes yang ada digunakan untuk memastikan bahwa kode masih berfungsi seperti yang diharapkan. Itu dapat menangkap kerusakan kode, dan memungkinkan Anda untuk memastikan bahwa kode pihak ketiga masih berfungsi seperti yang diharapkan ketika meningkatkan.


sumber
3

Seperti yang disarankan oleh Doc Brown dan Thorbjørn Ravn Andersen , sebuah rilis awal Rilis sering kali lingkungan dapat memperoleh manfaat lebih banyak dari pengujian unit yang baik dan pengembangan yang didorong oleh tes dibandingkan dengan siklus rilis yang panjang.

Jika Anda memiliki sistem integrasi berkelanjutan yang baik dan tes yang mewakili fungsionalitas dengan baik, Anda punya ide bagus kapan saja apa yang berfungsi (karena tes untuk fungsionalitas itu berlalu) dan apa yang belum dilaksanakan ( karena tidak ada tes untuk fungsi itu).

Mark Booth
sumber