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)
"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.