Ich habe ein Websystem mit Java-Servlets erstellt und möchte jetzt JUnit-Tests durchführen. My dataManager
ist nur ein grundlegender Code, der ihn an die Datenbank sendet. Wie würden Sie ein Servlet mit JUnit testen?
Mein Codebeispiel, mit dem sich ein Benutzer registrieren / anmelden kann und das von meiner Hauptseite über AJAX gesendet wird:
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);
}
}
Zunächst einmal würden Sie in einer realen Anwendung niemals Datenbankverbindungsinformationen in einem Servlet erhalten. Sie würden es in Ihrem App-Server konfigurieren.
Es gibt jedoch Möglichkeiten, Servlets zu testen, ohne dass ein Container ausgeführt wird. Eine besteht darin, Scheinobjekte zu verwenden. Spring bietet eine Reihe sehr nützlicher Mocks für Dinge wie HttpServletRequest, HttpServletResponse, HttpServletSession usw.:
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html
Mit diesen Mocks können Sie Dinge wie testen
Was passiert, wenn der Benutzername nicht in der Anfrage enthalten ist?
Was passiert, wenn der Benutzername in der Anfrage enthalten ist?
etc
Sie könnten dann Dinge tun wie:
quelle
Ich finde Selen-Tests nützlicher bei Integrations- oder Funktionstests (End-to-End-Tests). Ich arbeite mit dem Versuch, org.springframework.mock.web zu verwenden , aber ich bin nicht sehr weit. Ich schließe einen Sample-Controller mit einem jMock an -Testsuite hinzu.
Zunächst der Controller:
Als nächstes der Test:
Ich hoffe das könnte helfen.
quelle
Aktualisiert im Februar 2018: OpenBrace Limited wurde geschlossen und sein ObMimic-Produkt wird nicht mehr unterstützt.
Hier ist eine weitere Alternative, bei der OpenBraces ObMimic- Bibliothek mit Servlet-API-Test-Doubles verwendet wird (Offenlegung: Ich bin der Entwickler).
Anmerkungen:
Jedes "mimic" hat ein "mimicState" -Objekt für seinen logischen Zustand. Dies bietet eine klare Unterscheidung zwischen den Servlet-API-Methoden und der Konfiguration und Überprüfung des internen Status des Mimics.
Sie werden überrascht sein, dass die Prüfung des Inhaltstyps "Zeichensatz = ISO-8859-1" enthält. Für den angegebenen "doPost" -Code entspricht dies jedoch der Servlet-API Javadoc, der getContentType-Methode von HttpServletResponse und dem tatsächlichen Content-Type-Header, der beispielsweise in Glassfish 3 erstellt wurde. Dies ist möglicherweise nicht möglich, wenn Sie normale Scheinobjekte und Ihre verwenden eigene Erwartungen an das Verhalten der API. In diesem Fall spielt es wahrscheinlich keine Rolle, aber in komplexeren Fällen ist dies die Art von unerwartetem API-Verhalten, das Spott ein wenig verspotten kann!
Ich habe
response.getMimicState().getContentType()
als einfachste Methode verwendet, um den Inhaltstyp zu überprüfen und den obigen Punkt zu veranschaulichen, aber Sie könnten tatsächlich selbst nach "text / html" suchen, wenn Sie möchten (mitresponse.getMimicState().getContentTypeMimeType()
). Das Überprüfen des Content-Type-Headers auf die gleiche Weise wie für den Cache-Control-Header funktioniert ebenfalls.In diesem Beispiel wird der Antwortinhalt als Zeichendaten überprüft (wobei die Codierung des Writers verwendet wird). Wir könnten auch überprüfen, ob der Writer der Antwort anstelle des OutputStream (using
response.getMimicState().isWritingCharacterContent()
) verwendet wurde, aber ich habe angenommen, dass wir uns nur mit der resultierenden Ausgabe befassen und es uns egal ist, welche API-Aufrufe sie erzeugt haben (obwohl dies möglich sein könnte) auch überprüft ...). Es ist auch möglich, den Textinhalt der Antwort als Bytes abzurufen, den detaillierten Status des Writer / OutputStream usw. zu überprüfen.Es gibt alle Details zu ObMimic und einen kostenlosen Download auf der OpenBrace- Website. Oder Sie können mich kontaktieren, wenn Sie Fragen haben (Kontaktdaten finden Sie auf der Website).
quelle
EDIT : Cactus ist jetzt ein totes Projekt: http://attic.apache.org/projects/jakarta-cactus.html
Vielleicht möchten Sie sich Kakteen ansehen.
http://jakarta.apache.org/cactus/
quelle
Ein anderer Ansatz wäre, einen eingebetteten Server zu erstellen, der Ihr Servlet "hostet" und es Ihnen ermöglicht, Aufrufe mit Bibliotheken zu schreiben, die dazu gedacht sind, Aufrufe an tatsächliche Server zu tätigen (der Nutzen dieses Ansatzes hängt etwas davon ab, wie einfach Sie "legitim" programmatisch machen können Anrufe an den Server - Ich habe einen JMS-Zugriffspunkt (Java Messaging Service) getestet, für den es viele Clients gibt.
Es gibt ein paar verschiedene Routen - die üblichen zwei sind Kater und Steg.
Warnung: Bei der Auswahl des einzubettenden Servers ist die von Ihnen verwendete Version der Servlet-API zu beachten (die Bibliothek, die Klassen wie HttpServletRequest bereitstellt). Wenn Sie 2.5 verwenden, hat Jetty 6.x gut funktioniert (das ist das Beispiel, das ich unten geben werde). Wenn Sie Servlet-API 3.0 verwenden, scheint das eingebettete Tomcat-7-Material eine gute Option zu sein. Ich musste jedoch meinen Versuch, es zu verwenden, abbrechen, da die Anwendung, die ich getestet habe, Servlet-API 2.5 verwendet. Der Versuch, beide zu mischen, führt zu NoSuchMethod und anderen solchen Ausnahmen, wenn Sie versuchen, den Server zu konfigurieren oder zu starten.
Sie können einen solchen Server wie folgt einrichten (Jetty 6.1.26, Servlet-API 2.5):
quelle
Verwenden Sie Selen für webbasierte Unit-Tests. Es gibt ein Firefox-Plugin namens Selenium IDE, das Aktionen auf der Webseite aufzeichnen und in JUnit-Testfälle exportieren kann, die Selenium RC zum Ausführen des Testservers verwenden .
quelle
quelle
Zuerst sollten Sie dies wahrscheinlich ein wenig umgestalten, damit der DataManager nicht im doPost-Code erstellt wird. Sie sollten Dependency Injection versuchen, um eine Instanz abzurufen. (Siehe die Guice Eine nette Einführung in DI finden Video.) Wenn Sie aufgefordert werden, mit dem Testen aller Einheiten zu beginnen, ist DI ein Muss.
Sobald Ihre Abhängigkeiten eingefügt sind, können Sie Ihre Klasse isoliert testen.
Um das Servlet tatsächlich zu testen, gibt es andere ältere Threads, die dies besprochen haben. Versuchen Sie es hier und hier .
quelle