it-swarm.com.de

Wie teste ich eine JSP-Datei?

Ich entwickle eine Java 6 EE-Anwendung und teste meinen JSP-Code mit einer anderen mit einer Testversion der Funktionsaufrufe und des Codes, die im Original verwendet wurden, aber es scheint locker und unpraktisch Gibt es eine gute Möglichkeit, diese Art von Tests durchzuführen?

12
zamancer

Wenn Sie nicht über MVC (Model View Controller) gelesen haben, tun Sie dies. Sie sollten keinen Code in einer JSP haben, sondern nur anzeigen. Das Einfügen von Code in JSP ist sehr 1900.

Im Ernst, wenn die JSP keinen Code enthält, testen Sie die JSP nicht. Sie testen die Aktion/den Ablauf. Dann könnten Sie HttpUnit oder Selen verwenden. Der große Unterschied besteht darin, dass Selenium mit einem echten Browser testet.

15
Jeanne Boyarsky

Ich denke nicht, dass es eine gute Möglichkeit gibt, JSPs zu testen, hauptsächlich weil sie entwickelt wurden, bevor Unit-Tests zu einem Schwerpunkt der Entwicklung wurden.

Robert Martin hat vor einigen Jahren einen Artikel über das Hacken des JSP-Compilers geschrieben, damit Sie Unit-Tests ohne Container durchführen können. Seine Idee war gut, aber sie wurde mit der nächsten Hauptveröffentlichung von Tomcat gebrochen. Es ist einfach zu viel Magie los.

Ich bin nicht einverstanden mit der Idee "Fügen Sie einfach keinen Code hinzu und Sie müssen ihn nicht testen". Natürlich sollten Sie keinen Code in die JSP einfügen. Trotzdem verfügt eine komplexe Benutzeroberfläche häufig über eine Anzeigelogik, die rentabel auf Einheitentests getestet werden kann.

Betrachten Sie dieses Beispiel:

<c:choose>
  <c:when test="${mydto.showAdminMenu}">
   The admin menu....
  </c:when>
  <c:otherwise>
    Something completely different
  </c:otherwise>
</c:choose>

Dieser Code ist bereits gut berücksichtigt: Die Logik zur Entscheidung, ob das Admin-Menü angezeigt wird, ist nicht in der Ansicht enthalten. Wenn es jedoch eine einfache Möglichkeit gäbe, JSPs zu testen, könnten wir einen Test schreiben, um zu zeigen, dass das gewünschte Verhalten tatsächlich angezeigt wird, und es würde uns vor einer Änderung der Seite schützen, die das Administratormenü versehentlich sichtbar machte, wenn es nicht sollte nicht sein.

13
portabella

Es gibt ein Programm (das von dem von Ihnen verwendeten Anwendungsserver verwendet wird), das eine .jsp-Datei in eine .Java-Datei kompiliert. Zum Beispiel die Sun/Oracle-Version jspc .

Sobald Sie die .Java-Datei haben, die von der .jsp-Übersetzung erzeugt wird (möglicherweise möchten Sie diese sogar als Teil des Erstellungsprozesses verwenden - die jsp-Datei wird beim ersten Treffer für Leistungsverbesserungen vorkompiliert), können Sie Tests dagegen ausführen Sie verspotten die Anfrage und überprüfen die Antwort.

(mit Beispiel bearbeiten :)

Die Schlüsselmethode hierfür ist die Methode _jspService(HttpServletRequest, HttpServletResponse).

Eine triviale Hallo Welt jsp:

<html>
    <head>
        <title>Hello world</title>
    </head>
    <body>
        <h1>Hello world</h1>
        Today is: <%= new Java.util.Date().toString() %>
    </body>
</html>

(test.jsp befindet sich in einem Verzeichnis mit dem Namen 'webapp' und auch in einem 'out'-Verzeichnis.) Beim Kompilieren mit dem Befehl jspc -v -d out -compile -uriroot webapp/ test.jsp wird eine Datei mit dem Namen test_jsp.Java in ein out-Verzeichnis gestellt. Diese Datei enthält (zusammen mit einigen anderen Konfigurationskonfigurationen):

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws Java.io.IOException, ServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;

    try {
      response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("<html>\n\t<head>\n\t\t<title>Hello world</title>\n\t</head>\n\t<body>\n\t
\t<h1>Hello world</h1>\n\t\tToday is: ");
      out.print( new Java.util.Date().toString() );
      out.write("\n\t</body>\n</html>\n\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (Java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

An diesem Punkt wird überprüft, ob der JspWriter mit Schreiben oder Drucken aufgerufen wird und der Inhalt des Aufrufs Ihren Erwartungen entspricht.

Alles in allem sollte man in einer idealen Welt keine Logik innerhalb des JSP haben - eine solche Logik wäre entweder im Controller oder in Taglibs, die mit anderen Techniken getestet werden.

4
user40980

Sie können auch ein HTTP-Unit-Test-Framework wie HTTPUnit | verwenden http://httpunit.sourceforge.net/ .

Ein weiterer wichtiger Punkt ist die Trennung der Anliegen Ihrer Bewerbung.

Z.B. unter Verwendung von Techniken wie [~ # ~] tdd [~ # ~] (http://en.wikipedia.org/wiki/Test-driven_development), Sie entwerfen Typen für Testbarkeit.

In JSP verbrauchte Typen werden in bestimmten Komponententests getestet. Wenn dies nicht möglich ist, sollten Sie die Interaktion Benutzer -> Browser simulieren (wieder HTTPUnit o ähnliches Tool).

3
gsscoder
  • versuchen Sie, den Funktionscode des Servlets zu externalisieren, um ihn zu testen außerhalb eines Servlet-Kontexts mit realen Komponententests
  • testen Sie die Servlet-Endpunkte mit Tools wie:
    • HTTPUnit
    • HtmlUnit
    • Selen
    • Kaktus
    • JspTest
    • ...
2
haylem