Seberapa jauh dengan unit test

11

Sebuah pertanyaan yang diajukan berkali-kali sebelumnya tetapi dengan pengembangan miring miring khusus.

Saya sudah menjadi anak yang sangat baik dan telah mengkodekan semua tindakan kontroler saya dengan unit test yang sesuai yang sangat bagus (jika sedikit [baca LOT] berulang kali). Sejujurnya, saya sebenarnya telah membuat template T4 kecil untuk menulis sebagian besar tulang telanjang dari tes unit awal dan kemudian men-tweak yang sesuai sesuai penggunaan. Saya akui tidak begitu yakin bagaimana menangani tes dalam pandangan yang mengandung sebagian pandangan - tapi itu cerita untuk pertanyaan lain.

Sekarang, bagian yang sulit bagi saya untuk memutuskan adalah seberapa dalam cakupan harus di lapisan layanan saya. Alasannya adalah bahwa beberapa metode layanan saya (baik atau buruk) sebenarnya melakukan berbagai permintaan LINQ yang kemudian menyediakan informasi rahasia ke logika selanjutnya dalam metode tersebut. Saya tahu saya bisa (harus ??) memecah metode ini hanya memanggil logika yang diperlukan untuk setiap pernyataan LINQ dan kemudian menerapkannya dalam metode. Namun, dalam banyak contoh, tidak pernah ada penggunaan kembali fungsi 'LINQ dan oleh karena itu merasa bahwa ini akan memperbaiki kode keluar tingkat terlalu jauh.

Yang saya tanyakan adalah, dengan logika kompleks yang terjadi dalam suatu metode, apakah 'cukup baik' untuk memiliki metode pengujian yang hanya menyatakan hasil yang diperlukan dan / atau kesalahan yang diharapkan, atau haruskah setiap garis logika disimulasikan dan diuji juga. cara saya melihatnya, untuk melakukan pengujian dengan benar, maka metode logika (baris demi baris) harus mendapatkan semacam cakupan juga. Namun demikian (menurut pendapat saya yang naif) dapat mengarah pada siklus yang tidak pernah berakhir dari mencoba untuk menjaga tes dan metode yang diterapkan sangat selaras (yang saya tahu mereka seharusnya) untuk menciptakan industri rumahan dalam tes itu sendiri.

Saya tahu pertanyaan saya mungkin menyinggung beberapa penggemar TDD yang akan melihat ini sebagai tidak punya otak. Tidak berada di kamp TDD, ini adalah 'ya otak' bagi saya, maka pertanyaannya.

btw - telah memeriksa ide ini:

http://dotnetslackers.com/articles/aspnet/Built-in-Unit-Test-for-ASP-NET-MVC-3-in-Visual-Studio-2010-Part-1.aspx

mencari fwd ke downvotes stabil sekarang :)

[sunting] - untuk kepentingan single (baik pada saat single !!) pemilih 'dekat'. pertanyaan ini tidak subyektif. Saya mencari konsensus tentang topik yang sangat fokus. Saya tidak berusaha untuk membangkitkan gairah negatif, saya tidak ingin mengekspos kelemahan dalam teknologi - saya penggemar yang BESAR. Jadi tolong, berikan komentar sopan untuk keuntungan saya jika memilih untuk ditutup karena dapat membantu saya merestrukturisasi pertanyaan jika ada ambiguitas atau kesalahan informasi. pertanyaan ini dapat bermanfaat bagi sebagian besar populasi mvc.

Terima kasih!!

Jim

Jim
sumber
Voting (pertama) yang ditutup adalah milik saya, tetapi bukan sebagai 'subyektif dan argumentatif' (yang bukan ini), tetapi sebagai 'migrasi ke programmer.stackexchange.com', karena ini bukan pertanyaan pemrograman khusus dengan satu jawaban jelas.
aakashm, dihargai dan dipahami. bukan penggalian, hanya ingin tahu :)
jim

Jawaban:

4

Pertama apa yang Anda bicarakan tidak terdengar seperti TDD. TDD menyiratkan pendekatan uji pertama yaitu tentang mendorong desain sistem Anda dengan mengikuti pola Test-> Code-> Refactor . Jadi mungkin masalah pertama Anda adalah tujuan dari tes Anda, apakah Anda menuliskannya sebagai kode Anda? Jika demikian, saya berharap bahwa hampir semua logika dalam pengujian Anda berhubungan kembali dengan beberapa unit test. Karenanya, cakupan kode yang tinggi merupakan hasil tidak langsung dari penerapan TDD.

Ketika Anda melakukan TDD Anda menulis kode uji yang cukup untuk memotivasi kode yang ingin Anda tulis. Anda juga memastikan tes gagal terlebih dahulu. Pada dasarnya tanyakan pada diri sendiri apa yang perlu dilakukan metode ini. Kemudian Anda kode itu, tetapi hanya cukup untuk membuat lulus tes, jika bukan itu yang Anda cari maka Anda menulis tes tambahan dan kemudian refactor metode tersebut.

Cakupan kode setelah faktanya bukan metode yang efektif untuk mengukur kepatuhan Anda terhadap TDD, meskipun Anda biasanya akan menemukan cakupan kode yang sangat tinggi dalam kode yang ditulis menggunakan TDD lakukan untuk fakta bahwa semua kode harus dimotivasi oleh beberapa tes.

Tes TDD berfungsi untuk mendorong desain dan dokumen serta menjelaskan desain tersebut kepada orang lain dalam bahasa sederhana (jadi bagaimana Anda menyebutkan tes Anda sangat penting).

Namun tidak satu pun dari ocehan ini benar-benar menjawab pertanyaan Anda secara langsung jadi saya hanya akan mengatakan, Anda harus bertujuan untuk kode cakupan layanan (non-UI) yang cukup tinggi, terutama di mana ada logika non-trival, dan bahkan lebih baik jika tes ditulis terlebih dahulu ;-). Faktanya adalah (walaupun beberapa mungkin tidak setuju) bahwa lebih banyak tes umumnya lebih baik. Banyak proyek open source berkualitas tinggi memiliki jauh lebih banyak kode uji daripada menjalankan kode.

Selain itu, tes harus ditulis setiap kali:

  1. Anda menulis kode baru, tes harus mengarahkan dan mendokumentasikan desain Anda dan menjelaskan asumsi Anda tentang apa yang harus dilakukan kode. Itu harus ditulis sebelum Anda kode.

  2. Anda menemukan bug, tes yang gagal harus menunjukkan bug. Ketika bug diperbaiki, tes harus lulus.

  3. Anda mengubah kode dengan cara yang mengubah sifat dari apa yang dilakukan oleh suatu metode atau kelas (walaupun jika banyak tes gagal ketika satu area kode berubah, ini dapat mengindikasikan tes rapuh). Ini membuat tes mendokumentasikan kode dengan benar.

Secara pribadi, saya telah menemukan bahwa belajar TDD adalah tantangan yang menarik, dan butuh waktu untuk mengembangkan "firasat" yang baik untuk itu. Berlatih, berlatih, berlatih telah menjadi cara terbaik untuk belajar bagi saya. Itu dan membaca kode uji dari proyek sumber terbuka dan sekarang juga berkontribusi pada mereka saat menulis tes baru dengan perubahan saya.

Chris Nicola
sumber
+1 chris - saya suka potongan jib Anda :-), tetapi yang lebih penting, Anda tunjukkan (saya mengerti perbedaannya) pemisahan antara pengujian unit dan TDD. saya adalah model yang agak hybrid (ya !!)
jim
Ya saya pikir itu mungkin sesuatu yang Anda kenal, tapi tetap saja layak disebut. Saya juga berpikir kita semua mungkin memiliki model hybrid. Saya menemukan diri saya melakukan lebih banyak tes pertama belakangan ini. Saya merasa bahwa beralih ke MSpec dan tes gaya spesifikasi membantu. Meskipun saya masih menulis beberapa kode saya tidak bisa diganggu untuk menguji dulu.
Chris Nicola
... dengan malu aku menganggukkan kepalaku menyetujui kalimat terakhirmu :)
jim
0

Sudah jelas bahwa pengujian hanya nilai pengembalian suatu metode kurang kuat daripada menguji semua cabang di dalamnya. Input alternatif tidak akan dijamin perilaku yang benar.

Di sisi lain, Anda mungkin tidak punya cukup waktu atau kesabaran untuk menguji semuanya.

Yang dapat Anda lakukan adalah memutuskan berapa banyak kode yang ingin Anda tutupi dengan tes (80-90% atau apa pun) dan menegakkannya dengan menggunakan alat otomatis yang memverifikasi ini.
"Tidak pernah berakhir siklus" dari tes menulis akan terjadi hanya jika siklus penulisan kode juga tidak pernah berakhir :)

Cosmin
sumber
cosmin -kamu jelas belum melihat kode saya. kembali ke treadmill ... :-)
jim
0

Seberapa yakin Anda ingin kode Anda berfungsi dengan baik? Pengujian unit hanyalah satu alat di tas programmer untuk membantu memverifikasi bahwa implementasi Anda melakukan apa yang menurut spesifikasi perlu dilakukan. Anda mungkin tidak memerlukan cakupan 100%, tetapi Anda harus menulis unit test untuk mencakup bagian yang lebih penting dari kode Anda. Itu selalu baik untuk memastikan bahwa metode Anda bekerja bersama dengan baik, tidak hanya sendirian, dan karena itu Anda harus mencoba menulis beberapa tes yang mencakup beberapa "garis logika" Anda yang lebih penting.

FreeAsInBeer
sumber
0

Menjalankan tes unit dengan cakupan kode yang diaktifkan di Visual Studio akan memberi Anda indikasi yang baik (dan grafis) tentang seberapa baik kode Anda dicakup.

Jika Anda tidak menggunakan kerangka kerja MSTest inbuilt, Anda mungkin perlu melihat produk cakupan kode pihak ketiga untuk bekerja dengan NUnit atau ikuti instruksi di sini: /programming/2665799/does-vs2010-code -coverage-support-nunit

DaveRead
sumber