Jak przeprowadzić test jednostkowy strony internetowej?

26

Jak przeprowadzić test jednostkowy strony internetowej? Wydaje mi się, że ponieważ tak wiele zależy od stanu i wkładu użytkownika, nie byłoby to możliwe.

Jeśli nie jest to wykonalne, czy istnieje ważna automatyczna alternatywa?

Tom Squires
źródło
2
Jeśli chcesz zautomatyzowanego testowania interfejsu użytkownika, potrzebujesz czegoś takiego jak Selenium. Ale jeśli chcesz zautomatyzowanych testów jednostkowych , nie potrzebujesz Selenium. Potrzebujesz tylko odpowiednich wzorów. Zobacz moją odpowiedź.
Matthew Rodatus,

Odpowiedzi:

22

Tak, możesz. Musisz tylko uważnie rozdzielić swoje obawy. Krótko mówiąc, musisz usunąć całą logikę z tyłu kodu i umieścić ją w innych klasach.

Istnieją dwa typowe sposoby, aby to zrobić.

Prostym sposobem jest ponowne przemyślenie wszystkich procedur obsługi zdarzeń pod kątem: „Jakie informacje podaje mi system? Jakie informacje muszę wypełnić na stronie?” a następnie podaj klasę usług, która dokonuje tej konwersji.

W takim przypadku warstwa usługowa powinna wiedzieć bardzo niewiele o charakterze warstwy prezentacji. Nadal musisz pobrać dane zwrócone z usługi i wypełnić właściwe komponenty WebForm w swoim kodzie, a to pozostaje niezbadane (przynajmniej w testach jednostkowych nadal możesz zastosować testy integracyjne). Ale rzadko zdarza się, że kod się psuje, istnieje większe prawdopodobieństwo niepowodzenia logiki.

Bardziej skomplikowanym, ale bardziej skutecznym sposobem jest użycie wzorca Prezentera widoku modelu . Kiedy próbowaliśmy, okazało się, że Presenters szybko związał się z frameworkiem i im bardziej opracowaliśmy MVP, tym bardziej jasne było, że MVP naprawdę chciałoby być MVC, ale nie mogło tak być.

To powiedziawszy, inni zrobili to bardzo skutecznie - dostępna jest nawet platforma webformsmvp, aby usunąć ciężkie podnoszenie - więc twój przebieg może się różnić.

pdr
źródło
1
@jmoreno: Nice catch! Zapomniałem, że WebForm i MVP istnieją nawet przez ostatnie 5 lat.
pdr
16

Oczywiście cała strona formularzy internetowych nie jest jednostką, a zatem nie może być testowana jednostkowo. Istnieją jednak pewne rzeczy, które możesz zrobić dla testów automatycznych:

  • test jednostkowy poszczególnych składników strony (dowolne metody, które wykonują rzeczywistą logikę)
  • komponenty testu jednostkowego używane przez stronę (formanty niestandardowe, podstawowa logika biznesowa itp.)
  • zautomatyzowane testowanie funkcjonalności (przez zdalne sterowanie przeglądarką lub wysyłanie żądań HTTP przez coś takiego jak cURL)
  • zautomatyzowane testy penetracyjne (istnieją narzędzia, które będą próbowały znaleźć możliwe punkty wstrzyknięcia i automatycznie przeprowadzą nieszkodliwe, ale wykrywalne ataki wstrzykiwania na twojej stronie)
  • testowanie obciążenia
  • sprawdzanie układu z listą użyteczności i punktorów w stylu domowym (chociaż jest to bardzo trudne do zautomatyzowania; zwykle bardziej prawdopodobne jest po prostu robienie tego ręcznie od czasu do czasu)
tdammers
źródło
-1 Niestety ale badania obciążenia, testów penetracyjnych i sprawdziany układ to nic wspólnego z testów jednostkowych
Tom Squires
2
@TomSquires: oczywiście nie są, a jeśli dokładnie przeczytasz moją odpowiedź, zauważysz, że nigdy nie powiedziałem, że tak było. Pytanie wydaje się jednak mylić pojęcia testów jednostkowych i testów automatycznych w ogóle, dlatego wymieniłem różne znaczące testy automatyczne, które można przeprowadzić w formularzu internetowym.
tdammers
zgadzam się, testowanie strony internetowej jest bardziej prawdopodobne w formie testów integracyjnych niż testów jednostkowych według ścisłych definicji, choć nadal dobrze jest zautomatyzować wszystko, co się da
jk.
6
@TomSquires: całkowicie nieuzasadnione głosowanie negatywne. Twoje pytanie zaczyna się od przetestowania całej witryny, która nie ma nic wspólnego z testowaniem jednostkowym. Tdammers zidentyfikował różne sposoby testowania całości i części oraz zidentyfikował, gdzie mieści się testowanie jednostkowe. +1
azheglov 25.10.11
3
Słusznie. Cofam to
Tom Squires,
9

Przykro mi, że brakuje części „jednostka” pytania ...

SeleniumHQ jest twoim przyjacielem do testów z interfejsu. To nie jest test jednostkowy, bardziej jak testowanie czarnej skrzynki. Nadal musisz pomyśleć o prawidłowych przypadkach testowych ...

WarrenFaith
źródło
1
+1 Twoja odpowiedź pojawiła się, kiedy naciskałem „opublikuj swoją odpowiedź”, aby powiedzieć dokładnie to samo.
yannis
2
Ponadto, ponieważ op pyta o testowanie jednostkowe, dodajmy tylko, że to, na czym faktycznie polega pytanie, to testy funkcjonalne (ity) , które są bardziej odpowiednie (rozsądne, wykonalne) podczas testowania elementów wejściowych użytkownika.
yannis
+1, bo wciąż zamierzam go używać, ale nigdy się do tego nie przyzwyczaiłem. Czy ktoś go wykorzystał, czy jest dobry i warty wdrożenia?
NimChimpsky
6
Selen jest fantastycznym narzędziem, ale nie ma nic wspólnego z testowaniem jednostkowym.
pdr
To prawda, że ​​pominąłem tę informację w pytaniu: /
WarrenFaith,
6

Mówiąc z doświadczenia: tylko jeśli jest to zrobione dobrze. Przez „właściwy” rozumiem minimalny kod i coś w rodzaju wspomnianego powyżej Model-View-Presenter, aby formularz internetowy był „głupi”. Zwykle okazuje się to bardzo trudne w przypadku aplikacji typu brownfield, ponieważ nie zostały one zaprojektowane z myślą o tym i jest to prawie herkulesowy wysiłek, aby przeredagować / przepisać strony, aby z niego skorzystać.

Wayne Molina
źródło
1

watin

Uważam, że jednostkowe testy sieciowe są niezwykle użyteczne, nawet jeśli służą jedynie do ogólnego zrozumienia błędu regresji lub nowych projektów.

Jeśli chodzi o stan, tworzysz testy jednostkowe, tak jak w przypadku testów innych niż interfejs użytkownika - usuwają one bazę danych na początku testu i odbudowują bazę danych, aby zawierała jedynie stan początkowy. Każdy test jednostkowy obejmuje następnie pojedynczą stronę lub zwykle odrębne zadanie na stronie.

http://watin.org/ to kolejne narzędzie do testowania stron internetowych, ale dla C # / .NET. Testy zapisujesz jako testy jednostkowe:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

Obecnie jest oparty na przeglądarce IE, ale ma pewne eksperymentalne wsparcie dla Firefoksa i Chrome. Możesz praktycznie zautomatyzować wszystko, co robisz w testach ręcznych, w tym interakcję JavaScript.

Chris S.
źródło
Sprawdź, czy to 2016. Dzisiejsza wizyta na stronie WatiN wskazuje mi, że WatiN może nie żyje. Dokumenty są rzadkie, nieaktualne, a filmy się nie odtwarzają. Ja nie skarży - Mam ogromną wdzięczność za open source dobrowolnych narzędzi - to komentarz jest pomoc innych osób come-ostatnio jak ja. Odpowiedź jest w porządku, wystarczy wskazać, że rozpoczęcie pracy może wymagać samodzielnego uczenia się.
qxotk
1
Dalsza pomoc dla każdego, kto myśli o sposobie WatiN, potwierdzenie, że jest w stagnacji + gdzie szukać w dzisiejszych czasach: stackoverflow.com/questions/118531/…
qxotk
0

Nie można tak naprawdę przetestować witryny internetowej za pomocą jednostki, po prostu dlatego, że żądania sieciowe odbywają się za pośrednictwem drutu (lub stosu TCP). Zatem testy nie pasują do definicji „testu jednostkowego”, prawdopodobnie byłyby to testy kompleksowe.

Do tego rodzaju testów możesz użyć pakietu takiego jak Selenium, który uruchamia przeglądarkę internetową za kulisami. Słowo ostrzeżenia: zwykle tego rodzaju testy są bardzo trudne i nieprzewidywalne, ponieważ istnieje wiele ruchomych części!

Co ciekawsze, martwi mnie trochę, dlaczego w ogóle trzeba testować formularze internetowe. Czy nie umieszczasz zbyt wiele logiki w kodzie i nie masz przypadkowej anemicznej logiki biznesowej?

Sklivvz
źródło
-1

Jaśmin

W ciągu ostatnich 5 lat Jasmine stała się kluczowym narzędziem do testów jednostkowych. Często jest włączany do automatycznego testowania kompilacji za pomocą Node i npm

Na https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) :

Jasmine to platforma do testowania otwartego kodu JavaScript. [2] Ma on działać na dowolnej platformie obsługującej JavaScript, nie ingerować w aplikację ani IDE i mieć łatwą do odczytania składnię. Jest pod silnym wpływem innych platform testowania jednostek, takich jak ScrewUnit, JSSpec, JSpec i RSpec. [3]

Pomimo wszystkich wzmianek o javascript, może być również używany do testowania jednostkowego zwykłego formularza internetowego.

Michael Durrant
źródło
Podczas gdy javascript jest używany w formularzach internetowych, nie jest to podstawowa metoda aktualizacji interfejsu użytkownika
Tom Squires
Prawdziwe. Jednak alternatywą jest ...? Dlatego Jasmine, choć nie jest przeznaczona do tego celu, działa bardzo dobrze. Ponadto składnia jest prawie identyczna z RSpec, którą kochają programiści Ruby.
Michael Durrant,
-2

ASP.NET

Podczas opracowywania strony ASP.NET mogliśmy przeprowadzić testy jednostkowe na:

  • Domena
  • Kontrolery / prezentery BL
  • kod strony internetowej formularzy

Możliwe jest TDD wszystko, w zależności od architektury. Jedyne, czego nie można przetestować jednostkowo, to układ pliku znaczników.

KeithS
źródło
3
Ta odpowiedź brzmi „tak, to możliwe” na pytanie „jak”. Niezupełnie pomocne.
RubberDuck,