Dlaczego marne jest testowanie widoków MVC?

23

Obecnie przygotowuję grunt pod aplikację ASP.Net MVC i zastanawiam się, jakie testy jednostkowe powinienem przygotować. Widziałem w wielu miejscach, że ludzie w zasadzie mówią „nie zawracaj sobie głowy testowaniem swoich poglądów, nie ma logiki i jest to trywialne i zostanie objęte testem integracyjnym”.

Nie rozumiem, w jaki sposób stało się to przyjętą mądrością. Testy integracyjne służą zupełnie innym celom niż testy jednostkowe. Jeśli coś popsuję, nie chcę wiedzieć pół godziny później, kiedy kończą się moje testy integracyjne, chcę wiedzieć natychmiast.

Przykładowy scenariusz: Załóżmy, że mamy do czynienia ze standardową aplikacją CRUD z jednostką klienta. Klient ma nazwę i adres. Na każdym poziomie testowania chcę sprawdzić, czy logika pobierania klienta poprawnie pobiera zarówno nazwę, jak i adres.

Aby przeprowadzić test jednostkowy repozytorium, piszę test integracji, aby trafić do bazy danych. Aby przeprowadzić test jednostkowy reguł biznesowych, wyśmiewam repozytorium, wprowadzam odpowiednie reguły biznesowe i sprawdzam, czy oczekiwane wyniki są zwracane.

Co chciałbym zrobić: aby przetestować interfejs użytkownika, kpię z reguł biznesowych, konfiguruję oczekiwaną instancję klienta, renderuję widok i sprawdzam, czy widok zawiera odpowiednie wartości dla określonej instancji.

Co mnie utknęło: Aby przeprowadzić test jednostkowy repozytorium, piszę test integracji, konfiguruję odpowiedni login, tworzę wymagane dane w bazie danych, otwieram przeglądarkę, nawiguję do klienta i sprawdzam, czy wynikowa strona zawiera odpowiednią wartości dla podanej instancji.

Zdaję sobie sprawę, że oba powyższe scenariusze pokrywają się, ale kluczową różnicą jest czas i wysiłek wymagany do skonfigurowania i wykonania testów.

Jeśli ja (lub inny programista) usunę pole adresu z widoku, nie chcę czekać na test integracji, aby to odkryć. Chcę, aby został wykryty i oznaczony w teście jednostkowym, który dostaje się wiele razy dziennie.

Mam wrażenie, że nie rozumiem żadnej kluczowej koncepcji. Czy ktoś może wyjaśnić, dlaczego brak natychmiastowej informacji zwrotnej z testu na temat ważności widoku MVC jest złą rzeczą? (lub jeśli nie jest źle, nie jest to oczekiwany sposób uzyskania opinii)

Peter Bernier
źródło
1
"To unit-test the repository, I write an integration test"Czekaj, co? To nie jest test jednostkowy repozytorium. Automatyzujesz test, ale testowany kod nadal zawiera DAL i bazę danych. Aby przetestować repozytorium w trybie jednostkowym, musisz go odizolować tak, jak w przypadku reguł biznesowych.
StuperUser
Testowanie jednostkowe widok renderowany zgodnie z oczekiwaniami to tylko testowanie jednostkowe działania silnika szablonów. To tak, jakby jednostka testowała skompilowany C zawiera pewne fragmenty kodu maszynowego, a jednostka testowała kompilator, a nie kod.
Raynos,
2
@Raynos Z szacunkiem będę musiał się nie zgodzić. Jeśli ja (lub inny programista) omyłkowo podłączyłem interfejs użytkownika, aby renderować jeden atrybut danych w polu interfejsu użytkownika dla innego (na przykład „Imię” w „polu Nazwisko”), nie ma to nic wspólnego z silnikiem szablonów, ani czy jest to problem DAL lub BR ... to wyraźnie problem, który zostałby ujawniony tylko na widoku
Peter Bernier
1
@PeterBernier masz rację, ale trudno mi zdefiniować linię między „testowaniem, czy kompilator działa” a „testowaniem, czy mój kod działa”. Nie wspominając o tym, że testy interfejsu użytkownika są ściśle powiązane z interfejsem użytkownika. Wszelkie zmiany w interfejsie użytkownika powodują niepowodzenie testów. Nie można tak naprawdę zrefaktoryzować interfejsu użytkownika, nie powodując niepowodzenia testu.
Raynos,

Odpowiedzi:

9

Proste testowanie interfejsu użytkownika jest dość łatwe w ASP.NET MVC. Zasadniczo wszystko, co musisz zrobić, to upewnić się, że zwrócony kod HTML zawiera potrzebne elementy. Chociaż zapewnia to taką strukturę strony HTML, jakiej oczekujesz, nie w pełni testuje ona interfejs użytkownika.

Prawidłowe testowanie interfejsu internetowego wymaga narzędzia takiego jak Selenium, które będzie korzystało z przeglądarek na twoim komputerze i zapewni, że JavaScript i HTML działają poprawnie we wszystkich przeglądarkach. Selenium ma model klient / serwer, dzięki czemu możesz mieć zestaw maszyn wirtualnych z klientami Unix, Mac i Windows oraz zestaw przeglądarek wspólnych dla tych środowisk.

Teraz dobrze zaprojektowana aplikacja MVC (wzorzec, a nie framework) umieszcza ważną logikę w modelach i kontrolerach. Krótko mówiąc, funkcjonalność aplikacji jest testowana podczas testowania tych dwóch aspektów. Widoki mają zwykle logikę wyświetlania i można je łatwo sprawdzić za pomocą kontroli wzrokowej. Ze względu na cienkie przetwarzanie w widoku i dużą część aplikacji, która została dobrze przetestowana, wiele osób nie sądzi, że ból związany z testowaniem warstwy widoku przeważa nad korzyściami z niej uzyskanymi.

To powiedziawszy, MVC ma kilka fajnych udogodnień do sprawdzenia DOM zwróconego przez żądanie. To znacznie zmniejsza ból podczas testowania warstwy widoku.

Berin Loritsch
źródło
1
„Zasadniczo wszystko, co musisz zrobić, to potwierdzić, że zwrócony kod HTML zawiera potrzebne elementy”. Właśnie to staram się zrobić i okazuje się, że nie jest trywialne. Czy możesz wskazać link, który będzie działał z określoną akcją kontrolera, a nie tylko renderowaniem formantu? (Pracowałem przez kilka napisać firm, ale renderPartial nie jest osiąganie co chcę zrobić bez znaczącego narzutu ..)
Peter Bernierem
Będziesz chciał sprawdzić mvccontrib.codeplex.com (MVC Contrib). Zapewnia to pomoc, która nie została wbudowana w podstawowy język i została zalecona w książce „Test-Drive ASP.NET MVC” (programiści pragmatyczni). Nadal uważam, że Selenium lepiej pasuje do testów View.
Berin Loritsch,
TestHelper (MVC Contrib): mvccontrib.codeplex.com/…
Berin Loritsch
Selenium (w moim przypadku Selenium RC) będzie tym, czego będę używać do moich testów integracyjnych. Chcę, aby nie doszło do tego przed tym punktem.
Peter Bernier,
2
@Peter: Twój komentarz na temat tego, że twoje wysiłki są „nietrywialne”, jest dokładnie powodem, dla którego poglądy na temat testów jednostkowych są niezadowolone. W związku z tym typową strategią jest możliwie jak najcieńsze widoki (tj. Nie zawierające logiki biznesowej), aby większość testów jednostkowych mogła odbyć się gdzie indziej (zazwyczaj w ViewModel). Same widoki można zweryfikować poprzez kontrolę wizualną lub za pomocą narzędzia do testowania interfejsu użytkownika, takiego jak Selenium.
Robert Harvey
7

Nie powiedziałbym, że to marszczy brwi. Ten sentyment wynika raczej z faktu, że testowanie jednostkowe widoków MVC (przynajmniej odmiany aspx) jest dość trudne, ponieważ widoki aspx mają zbyt dużą zależność od formularzy WebForm, które same są dość niestabilne. Argumentuje więc, że nie warto tego robić, ponieważ poglądy nie są tak skomplikowane.

Oczywiście widoki mogą być dość skomplikowane, więc to twój wybór.

marcind
źródło
3
O ile mi wiadomo, widoki ASP.NET MVC nie są powiązane z formularzami internetowymi. Czy to nie jedna z głównych zalet ASP.NET MVC, że nie są to formularze internetowe?
Adam Lear
Moim punktem widzenia jest to, że napisanie testów integracyjnych w celu uwzględnienia interfejsu użytkownika wymaga większego wysiłku ludzkiego, niż napisanie prawdziwych „testów jednostkowych” obejmujących widoki. Właśnie dlatego staram się zrozumieć część oporu, który wydaje się istnieć w stosunku do pisania testów jednostkowych dla widoków.
Peter Bernier,
Widoki @Anna Aspx są oparte na WebFormach. Wywodzą się z System.Web.UI.WebControls.Pageklasy, używają <asp:ContentPlaceholder>kontrolek itp. Sposób, w jaki MVC je wykonuje, pozwala uniknąć wielu potoków wykonywania strony zwykle związanych z WebForms, ale nadal używa wielu funkcji WebForms pod przykryciem.
marcind
Jeśli używasz innego silnika widoku (takiego jak maszynka do golenia), powinieneś być w stanie oddalić się od silnika Webforms.
The Muffin Man,
6

Nie jestem pewien, czy ktoś na to patrzy. Testowalność jest jedną z kluczowych zalet korzystania z ASP.NET MVC. Sprawdź blog Steve Sanderson aby uzyskać więcej informacji na ten temat.

Napisał także praktyczną, najlepszą książkę ASP.MVC (IMO). Nie tylko uczy MVC, ale robi wszystko, aby uczyć najlepszych praktyk, w tym testów.

Myślę, że muszę nieco wyjaśnić widoki testów jednostkowych - możesz budować testy jednostkowe na podstawie wyników zwróconych przez kontroler (ActionResult itp.). Nadal będziesz musiał przeprowadzić inne testy rzeczywistego interfejsu użytkownika i interakcji interfejsu użytkownika.

Mark Freedman
źródło
„Nadal będziesz musiał przeprowadzić inne testy rzeczywistego interfejsu użytkownika i interakcji interfejsu użytkownika”. Właśnie o to mi chodzi. Dlaczego testy interfejsu użytkownika nagle stają się częścią „innych testów” (tj. Testów integracyjnych). Widziałem wiele treści Steve'a Sandersona i to właśnie zaczęło mnie na tej drodze, w zasadzie próbując powtórzyć to, co robi ze swoim projektem „MvcFakes” i napotykać problemy z pisaniem kodu do starszych wersji MVC. .
Peter Bernier
1

Możesz dowiedzieć się, jak przetestować widok zwrócony przez akcję kontrolera, jak przetestować widok danych zwrócony przez akcję kontrolera oraz jak sprawdzić, czy jedna akcja kontrolera przekierowuje Cię do drugiej akcji kontrolera, sprawdzając następujący adres URL, opisz w tym krótkim artykule na temat testowania danych w MVC .

Jaypee
źródło