Wie teste ich eine JSP-Datei?

12

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

Zamancer
quelle
2
Was müssen Sie aus den Tests wissen?

Antworten:

15

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 getestet wird.

Jeanne Boyarsky
quelle
13

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.

Portabella
quelle
4

Es gibt ein Programm (das von jedem von Ihnen verwendeten Anwendungsserver verwendet wird), das eine .jsp-Datei in eine .java-Datei kompiliert. Zum Beispiel die Sonnen- / Orakelversion 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 vorab kompiliert, um die Leistung zu verbessern), 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 _jspService(HttpServletRequest, HttpServletResponse)Methode.

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.jspwird eine Datei mit dem Namen' out ' in ein out-Verzeichnis gestellt test_jsp.java. 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 so ist, wie Sie es erwarten.

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.


quelle
1
Was würde in der JSP getestet / verspottet werden? Daten in der Anfrage / Sitzung einstellen und dann die Anzeige überprüfen? Oder ist dies der Fall, wenn bewährte Verfahren nicht befolgt werden und die JSP tatsächlich logisch ist?
Jeanne Boyarsky
@ JeanneBoyarsky Aktualisiert mit Beispiel JSP und Code. Ich würde es nicht als gute Praxis betrachten, dies mit einem traditionellen Junit zu testen - es ist ein weiterer Bereich des Testens. Die Tiefe der Verspottung kann je nach Werkzeugsatz unangenehm sein (z. B. Unterklasse JspWriter, damit man leicht testen kann, was an ihn gesendet wird).
3

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.

Wenn Sie beispielsweise Techniken wie TDD (http://en.wikipedia.org/wiki/Test-driven_development) verwenden, entwerfen Sie 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 oder ähnliches Tool).

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