Wiem, że powodem, dla którego Microsoft wyszedł z ASP.NET MVC było uczynienie prostszym do zrobienia Test Driven Design (TDD) dla ASP.NET. Mam jednak dość dużą brązową (istniejącą) aplikację na ASP.NET WebForms, którą chciałbym zaimplementować w niektórych funkcjach typu TDD. Zakładam, że jest to sposób, aby to zrobić, ale jakie są pewne realne opcje?Jak zaimplementować TDD w ASP.NET WebForms
Odpowiedz
Microsoft wprowadził ASP.NET MVC, ponieważ uważał, że może zarabiać pieniądze na niewykorzystanym rynku - tych, którzy uważają, że formularze sieci Web są zbyt "ciężkie" i którzy programują przy użyciu lżejszej platformy. Dotyczy to również tych, którzy są przyzwyczajeni do paradygmatu MVC.
Obejmuje również tych, którzy nie mogli dowiedzieć się, jak wykonywać testy jednostkowe w formularzach internetowych i którzy chcą korzystać z testów jednostkowych i TDD.
Sposób na to, jak w przypadku formularzy internetowych, podobnie jak w przypadku innych elementów, polega na oddzieleniu wszystkiego poza kodem interfejsu użytkownika na oddzielne klasy w bibliotece klas. Użyj TDD, aby rozwinąć te klasy.
Następną warstwą kontrowersji jest to, czy konieczne jest użycie TDD do rozwinięcia pozostałej części kodu: znacznika, kodu po stronie klienta, interakcji użytkownika itp. Moja odpowiedź brzmi: jeśli masz resztę izolowaną i przetestowany, że nie warto mieć do tego celu TDD.
Zastanów się: Twoje strony muszą mieć określony wygląd. Czy zamierzasz napisać test jednostki, który uległ awarii, aby udowodnić, że używasz CSS poprawnie? Aby udowodnić, że używasz poprawnych stylów CSS? Nie sądzę.
Wyjaśnienie: W TDD rozpoczynamy od niepowodzenia testu jednostkowego. Następnie dokonujemy najprostszych zmian, które spowodują, że test się powiedzie.
Wyobraź sobie, używając TDD dla strony internetowej. Jakie wadliwe testy wytworzysz?
- testu ta strona jest również uformowane HTML
- testu że strona zawiera właściwą nazwę
- test że strona zawiera
- "Enter ID" etykietę
- id tekstowe
- Siatka danych
- Przycisk "Przejdź"
- Sprawdź, czy siatka danych jest pusta po pobraniu
- Sprawdź, czy w sieci są ładowane dane z klienta 1, gdy w polu tekstowym wprowadzono "1" i kliknięto "Przejdź".
Żadna z powyższych testów nie służy do wyświetlania strony. Żadne z nich nie testuje zachowania po stronie klienta żadnego skryptu JavaScript na stronie.
Myślę, że to głupie. Zamiast tego przetestuj metodę DAL, która pobiera dane na podstawie identyfikatora. Upewnij się, że zwraca poprawny identyfikator id 1.Następnie, ile czasu zajmie ręczne przetestowanie strony, aby upewnić się, że wygląda ona poprawnie, możesz wpisać "1" i kliknąć "Go", a dane wyświetlane w siatce to prawidłowe dane dla klienta 1?
Sterowanie testowe Opracowywanie i zautomatyzowane testy jednostkowe mają na celu sprawdzenie zachowania. Interfejs użytkownika formularza internetowego jest w większości deklaratywny. Występuje tu duża "niedopasowanie impedancji".
Więc, żeby wyjaśnić: oddziel moją warstwę interfejsu od mojej logiki biznesowej. Zgaduję, że będę musiał zmienić moje siatki gridviewview na coś innego. Czy wszystkie moje kontrole muszą być generowane w kodzie? Czy to ułatwiłoby rozdział? –
Twoja odpowiedź była bardzo pouczająca. Dziękuję, John. –
Mam nadzieję, że to pomaga. Możesz tutaj skomentować lub zadać kolejne pytanie, czy gdzieś tęsknię za bazą. Mogę sobie wyobrazić niektóre złożone interakcje UI, w których TDD może być pomocne, ale byłyby one rzadkie. Jeśli trafisz, daj nam znać. –
Można uruchomić testy oparte na protokole HTTP w celu przetestowania funkcjonalności wysokiego poziomu. Najlepiej byłoby zamknąć kod z kodem w warstwie biznesowej i uruchomić testy jednostkowe.
Można użyć oficjalnego Framework unittest: http://msdn.microsoft.com/en-us/library/ms182526.aspx
To może być oficjalne, ale to bzdura. Zakłada się, że na początku używasz "projektu" witryny sieci Web, a następnie kończy się niepowodzeniem w środowisku TDD (o to właśnie chodzi w tym pytaniu). –
Przede wszystkim jej naprawdę ciężko, aby przetestować WebForms. Ale jeśli przełamiesz logikę do kontrolerów/prezenterów, takich jak wzór MVC/MVP, możesz przynajmniej przetestować prezenterów.
Pseudo-kod
Defalult.aspx
public void Page_Init(object sender, EventArgs e) {
_presenter = new DefaultPresenter(IDependencyOne, IDependencyTwo etc) //Init new presenter, either from IoC container of choose or "new-it-up"
}
public void Save() {
_presenter.Save(txtValue.Text)
}
niż można łatwo przetestować prezenterowi w izolacji przynajmniej =)
Czy możesz podać mi szczegóły na temat tego, co będzie po obu stronach separacji? –
Zwykle tylko pozwalam stronie zajmować się renderowaniem UI i transformowaniem wartości z QueryString/Form/Viewstate, a następnie wywoływaniem prezentera, który rozmawia z innymi usługami i/lub repozytoriami. –
Te wzory są formalizacją tego, co sugerowałem. Sądzę, że mogą być fajne jako paradygmat rozwoju, ale myślę, że nieco przekraczają one punktację pod względem TDD. Moim zdaniem celem testów w TDD jest stworzenie kodu, w którym brakuje zestawu błędów poprzez tworzenie testów, które dowodzą, że błędy są nieobecne. Myślę, że gdy dojdziesz do interfejsu użytkownika, w żadnym wypadku nie będziesz miał wielu takich błędów. Błędy, które mógłbyś mieć, byłyby lepiej znalezione dzięki ręcznym testom, prawdopodobnie rozszerzonym przez framework automatyzacji, ale nie TDD, a nawet czysto jednostkowym testom. –
- 1. Jak miksować WebForms i MVC w ASP.NET
- 2. ASP.NET MVC + WebForms - konflikt trasy
- 3. Przykład xVal z WebForms ASP.NET?
- 4. Alternatywa dla Html.Raw w ASP.NET WebForms
- 5. Content-Security-Policy w ASP.NET WebForms
- 6. Jak zaimplementować koszyk ASP.NET?
- 7. Webforms Vs Asp.Net MVC VS2010 LoadTest
- 8. ASP.NET WebForms - Jak ustawić colspan dla wiersza nagłówka w GridView?
- 9. Jak pobrać dane HTML POST do manipulacji w WebForms ASP.NET?
- 10. Jak korzystać z ASP.Net MVC Zobacz stronę WebForms w aspekcie?
- 11. Jak dodać CDN do bundle.config w ASP.NET webforms łączenie
- 12. Jak określić swój typ zawartości w WebForms ASP.NET?
- 13. Jak zaimplementować logowanie Ajax po stronie klienta na Asp.Net MVC (łącze do rozwiązania dla Asp.Net Webforms jest tutaj)
- 14. Best Practices for ASP.NET WebForms struktura projektu
- 15. Integracja ASP.NET WebForms, WebAPI i angularjs
- 16. Wskazówki od ASP.NET MVC i lekcje dla programistów ASP.NET WebForms
- 17. Jak zaimplementować płynne API w ASP.NET MVC?
- 18. Jak zaimplementować stronicowanie w ASP.NET MVC?
- 19. Strong wpisywanych kontenerowy w WebForms
- 20. ASP.NET Webforms 4.0 Routing: Jak pozbyć się fizycznych adresów URL
- 21. Jak skonstruować TDD w Node.js?
- 22. Jak uruchomić TDD w Django?
- 23. Wywołanie metody "WebMethod" za pomocą jQuery w programie ASP.NET WebForms
- 24. Czy trzeba „unwire” obsługi zdarzeń w ASP.NET WebForms
- 25. ASP.NET MVC, jak zaimplementować link, który powraca do poprzedniej strony?
- 26. Jak TDD JFrame?
- 27. Zachowanie tabulatorów w WebForms
- 28. Generowanie AntiForgeryToken w WebForms
- 29. Trwałe nokaut ViewModel między ASP.NET WebForms posty po stronie serwera ...
- 30. ASP.NET MVC TDD z bazą LINQ i SQL
Właśnie w celu wyjaśnienia, czy wa zrobić test-driven rozwój czy po prostu testy jednostkowe? – alexn
Chciałbym włączyć niektóre TDD, które przyniosłyby mi dodatkową korzyść w postaci lepszych testów jednostkowych, miałem nadzieję. –