Làm thế nào để đơn vị kiểm tra một tập tin jsp?


12

Tôi đang phát triển ứng dụng Java 6 EE và tôi đang thử nghiệm mã jsp của mình với một ứng dụng khác với phiên bản thử nghiệm của các lệnh gọi và mã được sử dụng trong phiên bản gốc nhưng có vẻ lỏng lẻo và không thực tế. Có một cách tốt để thực hiện loại thử nghiệm này?


2
Bạn cần biết gì từ các bài kiểm tra?

Câu trả lời:


15

Nếu bạn chưa đọc về MVC (trình điều khiển xem mô hình), hãy làm như vậy. Bạn không nên có mã trong một tệp JSP, chỉ hiển thị. Đặt mã trong JSP là rất 1900.

Nghiêm túc mà nói, nếu không có mã trong JSP, bạn sẽ không kiểm tra JSP. Bạn đang thử nghiệm hành động / luồng. Sau đó, bạn có thể sử dụng HttpUnit hoặc Selenium . Sự khác biệt lớn là Selenium kiểm tra từ một trình duyệt thực.


13

Tôi không nghĩ rằng có một cách tốt để kiểm tra các tệp JSP, chủ yếu là vì chúng đã được phát triển trước khi kiểm thử đơn vị trở thành trọng tâm của sự phát triển.

Robert Martin đã viết một bài viết cách đây vài năm về việc hack trình biên dịch JSP để bạn có thể chỉ đạo các bài kiểm tra đơn vị không chứa container. Ý tưởng của anh ấy là tốt, nhưng nó đã bị phá vỡ với bản phát hành chính TomCat tiếp theo. Có quá nhiều phép thuật đang diễn ra.

Tôi không đồng ý với ý kiến ​​"chỉ không thêm mã và bạn sẽ không cần kiểm tra nó". NGHIÊM TÚC, bạn không nên đặt mã trong tệp JSP. Tuy nhiên, một giao diện người dùng phức tạp thường sẽ có logic hiển thị có thể được kiểm tra đơn vị có lợi nhuận.

Xem xét ví dụ này:

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

Mã này đã được bao gồm tốt: logic để quyết định xem chúng tôi có hiển thị menu quản trị không trong chế độ xem hay không. Tuy nhiên, nếu có một cách dễ dàng để kiểm tra các đơn vị JSP, thì chúng ta có thể viết một bài kiểm tra để cho thấy rằng hành vi chúng ta thực sự muốn xuất hiện và nó sẽ bảo vệ chúng ta khỏi sự thay đổi trang vô tình làm cho trình đơn quản trị viên hiển thị khi nó không nên 't được.


4

Tồn tại một chương trình (được sử dụng bởi bất kỳ máy chủ ứng dụng nào bạn đang sử dụng) để biên dịch tệp .jsp thành tệp .java. Ví dụ, phiên bản mặt trời / oracle jspc .

Khi bạn có .java sẽ được tạo bởi bản dịch .jsp (bạn thậm chí có thể muốn xem xét sử dụng phần này như một phần của quy trình xây dựng - biên dịch trước jsp để cải thiện hiệu suất trong lần truy cập đầu tiên), sau đó bạn có thể chạy thử nghiệm với nó bằng cách chế nhạo yêu cầu và xác minh phản hồi là những gì bạn đang mong đợi.

(chỉnh sửa với ví dụ :)

Phương pháp chính cho việc này là _jspService(HttpServletRequest, HttpServletResponse)phương pháp.

Một thế giới xin chào tầm thường jsp:

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

(test.jsp nằm trong thư mục có tên 'webapp' và cũng là thư mục 'out') Khi được biên dịch với lệnh sẽ jspc -v -d out -compile -uriroot webapp/ test.jspđặt vào thư mục out một tệp được gọi test_jsp.java. Tệp này có trong đó (cùng với một chút thiết lập cấu hình khác):

  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);
    }
  }
}

Tại thời điểm này, hãy kiểm tra để đảm bảo rằng JspWriter được gọi bằng ghi hoặc in và nội dung của cuộc gọi là những gì bạn mong đợi.

Tất cả những gì đã nói, trong một thế giới lý tưởng, người ta không nên có bất kỳ logic nào trong jsp - logic đó sẽ nằm trong bộ điều khiển hoặc taglib được thử nghiệm với các kỹ thuật khác.


1
Điều gì sẽ có trong JSP sẽ được kiểm tra / chế nhạo? Đặt dữ liệu trong yêu cầu / phiên và sau đó kiểm tra màn hình? Hay đây là nếu thực hành tốt không được tuân theo và có logic thực tế trong JSP?
Jeanne Boyarsky

@JeanneBoyarsky Cập nhật với ví dụ jsp và mã. Tôi sẽ không coi đó là một thực hành tốt để thử kiểm tra điều này với một phương tiện truyền thống - một lĩnh vực thử nghiệm khác. Độ sâu của chế độ chế nhạo có thể khó xử tùy thuộc vào bộ công cụ (ví dụ: phân lớp JspWriter để người ta có thể dễ dàng kiểm tra những gì được gửi đến nó).

3

Bạn cũng có thể xem xét sử dụng khung kiểm tra đơn vị HTTP như HTTPUnit | http://httpunit.sourceforge.net/ .

Một điểm quan trọng khác là tách biệt mối quan tâm của ứng dụng của bạn.

Ví dụ: sử dụng các kỹ thuật như TDD (http://en.wikipedia.org/wiki/Test-driven_development), bạn sẽ thiết kế các loại để kiểm tra.

Các loại được tiêu thụ trong JSP sẽ được kiểm tra trong các thử nghiệm đơn vị cụ thể. Nếu điều này là không thể, bạn nên mô phỏng người dùng -> tương tác trình duyệt (một lần nữa, HTTPUnit o công cụ tương tự).


2
  • cố gắng bên ngoài mã chức năng của servlet để kiểm tra nó bên ngoài ngữ cảnh của servlet với các thử nghiệm đơn vị thực
  • kiểm tra các điểm cuối của servlet bằng các công cụ như:
    • HTTPUnit
    • HtmlUnit
    • Selen
    • cây xương rồng
    • JspTest
    • ...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.