MVC Görünümleri testi neden kaşlarını çattı?


23

Şu anda bir ASP.Net MVC uygulaması için temel hazırlığı yapıyorum ve ne tür birim testleri yazmaya hazırlanacağımı araştırıyorum. İnsanların temelde 'görüşlerinizi sınama zahmetine girmeyin, mantık yok ve önemsiz ve bir entegrasyon testiyle kaplanacak' diyen birçok yerde gördüm.

Bunun nasıl kabul edilen bir bilgelik haline geldiğini anlamıyorum. Entegrasyon testleri, birim testlerinden tamamen farklı bir amaca hizmet eder. Bir şeyi kırarsam, entegrasyon testlerim ne zaman kesilirse yarım saat sonra bilmek istemiyorum, hemen bilmek istiyorum.

Örnek Senaryo: Diyelim ki Müşteri varlığına sahip standart bir CRUD uygulamasıyla uğraşıyoruz. Müşterinin bir adı ve adresi var. Her test düzeyinde, Müşteri erişim mantığının hem adı hem de adresi doğru aldığını doğrulamak istiyorum.

Depoyu test etmek için veritabanına isabet eden bir entegrasyon testi yazıyorum. İş kurallarını test etmek için depoyu alay ettim, iş kurallarına uygun verileri besledim ve beklenen sonuçların geri döndüğünü doğruladım.

Ne yapmak isterim: Kullanıcı Arabirimini test etmek için, iş kurallarını aştım, beklenen müşteri örneğimi hazırladım, görünümü oluşturdum ve görünümün belirlediğim örnek için uygun değerleri içerdiğini doğruladım.

Yapmam gereken şey: Depoyu birim test etmek için bir entegrasyon testi yazıyorum, uygun bir giriş ayarlıyorum, veritabanında gerekli verileri oluşturuyorum, bir tarayıcı açıyorum, müşteriye gidiyorum ve sonuçta ortaya çıkan sayfanın uygun içeriği içerdiğini doğrulıyorum belirttiğim örnek için değerler.

Yukarıda tartışılan iki senaryo arasında örtüşme olduğunun farkındayım, ancak testlerin kurulumu ve yürütülmesi için gereken zaman ve çaba arasındaki temel fark.

Ben (veya başka bir dev) adres alanını görünümden kaldırırsa, entegrasyon testinin bunu keşfetmesini beklemek istemiyorum. Günde birçok kez yapılan bir birim testinde keşfedilmeyi ve işaretlenmesini istiyorum.

Bazı anahtar kavramları kavramadığım hissine kapılıyorum. Birisi MVC görüşünün geçerliliği hakkında derhal test geri bildirimi almak isteğinin neden kötü olduğunu açıklayabilir mi? (veya fena değilse, o zaman söylenen geri bildirimi almanın beklenen yolu değil)


1
"To unit-test the repository, I write an integration test"Bir dakika ne? Bu havuzun birim testi değil. Test için otomatikleştiriyorsunuz, ancak test altındaki kod hala DAL ve veritabanını içeriyor. Havuzu test etmek için, iş kurallarınız için olduğu gibi izole etmenizi sağlar.
StuperUser

Beklendiği gibi görüntülenen görünümü test etmek, sadece şablon motorunuzun çalıştığını test eder. Bu, derlenmiş C'nizin birim testini yapmak gibi bir takım makine kodu parçaları içerir, biriminiz derleyicinizi kodunuzu değil test eder.
Raynos

2
@Raynos Saygılarımla, katılmıyorum zorundayım. Ben (veya başka bir geliştirici) yanlışlıkla UI'yi bir UI alanındaki bir veri özniteliğini bir başkası için oluşturması için kablolarsa (Örneğin, 'Soyadı Alanındaki' İlk Ad '), şablon motorla ilgisi yoktur. DAL veya BR meselesi mi? Bu, sadece görüş açısına maruz kalacak bir problemdir
Peter Bernier

1
@ PeterBernier size iyi bir noktaya sahip, ancak "derleyicinin çalışıp çalışmadığını test etme" ile "kodumun çalışıp çalışmadığını test etme" arasındaki çizgiyi tanımlamakta zorlanıyorum. Kullanıcı Arabirimi için yapılan testlerin kullanıcı arabirimine sıkıca bağlı olduğundan bahsetmiyorum bile. Kullanıcı arabiriminde yapılan değişiklikler testlerin başarısız olmasına neden olur. Bir testin başarısız olmasına neden olmadan UI'nin herhangi bir şekilde yeniden yapılandırmasını gerçekten yapamazsınız.
Raynos

Yanıtlar:


9

ASP.NET MVC'de basit kullanıcı arayüzü testi yeterince kolaydır. Temel olarak tek yapmanız gereken, döndürülen HTML'nin ihtiyacınız olan öğeleri içerdiğini iddia etmek. Bu, HTML sayfasının beklediğiniz şekilde yapılandırılmasını sağlarken, kullanıcı arayüzünü tam olarak test etmez.

Doğru web UI testi, makinenizde tarayıcıları kullanacak ve JavaScript ve HTML'nin tüm tarayıcılarda düzgün çalıştığından emin olacak Selenium gibi bir araç gerektirir. Selenium'un bir istemci / sunucu modeli vardır, böylece Unix, Mac ve Windows istemcileri ve bu ortamlar için ortak olan tarayıcılar grubuna sahip bir dizi sanal makineye sahip olabilirsiniz.

Şimdi, iyi tasarlanmış bir MVC (şablon değil çerçeve) uygulaması , model ve kontrolörlerde önemli mantığı ortaya koymaktadır . Kısacası, bu iki yönü test ettiğinizde uygulamanın işlevselliği test edilir. Görünümler yalnızca ekran mantığına sahip olma eğilimindedir ve görsel inceleme ile kolayca kontrol edilebilir. Görünüşe göre ince işleme ve uygulamanın büyük bir kısmı iyi test edildiğinden, birçok kişi görünüm katmanını test etmenin acısından kazanılan faydadan daha ağır basacağını düşünmüyor.

Bununla birlikte, MVC'nin isteğin döndürdüğü DOM'yi kontrol etmek için bazı güzel tesisleri var. Bu, görüntü katmanını test etmek için ağrıyı biraz azaltır.


1
"Esasen yapmanız gereken tek şey, iade edilen HTML'nin ihtiyacınız olan unsurları içerdiğini iddia etmek." Bu tam olarak yapmaya çalıştığım şey ve önemsiz olduğu ortaya çıkıyor. Bunun sadece bir kontrol yapmak yerine, belirli bir kontrolör eylemiyle çalışacağı bir bağlantıya işaret edebilir misiniz? (Birkaç yazı yazdım, ancak RenderPartial önemli bir ek yük olmadan yapmak istediklerimi yerine getirmiyor ..)
Peter Bernier

Mvccontrib.codeplex.com (MVC Contrib) 'ı incelemek isteyeceksiniz . Bu, ana dilde yerleşik olmayan ve "Test-Drive ASP.NET MVC" kitabında (pragmatik programcılar) tavsiye edildi. Yine de selenyumun View testi için daha iyi bir eşleşme olduğunu düşünüyorum.
Berin Loritsch

TestHelper (MVC Katkıda): mvccontrib.codeplex.com/…
Berin Loritsch

Selenyum (benim durumumda Selenyum RC) entegrasyon sınavlarım için kullanacağım şey. İstediğim şey, bu noktadan önce bir başarısızlığın gerçekleşmesi.
Peter Bernier

2
@Peter: "Önemsiz olmayan" olma çabalarınız hakkındaki yorumunuz, ünite test görüşlerinin kaşlarını çatmasının nedenidir. Sonuç olarak, tipik bir strateji görüşlerin mümkün olduğu kadar ince (yani iş mantığı içermeyen) yapılmasıdır, böylece birim testlerinin çoğu başka bir yerde (genellikle ViewModel'de) yapılabilir. Görüşlerin kendileri görsel inceleme veya Selenyum gibi bir UI test aracıyla doğrulanabilir.
Robert Harvey

7

Kaşlarını çattığını söyleyemem. Aksine, bu duyarlılık, birim test MVC görünümlerinin (en azından aspx çeşidinin en azından) oldukça zor olmasının bir sonucudur, çünkü aspx görünümleri, kendilerini oldukça dengelenmeyen WebForms'a çok fazla bağımlıdır. Dolayısıyla argüman buna değmez çünkü görüşlerin o kadar da karmaşık olmadığına işaret ediyor.

Tabii ki görüşleriniz oldukça karmaşıklaşabilir, bu yüzden sizin seçiminiz.


3
ASP.NET MVC görünümleri, bildiğim kadarıyla Webform'lara bağlı değil. ASP.NET MVC’nin Webform olmayan önemli noktalarından biri değil mi?
Adam Lear

Benim görüşüme göre, kullanıcı arayüzünü kapsayacak entegrasyon testlerini yazmak, görüşlerini kapsayan gerçek bir ünite testi yazmaktan daha insani bir çaba gerektiriyor. Bu nedenle, görüşler için ünite testleri yazmaya karşı ortaya çıkan direnişin bir kısmını anlamaya çalışıyorum.
Peter Bernier

@Anna Aspx görünümleri, WebForms üzerine kuruludur. Sınıftan türetilirler System.Web.UI.WebControls.Page, <asp:ContentPlaceholder>kontroller vb. Kullanırlar. MVC'nin yürütme şekli, genellikle WebForms ile ilişkilendirilmiş çok sayıda Sayfa yürütme boru hattından kaçınır, ancak yine de kapakların altında birçok WebForms öğesi kullanır.
marcind

Farklı bir görünüm motoru (jilet gibi) kullanıyorsanız, Webforms motorundan daha uzağa hareket edebilmeniz gerekir.
Çörek Adam

6

Kaşlarını çattığından emin değilim. Test edilebilirlik, ASP.NET MVC kullanmanın temel faydalarından biridir. Bu konuda daha fazla bilgi için Steve Sanderson'ın bloguna göz atın .

Ayrıca, orada hands-down, en iyi ASP.MVC kitabı (IMO) yazdı . Yalnızca MVC'yi öğretmekle kalmaz, aynı zamanda test uygulamaları da dahil olmak üzere etrafındaki en iyi uygulamaları öğretmek için yukarıda ve öteye gider.

Birim test görünümlerini açıklığa kavuşturmam gerektiğini düşünüyorum - denetleyiciden döndürülen sonuç etrafında birim testleri oluşturabilirsiniz (ActionResult, vb.). Gerçek kullanıcı arayüzü ve kullanıcı arayüzü etkileşimi için başka testler yapmanız gerekecek.


"Gerçek kullanıcı arayüzü ve kullanıcı arayüzü etkileşimi için başka testler yapmanız gerekecek." Bu tam olarak benim meselem. Bu UI testleri neden birdenbire 'diğer testlerin' bir parçası oldu (ör. Entegrasyon testi). Steve Sanderson içeriğinin birçoğunu görmüştüm ve bu yoldan başlamama neden olan bir şey, temelde 'MvcFakes' projesiyle yaptıklarını çoğaltmaya çalışıyor ve eski MVC sürümleri için kodunun yazılmasıyla ilgili sorunların içine giriyor. .
Peter Bernier,

1

Bir denetleyici eylemi tarafından döndürülen Görünümü test etmeyi, denetleyici eylemi tarafından döndürülen Görüntü Verisini test etmeyi ve bir denetleyici eyleminin sizi ikinci bir denetleyici eylemine yönlendirip yönlendirmeyeceğini ve aşağıdaki URL'yi kontrol ederek öğrenmeyi öğrenebilirsiniz, MVC’deki View View Test’i hakkında bu kısa makalede açıklayın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.