Mengapa pengujian Tampilan MVC disukai?

23

Saat ini saya sedang menyiapkan landasan untuk aplikasi ASP.Net MVC dan saya sedang mencari ke dalam unit-tes apa yang harus saya siapkan untuk menulis. Saya telah melihat di beberapa tempat orang-orang pada dasarnya mengatakan 'jangan repot-repot menguji pandangan Anda, tidak ada logika dan itu sepele dan akan dibahas oleh tes integrasi'.

Saya tidak mengerti bagaimana ini telah menjadi kebijaksanaan yang diterima. Tes integrasi melayani tujuan yang sama sekali berbeda dari tes unit. Jika saya memecahkan sesuatu, saya tidak ingin tahu setengah jam kemudian ketika tes integrasi saya pecah, saya ingin segera tahu.

Skenario Contoh: Katakanlah kita sedang berurusan dengan aplikasi CRUD standar dengan entitas Pelanggan. Pelanggan memiliki nama dan alamat. Pada setiap tingkat pengujian, saya ingin memverifikasi bahwa logika pengambilan Pelanggan mendapatkan nama dan alamat dengan benar.

Untuk menguji unit repositori, saya menulis tes integrasi untuk mencapai database. Untuk menguji aturan bisnis, saya membuat tiruan repositori, memberi makan data yang sesuai aturan bisnis, dan memverifikasi hasil yang saya harapkan dikembalikan.

Apa yang ingin saya lakukan: Untuk menguji UI, saya mengejek aturan bisnis, mengatur instance pelanggan yang diharapkan, membuat tampilan, dan memverifikasi bahwa view berisi nilai yang sesuai untuk instance yang saya tentukan.

Apa yang saya lakukan: Untuk menguji unit repositori, saya menulis tes integrasi, mengatur login yang sesuai, membuat data yang diperlukan dalam database, membuka browser, menavigasi ke pelanggan, dan memverifikasi halaman yang dihasilkan berisi yang sesuai nilai untuk contoh yang saya tentukan.

Saya menyadari bahwa ada tumpang tindih antara dua skenario yang dibahas di atas, tetapi perbedaan utama waktu dan upaya yang diperlukan untuk mengatur dan menjalankan tes.

Jika saya (atau pengembang lain) menghapus bidang alamat dari tampilan, saya tidak ingin menunggu tes integrasi untuk menemukan ini. Saya ingin ditemukan dan ditandai dalam unit-test yang mendapat beberapa kali setiap hari.

Saya merasa bahwa saya tidak memahami beberapa konsep kunci. Adakah yang bisa menjelaskan mengapa menginginkan umpan balik pengujian segera atas validitas tampilan MVC adalah hal yang buruk? (atau jika tidak buruk, maka bukan cara yang diharapkan untuk mendapatkan umpan balik tersebut)

Peter Bernier
sumber
1
"To unit-test the repository, I write an integration test"Tunggu apa? Itu bukan tes unit repositori. Anda mengotomatiskan tes untuk itu, tetapi kode yang diuji masih menyertakan DAL dan database. Untuk menguji unit repositori, Anda mengisolasinya seperti aturan bisnis Anda.
StuperUser
Unit menguji tampilan yang diberikan seperti yang diharapkan hanyalah pengujian unit bahwa mesin templating Anda berfungsi. Itu seperti unit menguji C Anda yang dikompilasi berisi potongan kode mesin tertentu, unit Anda menguji kompiler bukan kode Anda.
Raynos
2
@ Raynos Dengan Hormat, saya harus tidak setuju. Jika saya (atau pengembang lain) secara keliru menghubungkan UI untuk membuat satu atribut data dalam bidang UI untuk yang lain (Misalnya, 'Nama Depan' di 'Bidang Nama Belakang', itu tidak ada hubungannya dengan mesin templating, atau apakah ini masalah DAL atau BR .. itu jelas masalah yang hanya akan diekspos pada pandangan
Peter Bernier
1
@PeterBernier Anda memiliki poin yang bagus, tetapi saya merasa sulit untuk mendefinisikan garis antara "menguji apakah kompiler berfungsi" dan "menguji apakah kode saya berfungsi". Belum lagi tes untuk UI dipasangkan dengan erat ke UI. Setiap perubahan pada UI menyebabkan tes gagal. Anda tidak dapat benar-benar melakukan segala jenis refactoring UI tanpa menyebabkan tes gagal.
Raynos

Jawaban:

9

Pengujian UI sederhana cukup mudah di ASP.NET MVC. Pada dasarnya yang harus Anda lakukan adalah menegaskan bahwa HTML yang dikembalikan berisi elemen yang Anda butuhkan. Meskipun ini memastikan bahwa halaman HTML terstruktur seperti yang Anda harapkan, itu tidak sepenuhnya menguji UI.

Pengujian UI web yang tepat memerlukan alat seperti Selenium yang akan menggunakan browser di mesin Anda dan memastikan bahwa JavaScript dan HTML berfungsi dengan baik di semua browser. Selenium memang memiliki model klien / server sehingga Anda dapat memiliki satu set mesin virtual dengan klien Unix, Mac, dan Windows dan serangkaian peramban yang umum di lingkungan tersebut.

Sekarang, aplikasi MVC (pola, bukan kerangka) yang dirancang dengan baik menempatkan logika penting dalam model dan pengontrol. Singkatnya, fungsionalitas aplikasi diuji ketika Anda menguji kedua aspek tersebut. Tampilan cenderung hanya memiliki logika tampilan dan mudah diperiksa dengan inspeksi visual. Karena pemrosesan yang tipis dalam tampilan dan sebagian besar aplikasi sedang diuji dengan baik, banyak orang tidak berpikir bahwa rasa sakit menguji lapisan tampilan lebih besar daripada manfaat yang diperolehnya.

Yang mengatakan, MVC memang memiliki beberapa fasilitas bagus untuk memeriksa DOM yang dikembalikan oleh permintaan. Itu mengurangi sedikit rasa sakit untuk menguji lapisan tampilan.

Berin Loritsch
sumber
1
"Pada dasarnya yang harus Anda lakukan adalah menegaskan bahwa HTML yang dikembalikan berisi elemen yang Anda butuhkan." Ini persis apa yang saya coba lakukan dan ternyata tidak sepele. Bisakah Anda menunjuk ke tautan di mana itu akan bekerja dengan tindakan pengontrol tertentu sebagai lawan hanya memberikan kontrol? (Saya telah mengerjakan beberapa artikel, tetapi RenderPartial tidak menyelesaikan apa yang ingin saya lakukan tanpa overhead yang signifikan ..)
Peter Bernier
Anda ingin memeriksa mvccontrib.codeplex.com (MVC Contrib). Ini memberikan bantuan yang tidak terintegrasi dengan bahasa inti, dan direkomendasikan dalam buku "Test-Drive ASP.NET MVC" (programmer pragmatis). Saya masih berpikir Selenium lebih cocok untuk pengujian View.
Berin Loritsch
TestHelper (MVC Contrib): mvccontrib.codeplex.com/...
Berin Loritsch
Selenium (dalam kasus saya Selenium RC) adalah apa yang akan saya gunakan untuk tes integrasi saya. Yang saya inginkan adalah kegagalan terjadi sebelum titik itu.
Peter Bernier
2
@ Peter: Komentar Anda tentang upaya Anda menjadi "non-sepele" adalah alasan mengapa pandangan pengujian unit disukai. Akibatnya, strategi tipikal adalah membuat tampilan setipis mungkin (yaitu tidak mengandung logika bisnis), sehingga sebagian besar pengujian unit dapat dilakukan di tempat lain (umumnya di ViewModel). Pandangan itu sendiri dapat diverifikasi dengan inspeksi visual, atau dengan alat pengujian UI seperti Selenium.
Robert Harvey
7

Saya tidak akan mengatakan itu disukai. Sebaliknya, sentimen itu adalah hasil dari fakta bahwa pengujian MVC pandangan unit (setidaknya dari berbagai aspx) cukup sulit karena pandangan aspx memiliki terlalu banyak ketergantungan pada WebForms, yang dengan sendirinya sangat tidak dapat diuji. Jadi argumennya adalah bahwa itu tidak sepadan dengan usaha karena pandangannya cenderung tidak rumit.

Tentu saja tampilan bisa sangat rumit sehingga itu pilihan Anda.

marcind
sumber
3
Tampilan ASP.NET MVC tidak terkait dengan Webforms, sejauh yang saya ketahui. Bukankah salah satu poin besar terjadi untuk ASP.NET MVC bahwa itu bukan Webforms?
Adam Lear
Pandangan saya adalah bahwa dibutuhkan lebih banyak upaya manusia untuk menulis tes integrasi untuk mencakup UI, daripada menulis 'unit-test' nyata untuk mencakup pandangan. Itu sebabnya saya mencoba untuk memahami beberapa hambatan yang tampaknya ada di luar sana terhadap penulisan unit-tes untuk pandangan.
Peter Bernier
Pandangan @Anna Aspx dibangun di atas WebForms. Mereka berasal dari System.Web.UI.WebControls.Pagekelas, menggunakan <asp:ContentPlaceholder>kontrol dll. Cara MVC mengeksekusi mereka menghindari banyak pipa eksekusi Page yang biasanya terkait dengan WebForms tetapi masih menggunakan banyak hal WebForms di bawah selimut.
marcind
Jika Anda menggunakan mesin tampilan yang berbeda (seperti pisau cukur), Anda harus dapat bergerak lebih jauh dari mesin Webforms.
The Muffin Man
6

Saya tidak yakin itu disukai. Testabilitas adalah salah satu manfaat utama menggunakan ASP.NET MVC. Lihatlah blog Steve Sanderson untuk informasi lebih lanjut tentang ini.

Dia juga menulis buku ASP.MVC (IMO) tangan-ke-bawah terbaik di luar sana. Dia tidak hanya mengajar MVC, tapi dia juga mengajarkan praktik terbaik di sekitarnya, termasuk praktik pengujian.

Saya pikir saya perlu mengklarifikasi sedikit pada pandangan pengujian unit - Anda dapat membangun tes unit di sekitar hasil yang dikembalikan dari controller (ActionResult, dll.). Anda masih perlu melakukan pengujian lain untuk interaksi UI dan UI yang sebenarnya.

Mark Freedman
sumber
"Anda masih perlu melakukan pengujian lain untuk interaksi UI dan UI yang sebenarnya." Itulah tepatnya pertanyaan saya .. mengapa tes UI tiba-tiba menjadi bagian dari 'pengujian lain' (yaitu, pengujian integrasi). Saya telah melihat banyak konten Steve Sanderson dan itulah yang membuat saya memulai jalan ini, pada dasarnya mencoba untuk meniru apa yang dia lakukan dengan proyek 'MvcFakes' dan mengalami masalah dengan kode yang ditulis untuk rilis MVC yang lebih lama. .
Peter Bernier
1

Anda dapat mempelajari cara menguji Tampilan yang dikembalikan oleh tindakan pengontrol, cara menguji Data Tampilan yang dikembalikan oleh tindakan pengontrol, dan cara menguji apakah satu tindakan pengontrol mengarahkan Anda ke tindakan pengontrol kedua dengan memeriksa URL berikut, jelaskan dalam artikel singkat ini tentang Menguji Tampilan Data dalam MVC .

Jaypee
sumber