Stworzyłem system WWW przy użyciu Java Servlets i teraz chcę przeprowadzić testy JUnit. My dataManager
to tylko podstawowy fragment kodu, który przesyła go do bazy danych. Jak przetestowałbyś serwlet z JUnitem?
Mój przykład kodu, który umożliwia użytkownikowi rejestrację / rejestrację, który jest przesyłany z mojej strony głównej za pośrednictwem AJAX:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// Get parameters
String userName = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
try {
// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
//pass reg details to datamanager
dataManager = new DataManager();
//store result as string
String result = dataManager.register(userName, password, name);
//set response to html + no cache
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
//send response with register result
response.getWriter().write(result);
} catch(Exception e){
System.out.println("Exception is :" + e);
}
}
unit-testing
testing
servlets
junit
Księżycowy
źródło
źródło
Po pierwsze, w prawdziwej aplikacji nigdy nie uzyskasz informacji o połączeniu z bazą danych w serwlecie; można go skonfigurować na serwerze aplikacji.
Istnieją jednak sposoby testowania serwletów bez uruchomionego kontenera. Jednym z nich jest użycie pozorowanych obiektów. Spring dostarcza zestaw bardzo przydatnych makiet dla rzeczy takich jak HttpServletRequest, HttpServletResponse, HttpServletSession itp.
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html
Używając tych makiet, możesz przetestować takie rzeczy jak
Co się stanie, jeśli w żądaniu nie ma nazwy użytkownika?
Co się stanie, jeśli w żądaniu znajduje się nazwa użytkownika?
itp
Możesz wtedy zrobić takie rzeczy jak:
źródło
Uważam, że testy Selenium są bardziej przydatne w przypadku testów integracyjnych lub funkcjonalnych (od końca do końca). Pracuję nad próbą użycia org.springframework.mock.web , ale nie jestem zbyt daleko. Dołączam kontroler próbki z zestawem testów jMock .
Po pierwsze, Administrator:
Następnie test:
Mam nadzieję, że to pomoże.
źródło
Zaktualizowano luty 2018: OpenBrace Limited został zamknięty , a jego produkt ObMimic nie jest już obsługiwany.
Oto kolejna alternatywa, używając biblioteki OpenBrace ObMimic test-doubles Servlet API (ujawnienie: jestem jej programistą).
Uwagi:
Każdy „mimic” ma obiekt „mimicState” określający stan logiczny. Zapewnia to wyraźne rozróżnienie między metodami Servlet API a konfiguracją i kontrolą stanu wewnętrznego mimika.
Możesz być zaskoczony, że sprawdzenie Content-Type zawiera „charset = ISO-8859-1”. Jednak dla podanego kodu "doPost" jest to zgodne z Javadoc Servlet API, własną metodą getContentType HttpServletResponse oraz aktualnym nagłówkiem Content-Type utworzonym np. Na Glassfish 3. Możesz nie zdawać sobie z tego sprawy, jeśli używasz normalnych pozorowanych obiektów i własne oczekiwania co do zachowania API. W tym przypadku prawdopodobnie nie ma to znaczenia, ale w bardziej złożonych przypadkach jest to rodzaj nieoczekiwanego zachowania API, które może trochę kpić z kpiny!
Użyłem
response.getMimicState().getContentType()
najprostszego sposobu sprawdzenia Content-Type i zilustrowania powyższego punktu, ale rzeczywiście możesz samodzielnie sprawdzić "text / html", jeśli chcesz (używającresponse.getMimicState().getContentTypeMimeType()
). Sprawdzanie nagłówka Content-Type w taki sam sposób, jak w przypadku nagłówka Cache-Control również działa.W tym przykładzie zawartość odpowiedzi jest sprawdzana jako dane znakowe (z użyciem kodowania Writer). Moglibyśmy również sprawdzić, czy użyty został Writer odpowiedzi, a nie jego OutputStream (przy użyciu
response.getMimicState().isWritingCharacterContent()
), ale uznałem, że interesuje nas tylko wynikowy wynik i nie obchodzi mnie, jakie wywołania API go wyprodukowały (chociaż tak może być sprawdzone też ...). Możliwe jest również pobranie treści odpowiedzi w postaci bajtów, zbadanie szczegółowego stanu elementu Writer / OutputStream itp.Pełne informacje na temat ObMimic są dostępne do bezpłatnego pobrania na stronie internetowej OpenBrace . Możesz też skontaktować się ze mną, jeśli masz jakieś pytania (dane kontaktowe znajdują się na stronie internetowej).
źródło
EDYCJA : Cactus jest teraz martwym projektem: http://attic.apache.org/projects/jakarta-cactus.html
Możesz spojrzeć na kaktusa.
http://jakarta.apache.org/cactus/
źródło
Innym podejściem byłoby utworzenie wbudowanego serwera do "hostowania" twojego serwletu, umożliwiającego pisanie wywołań przeciwko niemu za pomocą bibliotek przeznaczonych do wykonywania wywołań do rzeczywistych serwerów (użyteczność tego podejścia zależy w pewnym stopniu od tego, jak łatwo można uczynić "legalnym" programowym wywołania do serwera - testowałem punkt dostępowy JMS (Java Messaging Service), którego klientów nie brakuje).
Istnieje kilka różnych tras, którymi możesz iść - zwykle dwie to kocur i molo.
Ostrzeżenie: przy wyborze serwera do osadzenia należy pamiętać o używanej wersji apletu servlet-api (biblioteka udostępniająca klasy takie jak HttpServletRequest). Jeśli używasz 2.5, stwierdziłem, że Jetty 6.x działa dobrze (co jest przykładem, który podam poniżej). Jeśli używasz servlet-api 3.0, osadzone elementy tomcat-7 wydają się być dobrą opcją, jednak musiałem zrezygnować z próby jego użycia, ponieważ aplikacja, którą testowałem, używała servlet-api 2.5. Próba połączenia tych dwóch spowoduje NoSuchMethod i inne takie wyjątki podczas próby skonfigurowania lub uruchomienia serwera.
Możesz skonfigurować taki serwer w ten sposób (Jetty 6.1.26, servlet-api 2.5):
źródło
Użyj Selenium do testów jednostkowych opartych na sieci Web. Istnieje wtyczka do Firefoksa o nazwie Selenium IDE, która może rejestrować działania na stronie internetowej i eksportować do przypadków testowych JUnit, które używają Selenium RC do uruchomienia serwera testowego.
źródło
źródło
Najpierw prawdopodobnie powinieneś to trochę zmienić, aby DataManager nie był tworzony w kodzie doPost .. powinieneś spróbować Dependency Injection, aby uzyskać instancję. (Zobacz wideo Guice, aby zobaczyć ładne wprowadzenie do DI.). Jeśli każą ci rozpocząć testy jednostkowe, to DI jest koniecznością.
Po wstrzyknięciu zależności możesz przetestować swoją klasę w izolacji.
Aby faktycznie przetestować serwlet, istnieją inne starsze wątki, które to omawiały. Spróbuj tutaj i tutaj .
źródło