Bagaimana cara menguji file jsp?

12

Saya sedang mengembangkan aplikasi Java 6 EE dan saya sedang menguji kode jsp saya dengan yang lain dengan versi pengujian dari panggilan fungsi dan kode yang digunakan dalam yang asli tetapi tampaknya longgar dan tidak praktis. Apakah ada cara yang baik untuk menyelesaikan pengujian semacam ini?

zamancer
sumber
2
Apa yang perlu Anda ketahui dari tes?

Jawaban:

15

Jika Anda belum membaca tentang MVC (model view controller), lakukanlah. Anda seharusnya tidak memiliki kode di JSP, cukup tampilkan. Memasukkan kode di JSP sangat 1900-an.

Namun serius, jika tidak ada kode di JSP, Anda tidak menguji JSP. Anda sedang menguji tindakan / aliran. Maka Anda bisa menggunakan HttpUnit atau Selenium . Perbedaan besar adalah bahwa Selenium menguji dari browser nyata.

Jeanne Boyarsky
sumber
13

Saya tidak berpikir ada cara yang baik untuk menguji JSP, terutama karena mereka dikembangkan sebelum unit testing menjadi fokus pengembangan.

Robert Martin menulis artikel beberapa tahun yang lalu tentang meretas kompiler JSP sehingga Anda dapat mengarahkan, unit test berbasis non-container. Idenya bagus, tapi itu rusak dengan perilisan besar TomCat berikutnya. Terlalu banyak keajaiban yang terjadi.

Saya tidak setuju dengan ide "hanya jangan tambahkan kode dan Anda tidak perlu mengujinya". SANGAT Anda tidak boleh memasukkan kode ke dalam JSP. Namun demikian, UI yang kompleks sering kali memiliki tampilan logika yang dapat menguntungkan unit yang diuji.

Pertimbangkan contoh ini:

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

Kode ini sudah difaktorkan dengan baik: logika untuk memutuskan apakah kami menampilkan menu admin tidak ada dalam tampilan. Meskipun demikian, jika ada cara mudah untuk menguji unit JSP, maka kita dapat menulis tes untuk menunjukkan bahwa perilaku yang kita inginkan benar-benar muncul, dan itu akan melindungi kita dari perubahan ke halaman yang secara tidak sengaja membuat menu admin terlihat ketika seharusnya tidak. bisa.

portabella
sumber
4

Ada sebuah program (digunakan oleh server aplikasi apa pun yang Anda gunakan) yang mengkompilasi file .jsp menjadi file .java. Misalnya, versi sun / oracle jspc .

Setelah Anda memiliki .java yang akan dihasilkan oleh terjemahan .jsp (Anda bahkan mungkin ingin mempertimbangkan untuk menggunakan ini sebagai bagian dari proses build - mengkompilasi jsp untuk peningkatan kinerja pada hit pertama), Anda kemudian dapat menjalankan tes terhadapnya. dengan mengejek permintaan dan memverifikasi respons adalah apa yang Anda harapkan.

(sunting dengan contoh :)

Metode kunci untuk ini adalah _jspService(HttpServletRequest, HttpServletResponse)metode.

Halo halo dunia yang sepele:

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

(test.jsp terletak di dalam direktori bernama 'webapp' dan juga direktori 'keluar') Ketika dikompilasi dengan perintah jspc -v -d out -compile -uriroot webapp/ test.jspmenempatkan ke dalam direktori keluar file yang disebut test_jsp.java. File ini ada di dalamnya (bersama dengan sedikit pengaturan konfigurasi lainnya):

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

Pada titik ini, ini merupakan tanda centang untuk memastikan bahwa JspWriter dipanggil dengan tulis atau cetak dan isi panggilannya sesuai dengan yang Anda harapkan.

Semua yang dikatakan, di dunia yang ideal, seseorang seharusnya tidak memiliki logika dalam jsp - logika seperti itu akan berada di controller atau taglibs yang diuji dengan teknik lain.


sumber
1
Apa yang ada di JSP yang akan diuji / dihina? Pengaturan data dalam permintaan / sesi dan kemudian memeriksa tampilan? Atau apakah ini jika praktik yang baik tidak diikuti dan ada logika aktual di JSP?
Jeanne Boyarsky
@JeanneBoyarsky Diperbarui dengan contoh jsp dan kode. Saya tidak akan menganggapnya sebagai praktik yang baik untuk mencoba menguji ini dengan junit tradisional - ini adalah bidang pengujian lainnya. Kedalaman mengejek bisa canggung tergantung pada set alat (misalnya subklas JspWriter sehingga orang dapat dengan mudah menguji apa yang dikirim ke sana).
3

Anda juga dapat mempertimbangkan menggunakan kerangka uji unit HTTP seperti HTTPUnit | http://httpunit.sourceforge.net/ .

Poin penting lainnya adalah untuk memisahkan masalah aplikasi Anda.

Misalnya menggunakan teknik seperti TDD (http://en.wikipedia.org/wiki/Test-driven_development), Anda akan merancang tipe untuk diuji.

Jenis yang dikonsumsi dalam JSP akan diuji dalam unit test khusus. Jika ini tidak memungkinkan, Anda harus mensimulasikan interaksi pengguna -> browser (sekali lagi, HTTPUnit alat serupa).

gsscoder
sumber
2
  • mencoba untuk mengeksternalisasi kode fungsional servlet untuk mengujinya di luar konteks servlet dengan tes unit nyata
  • uji titik akhir servlet dengan alat seperti:
    • HTTPUnit
    • HtmlUnit
    • Selenium
    • Kaktus
    • JspTest
    • ...
haylem
sumber