Unit menguji praktik terbaik untuk pemula yang menguji unit


29

Dalam beberapa tahun terakhir, saya hanya menulis komponen kecil untuk orang-orang di proyek yang lebih besar atau alat kecil. Saya belum pernah menulis unit test dan sepertinya selalu belajar bagaimana menulisnya dan benar-benar membuatnya membutuhkan waktu lebih lama daripada hanya menjalankan program dan menguji secara nyata.

Saya baru saja akan memulai proyek skala yang cukup besar yang bisa memakan waktu beberapa bulan untuk menyelesaikan dan sementara saya akan mencoba menguji elemen ketika saya menulis mereka (seperti biasa), saya bertanya-tanya apakah pengujian unit dapat menghemat waktu saya.

Saya hanya ingin tahu apakah ada yang bisa memberikan saran yang baik:

  1. Haruskah saya melihat pengujian unit pada awal proyek dan mungkin mengadopsi pendekatan TDD.
  2. Haruskah saya menulis tes sambil jalan, setelah setiap bagian selesai.
  3. Haruskah saya menyelesaikan proyek dan kemudian menulis tes unit di akhir.



Jawaban:


29

Beberapa orang akan mengatakan sebaliknya tetapi saya menyarankan Anda memisahkan TDD dan Unit Testing. TDD adalah perubahan mental dan unit testing pada awalnya membutuhkan waktu. Jika Anda menganggapnya sebagai satu item, ada risiko bahwa Anda tidak akan segera melihat manfaat yang cukup dan akan ada godaan untuk hanya menjatuhkan TDD dan Pengujian Unit dengannya.

Hal pertama adalah menulis beberapa Tes Unit. Mereka tidak harus sempurna pada awalnya. Ajari diri Anda sendiri cara menguji unit kode kecil dan cara menggunakan mengejek untuk mengisolasi komponen.

Ini adalah pengambil waktu terbesar tetapi sejauh ini merupakan hadiah terbesar. Setelah Anda menyadari bahwa Anda tidak perlu lagi melalui halaman 14 untuk mendapatkan yang ingin Anda uji, Anda akan tahu apa yang saya bicarakan.

Bagi saya, momen besar Eureka adalah aplikasi Windows di mana saya mencoba untuk menguji regex yang mengharuskan saya mengisi dua formulir sebelum saya bisa mencapainya. Saya menginstal NUnit dan menulis tes di sekitar metode itu dan melihat seberapa cepat saya menghemat waktu pengujian. Kemudian saya menambahkan lebih banyak tes untuk menangani kasus tepi. Dan seterusnya.

Kemudian belajar menulis unit test dengan baik. Pelajari keseimbangan antara tes rapuh yang cepat untuk menulis dan menulis banyak tes individual. Ini cukup mudah. Pelajarannya adalah bahwa idealnya setiap tes hanya menguji satu hal, tetapi Anda dengan cepat belajar berapa lama, sehingga Anda mulai sedikit membungkuk pada aturan sampai Anda menulis tes yang merusak setiap perubahan kode, kemudian Anda bergerak kembali ke keseimbangan yang tepat. (yang lebih dekat ke yang pertama daripada yang terakhir).

TDD, seperti yang saya katakan, adalah perubahan mental utama dalam cara Anda bekerja. Namun, itu tidak akan menambah banyak waktu untuk proses pengembangan Anda setelah Anda sudah menulis tes. Dan Anda akan, saya berjanji, melihat gaya pengkodean Anda meningkat di depan mata Anda. Atau lebih tepatnya, jika Anda tidak menjatuhkannya, itu bukan untuk Anda.

Satu hal terakhir yang perlu diingat adalah bahwa TDD tidak terbatas pada unit test. Penerimaan desain yang digerakkan tes adalah setiap bit bagian dari TDD. Alasan bagus lainnya untuk tidak mencampuradukkannya dalam pikiran Anda.


+1 Terima kasih - Membiarkan terbuka untuk sementara waktu jika ada jawaban lain, tapi saya pikir proyek ini akan menjadi titik balik saya untuk saya dengan alasan yang sama - beberapa halaman web dan akan membutuhkan waktu lebih lama untuk menguji secara manual.
wilhil

@ pdr apakah Anda memiliki beberapa referensi yang dapat saya pelajari tentang "menulis unit test dengan baik"?
Gaston

9

Saya setuju dengan yang lain (pasti tidak menulis tes Anda pada akhirnya, TDD membutuhkan waktu untuk belajar, mulai dengan pengujian namun Anda bisa, bertujuan untuk TDD penuh pada akhirnya). Tetapi saya ingin menambahkan satu hal dalam menanggapi komentar Anda: "Saya ingin tahu apakah pengujian unit dapat menghemat waktu saya."

Jawaban saya adalah ya tegas. Saya belajar pendekatan TDD sekitar 10 tahun yang lalu, setelah waktu yang sama pengkodean tanpa tes. Saat ini, jika saya melakukan sesuatu yang pendek (<250 loc) dan sederhana, atau sesuatu yang dibuang, maka saya tidak akan TDD itu. Kalau tidak, saya lakukan, dan justru karena itu menghemat waktu.

Penghematan waktu datang dalam tiga cara: lebih sedikit WTF, lebih sedikit debugging, dan lebih sedikit rasa takut. Yang pertama sudah jelas: Anda menghabiskan lebih sedikit waktu untuk bertanya-tanya apa yang sedang Anda lakukan. Ketika Anda memiliki masalah, debugging jauh lebih mudah, karena a) Anda menangkap bug yang diuji secara instan, dan b) bug yang belum teruji memiliki lebih sedikit tempat untuk bersembunyi.

Semakin sedikit rasa takut, semakin halus. Sampai Anda menghabiskan beberapa waktu di basis kode TDD, Anda bahkan tidak menyadari berapa banyak waktu yang Anda habiskan untuk mengkhawatirkan perubahan yang Anda buat. Apakah X berfungsi? Apakah itu akan menghancurkan Y? Apakah ada Z yang mungkin terpengaruh? Dengan TDD, itu hilang, karena Anda mengubah ketakutan Anda menjadi ujian, dan kemudian komputer mengotomatiskan kekhawatiran. Pengembang yang lebih berani adalah pengembang yang lebih cepat.


1
+1 untuk lebih sedikit rasa takut. Dan saya telah refactoring basis kode testless minggu ini. . .
Wyatt Barnett

2
Kutipan yang bagus: "Anda mengubah ketakutan Anda menjadi ujian, dan kemudian komputer mengotomatisasi yang mengkhawatirkan"!
RichVel

5
  1. Haruskah saya melihat unit di awal dan mengadopsi pendekatan TDD.

  2. Haruskah saya hanya menulis tes sambil mengikuti setiap bagian selesai.

Salah satu dari ini, tetapi bukan pilihan ketiga .

Seperti dicatat @pdr, mempelajari pengujian unit yang tepat membutuhkan waktu. Anda pasti ingin meluangkan waktu untuk belajar di awal siklus hidup proyek, bukan menjelang akhir ketika tenggat waktu menjulang di atas kepala Anda. Dengan cara ini Anda sudah mencapai kecepatan, dan bahkan dapat mulai memetik manfaat pada saat tenggat waktu semakin dekat, karena telah menangkap sebagian besar bug sebelumnya dalam siklus hidup proyek.

Perhatikan bahwa unit test pertama selalu yang paling sulit, terutama jika Anda menguji kode yang sudah ditulis. Kode semacam itu mungkin tidak ramah uji unit, jadi Anda mungkin mengalami kesulitan untuk menghubungkan semua objek dengan kondisi yang sesuai untuk pengujian. Maka pilihlah beberapa tes tingkat rendah yang mudah, cukup terisolasi, untuk upaya pengujian unit pertama Anda, kemudian secara bertahap Anda dapat meningkatkan tingkat tantangan. Setelah Anda siap fixture tes pertama, test case berikutnya jauh lebih mudah, dan pada saat Anda sampai ke yang keempat, Anda akan menghasilkan test case seperti pada ban berjalan. Saat itulah Anda mulai merasakan kebaikan karena dapat diulang, terbukti membuktikan bahwa kode Anda berfungsi ...

Saya pribadi lebih suka pendekatan TDD dan saya pikir itu tidak begitu menantang - memang butuh ketekunan, tapi saya percaya semakin cepat Anda mulai dengan TDD, semakin cepat Anda mulai melihat manfaat pengujian unit secara keseluruhan. Namun, mungkin beberapa unit tes pertama lebih baik untuk menulis kode yang sudah Anda miliki. Kemudian setelah Anda terbiasa, Anda dapat mulai bereksperimen dengan TDD.


Saya pikir saya akan pergi untuk opsi kedua berdasarkan pada Anda dan saran PDR - untuk opsi tiga, saya benar-benar berarti saya akan melakukan pengujian manual dan hanya menulis tes pada akhirnya untuk memastikan semuanya selesai dengan cara yang seharusnya dan untuk uji apakah ada modifikasi di masa depan.
wilhil

2

Saya pikir hal terbaik bagi seorang pemula untuk dilakukan adalah untuk menangani beberapa kode katas yang cocok untuk pengujian unit. Sebagai contoh; memvalidasi alamat email. TDD menjadi aliran alami setelah Anda menangani beberapa Katas Kode ini. Periksa kata kode berikut untuk validator alamat email yang saya sebutkan: Validator Email

Untuk penjelasan tentang apa itu Code Katas bagi Anda yang tidak tahu, lihat tautan berikut: Code Katas

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.