Unit pengujian tim pemula perlu untuk unit test

37

Saya bekerja dengan tim baru yang secara historis tidak melakukan pengujian unit APA PUN. Tujuan saya adalah agar tim akhirnya menggunakan TDD (Test Driven Development) sebagai proses alami mereka. Tetapi karena TDD adalah perubahan pikiran yang radikal untuk tim pengujian non-unit, saya pikir saya akan memulai dengan menulis unit test setelah coding.

Adakah yang pernah mengalami situasi yang sama? Apa cara yang efektif untuk membuat tim merasa nyaman dengan TDD ketika mereka belum melakukan pengujian unit? Apakah masuk akal untuk melakukan ini dalam beberapa langkah? Atau haruskah kita menyelam langsung dan menghadapi semua rasa sakit yang tumbuh sekaligus ??

EDIT

Hanya untuk klarifikasi, tidak ada seorang pun di tim (selain saya) yang memiliki eksposur / pengalaman pengujian unit APAPUN. Dan kami berencana menggunakan fungsionalitas unit testing yang dibangun ke dalam Visual Studio.

Walter
sumber
+1 Pertanyaan ini menguraikan hampir persis situasi yang saya alami, hanya untuk Eclipse PHP Dev, bukan VS.
canadiancreed
Bukan pertanyaan yang cocok untuk forum ini
Ryan
2
Apa yang akhirnya kamu lakukan? Benar-benar ingin mendengar bagaimana ini terjadi.
Snoop

Jawaban:

36

Berlatih bug / cacat yang ada.

Ini adalah situasi yang sangat sulit. Saya tidak pernah pergi jauh ke TDD dari nol, tetapi dalam pengalaman saya, membuat tim untuk pergi dari tidak ada tes unit untuk secara proaktif menulis mereka telah menjadi pendekatan yang sangat "selangkah demi selangkah".

Pertama, buat mereka nyaman dengan tes unit menulis dan mengetahui benar apa itu dan manfaatnya. Untuk tim saya, yang terbaik adalah menulis unit test untuk bug yang ada. Bug saat ini dalam sistem memiliki dua hal yang perlu Anda ajarkan kepada orang-orang untuk menulis unit test dengan baik:

  1. prakondisi dan postkondisi yang diharapkan
  2. sebuah hasil yang saat ini tidak seperti yang diharapkan dan melanggar prasyarat / postkondisi itu

Ini memberikan contoh praktik yang sangat nyata kepada anggota. Mereka dapat menulis tes sebelum mereka memperbaiki bug, sehingga gagal. Kemudian, mereka dapat memperbaiki kode sehingga melewati, dan memperbaiki bug. Setelah mereka merasa nyaman dengan ini, maka Anda bisa mendapatkan mereka sisa sehingga mereka dapat menulis tes unit tanpa kode di muka dan kemudian menulis kode baru untuk mendapatkan tes mereka untuk lulus.

Saya pikir triknya adalah memberi mereka sesuatu untuk dipraktikkan di mana ada metode yang jelas sebelum / sesudah kondisi. Jika persyaratan untuk metode tidak jelas, sulit bagi orang TDD yang berpengalaman untuk tahu persis harus mulai dari mana. Ambil satu langkah tepat waktu dan Anda akan sampai di sana. Semoga berhasil!

Ryan Hayes
sumber
Tidakkah menulis tes unit untuk bug yang ada akhirnya menjadi tes unit yang buruk, yaitu akan menguji sejumlah besar barang daripada satu unit? Bukankah tes integrasi lebih cocok untuk skenario ini?
Isaac Kleinman
tulis tes untuk bug, itu saran yang bagus.
Amitābha
32

Saya telah berhasil meyakinkan seluruh perusahaan saya untuk beralih ke TDD. Itu tidak mudah, tetapi itu sepadan dengan usaha: kualitas kode naik setelah transisi, dan sekarang tidak ada yang membayangkan kembali ke masa koboi yang mengerikan.

  1. Jelaskan, jelaskan, jelaskan. Anda tidak ingin tim Anda menulis tes. Anda ingin tim Anda ingin menulis tes. Ini berarti bahwa mereka harus sepenuhnya memahami mengapa mereka harus melakukannya, apa manfaatnya, dan bagaimana ini akan membuat pekerjaan mereka jauh lebih mudah. Merah, Hijau, Refactor , menulis tes regresi sebagai bukti bahwa bug telah diperbaiki, dll. Anda harus meyakinkan mereka semuanya masuk akal sebelum Anda meminta mereka untuk menulis kode apa pun.

  2. Lakukan hal yang nyata (tes pertama, lalu kode). Menulis tes setelah kode hampir tidak masuk akal, karena Anda tidak akan pernah tahu apakah mereka benar-benar berfungsi (dan orang-orang menulis test case kereta). Intuisi saya adalah bahwa jumlah usaha yang Anda butuhkan untuk memulai dari tidak ada tes menjadi tes terlebih dahulu jauh lebih sedikit daripada apa yang Anda butuhkan dari tidak ada tes melalui kode terlebih dahulu untuk tes terlebih dahulu , jadi Anda bisa melewati langkah tengah.

  3. Mulailah dengan tes regresi. Ini cukup sederhana untuk dipahami, dan mereka memberikan kepuasan instan. Tentu saja, ini mengasumsikan bahwa kode tersebut termodulasi dengan benar dan mudah diuji. Jika tidak, lewati langkah ini.

  4. Ambil langkah kecil. TDD membutuhkan waktu untuk terbiasa dan mungkin membuat frustasi pada awalnya. Cobalah untuk memperkenalkan pengujian dalam proyek atau komponen baru, idealnya: sesuatu yang tidak terlalu penting. Anda ingin menghindari situasi apa pun ketika ada sesuatu yang sangat penting untuk dilakukan dengan sangat cepat dan programmer merasa bahwa TDD menghalangi.

  5. Ketika tim mulai merasa nyaman, minta semua fungsionalitas baru ditulis dengan cara TDD. Ini tergantung pada ukuran proyek Anda, tetapi setelah beberapa waktu Anda akan mendapatkan cakupan yang cukup baik, dengan hanya beberapa bagian warisan dari proyek Anda yang ditulis dengan cara lama.

  6. Pada titik ini, tim harus sudah memahami dan merangkul TDD, dan hal-hal warisan (bukan TDD) harus dianggap sulit dan menjengkelkan untuk dikerjakan. Dapatkan itu refactored: kebanyakan orang akan melakukannya dengan senang hati.

Beberapa poin penting lainnya:

  • Pastikan Anda menggunakan kerangka pengujian terbaik yang tersedia. Akan jauh lebih sulit untuk meyakinkan orang untuk melakukan TDD jika mereka harus berinteraksi dengan perpustakaan yang ditulis dengan buruk.

  • Pastikan tes mudah dijalankan dan tidak membutuhkan banyak waktu untuk menyelesaikan (atau menipu, misalnya dengan menggunakan db dalam memori untuk tes).

  • Setup beberapa perangkat lunak integrasi berkelanjutan, sehingga tes yang rusak dapat ditemukan dengan segera.

Ryszard Szopa
sumber
1
Mungkin yang paling penting adalah mengatur manajemen.
Todd
18

Salah satu cara untuk merasa nyaman dengan TDD adalah dengan menulis tes integrasi terlebih dahulu. Perkenalkan jahitan uji dan uji unit sebenarnya nanti.

Masalah dengan penulisan unit-tes setelah pengkodean adalah bahwa kode tersebut mungkin tidak dirancang dengan baik untuk diuji . Anda mungkin perlu melakukan beberapa refactoring atau mungkin mendesain ulang untuk memperkenalkan lapisan uji. Tetapi bagaimana Anda bisa refactor atau mendesain ulang dengan aman jika Anda tidak memiliki cakupan uji apa pun?

Tes integrasi dapat memberi Anda cakupan itu pada awalnya. Setiap kali Anda mengalami kemunduran atau masalah produksi, perbaiki dalam kode dan tutup kode itu dengan tes. Setelah Anda memiliki cukup jaring pengaman yang disediakan oleh tes tersebut, Anda dapat memperkenalkan unit test komponen yang lebih halus, terisolasi dan / atau kelas sistem Anda.

azheglov
sumber
6
Saya pikir ini adalah cara yang hebat: Tunjukkan pada tim terlebih dahulu bagaimana pengujian ujung-ke-ujung dapat diotomatisasi dan dijalankan di setiap bangunan. Mereka bahkan tidak perlu menulis tes, Anda dapat melakukannya sendiri jika tim sulit diyakinkan. Begitu mereka melihat betapa hebatnya memiliki umpan balik otomatis setiap kali mereka mengubah sesuatu, mereka akan bertanya bagaimana cara melakukan lebih banyak hal.
Sergio Acosta
1
Anda para kedua tepat. Kode sulit untuk diuji tetapi karena berbasis kode warisan lama tanpa tes, refactor bukanlah suatu pilihan. Tes kemudian bisa sangat sulit untuk diterapkan sehingga mematikan orang untuk mengganggu.
Todd
3

TDD sangat sulit untuk diterapkan dan tidak selalu merupakan pilihan terbaik untuk setiap tim pengembangan. Dalam pekerjaan saya sebelumnya, tim sangat fokus pada TDD. Model pengembangan kami sepenuhnya TDD menggunakan pendekatan pengembangan tangkas. Pengujian dilakukan melalui tes unit Visual Studio.

Jika pengembang tidak menulis tes unit apa pun untuk fitur mereka, mereka akan bermasalah dengan petunjuk teknis. Selain itu, jika ada orang yang masuk ke bangunan yang rusak atau unit test apa pun, pengembang harus memperbaiki semua masalah dan menambahkan $ 1 ke tabung uang tim.

Nickz
sumber
3

Hanya hal kecil untuk ditambahkan, memvisualisasikan proses. Buat integrasi yang dijalankan terus-menerus secara otomatis dan periksa cakupan kode. Daftar modul teruji paling lengkap pada beberapa halaman awal yang dapat dilihat semua orang. Itu harus membuat kompetisi tim berjalan.

Fredrik
sumber
2

Saya beralih dari pengalaman JUnit langsung ke TDD, dan pengalaman itu membuat nilai TDD jelas terlihat. Saya menjadi sangat bersyukur atas unit test sehingga saya dengan cepat menjadi penginjil untuk pendekatan ini

sinar
sumber
0

Saya sudah berada di tim yang tidak melakukan pengujian unit apa pun tetapi diperkenalkan dan sudah hampir umum untuk menjalani beberapa tes sekarang. Saya akan menyarankan untuk mengeksplorasi seberapa baik tim Anda memahami dasar-dasar pengujian unit serta alat apa yang ingin Anda bawa ke sini?

Dalam kasus saya itu membawa nUnit untuk beberapa. Net code yang merupakan campuran dari logika bisnis, antarmuka pengguna, dan fungsionalitas back-end. Saya akan menyarankan melihat jika ada beberapa orang yang lebih ingin untuk mencapai lebih daripada yang lain sehingga beberapa orang di tim mendapatkannya dan dapat menyebar sedikit lebih baik daripada sisi lain di mana Anda mencoba untuk mendapatkan semua orang untuk melompat pada ini. Dengan melakukan beberapa hal dengan baik terlebih dahulu, ini memungkinkan beberapa pelatihan silang sehingga mereka yang mengambilnya dapat diuji seberapa baik mereka dapat mengajarkannya kepada orang lain.

Poin lain adalah mempertimbangkan membawa orang-orang yang memiliki keahlian lebih untuk mencoba memamerkan ini sampai batas tertentu. Karya-karya pemikiran dibawa ke tempat saya bekerja untuk menunjukkan kepada kita beberapa hal yang sebagian diadopsi secara luas dan bagian-bagian lain tidak begitu banyak, tetapi saya pikir itu akan berlaku di sebagian besar tempat.

JB King
sumber