2009-06-27 16 views
28

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

+1

Właśnie w celu wyjaśnienia, czy wa zrobić test-driven rozwój czy po prostu testy jednostkowe? – alexn

+0

Chciałbym włączyć niektóre TDD, które przyniosłyby mi dodatkową korzyść w postaci lepszych testów jednostkowych, miałem nadzieję. –

Odpowiedz

36

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?

  1. testu ta strona jest również uformowane HTML
  2. testu że strona zawiera właściwą nazwę
  3. test że strona zawiera
    1. "Enter ID" etykietę
    2. id tekstowe
    3. Siatka danych
    4. Przycisk "Przejdź"
  4. Sprawdź, czy siatka danych jest pusta po pobraniu
  5. 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".

+0

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ł? –

+0

Twoja odpowiedź była bardzo pouczająca. Dziękuję, John. –

+0

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ć. –

0

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.

3

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 =)

+0

Czy możesz podać mi szczegóły na temat tego, co będzie po obu stronach separacji? –

+0

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. –

+0

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. –

Powiązane problemy