วิธีการทดสอบไฟล์ jsp


12

ฉันกำลังพัฒนาแอปพลิเคชัน Java 6 EE และฉันกำลังทดสอบรหัส jsp ของฉันกับอีกอันหนึ่งด้วยเวอร์ชันการทดสอบของการเรียกใช้ฟังก์ชั่นและรหัสที่ใช้ในแอปพลิเคชันดั้งเดิม แต่ดูเหมือนจะหลวมและใช้งานไม่ได้ มีวิธีที่ดีในการทำแบบทดสอบนี้หรือไม่?


2
คุณต้องการรู้อะไรจากการทดสอบ

คำตอบ:


15

หากคุณไม่ได้อ่านเกี่ยวกับ MVC (ตัวควบคุมมุมมองแบบจำลอง) ให้ทำเช่นนั้น คุณไม่ควรมีรหัสใน JSP เพียงแสดง ใส่รหัสใน JSP เป็น 1900 มาก

อย่างจริงจังแม้ว่าหากไม่มีรหัสใน JSP คุณไม่ได้ทดสอบ JSP คุณกำลังทดสอบการกระทำ / การไหล จากนั้นคุณสามารถใช้HttpUnitหรือซีลีเนียม ความแตกต่างที่สำคัญคือซีลีเนียมทดสอบจากเบราว์เซอร์จริง


13

ฉันไม่คิดว่าจะมีวิธีที่ดีในการทดสอบ JSP ส่วนใหญ่เป็นเพราะพวกเขาได้รับการพัฒนาก่อนการทดสอบหน่วยกลายเป็นจุดสนใจของการพัฒนา

Robert Martin เขียนบทความเมื่อหลายปีก่อนเกี่ยวกับการแฮ็คคอมไพเลอร์ JSP เพื่อให้คุณสามารถทดสอบหน่วยที่ไม่ใช่คอนเทนเนอร์ได้โดยตรง ความคิดของเขาเป็นสิ่งที่ดี แต่มันก็แตกสลายด้วยรุ่นใหญ่ TomCat ถัดไป มีเวทมนต์มากเกินไปเกิดขึ้น

ฉันไม่เห็นด้วยกับแนวคิด "เพียงแค่ไม่เพิ่มโค้ดและคุณไม่จำเป็นต้องทดสอบ" อย่างจริงจังคุณไม่ควรใส่รหัสใน JSP แต่อย่างไรก็ตาม UI ที่ซับซ้อนมักจะมีลอจิกการแสดงผลที่สามารถทดสอบหน่วยได้กำไร

ลองพิจารณาตัวอย่างนี้:

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

รหัสนี้เป็นที่เรียบร้อยแล้ว: ตรรกะในการตัดสินใจว่าเราแสดงเมนูผู้ดูแลระบบไม่ได้อยู่ในมุมมอง อย่างไรก็ตามหากมีวิธีง่ายๆในการทดสอบหน่วย JSP แล้วเราสามารถเขียนการทดสอบเพื่อแสดงว่าพฤติกรรมที่เราต้องการจะปรากฏขึ้นจริงและมันจะปกป้องเราจากการเปลี่ยนแปลงไปยังหน้าเว็บที่ทำให้เมนูผู้ดูแลระบบปรากฏโดยไม่ตั้งใจ ไม่เป็น


4

มีโปรแกรมอยู่ (ใช้โดยแอปพลิเคชันเซิร์ฟเวอร์ใดก็ตามที่คุณใช้) ที่รวบรวมไฟล์. jsp ไว้ในไฟล์. java ยกตัวอย่างเช่นดวงอาทิตย์ / รุ่น oracle jspc

เมื่อคุณมี. java ที่จะถูกสร้างโดยการแปล. jsp (คุณอาจต้องการพิจารณาใช้สิ่งนี้เป็นส่วนหนึ่งของกระบวนการสร้าง - รวบรวมคอมไพล์ jsp สำหรับการปรับปรุงประสิทธิภาพในการโจมตีครั้งแรก) จากนั้นคุณสามารถทดสอบกับมันได้ โดยการเยาะเย้ยคำขอและตรวจสอบการตอบสนองเป็นสิ่งที่คุณคาดหวัง

(แก้ไขด้วยตัวอย่าง :)

วิธีการสำคัญสำหรับวิธีนี้คือ_jspService(HttpServletRequest, HttpServletResponse)วิธีการ

jsp โลกสวัสดีเล็กน้อย:

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

(test.jsp ตั้งอยู่ภายในไดเรกทอรีชื่อ 'webapp และยังมี 'ออก' directory) เมื่อรวบรวมกับคำสั่งที่เป็นไดเรกทอรีจากไฟล์ที่เรียกว่าjspc -v -d out -compile -uriroot webapp/ test.jsp test_jsp.javaไฟล์นี้มีอยู่ในนั้น (พร้อมกับบิตของการตั้งค่าอื่น ๆ ที่เป็นธรรม):

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

ณ จุดนี้เป็นการตรวจสอบเพื่อให้แน่ใจว่า JspWriter ถูกเรียกด้วยการเขียนหรือการพิมพ์และเนื้อหาของการโทรเป็นสิ่งที่คุณคาดหวัง

ทั้งหมดที่กล่าวในโลกอุดมคติไม่ควรมีตรรกะใด ๆ ใน jsp - ตรรกะดังกล่าวอาจอยู่ในคอนโทรลเลอร์หรือ taglibs ซึ่งทดสอบด้วยเทคนิคอื่น


1
อะไรจะอยู่ใน JSP ที่จะทดสอบ / เยาะเย้ยออกมา? การตั้งค่าข้อมูลในคำขอ / เซสชันจากนั้นตรวจสอบจอแสดงผล? หรือนี่คือหากไม่ปฏิบัติตามแนวปฏิบัติที่ดีและมีตรรกะจริงใน JSP หรือไม่
Jeanne Boyarsky

@JeanneBoyarsky อัปเดตด้วยตัวอย่าง jsp และรหัส ฉันไม่คิดว่ามันจะเป็นวิธีปฏิบัติที่ดีในการลองทดสอบสิ่งนี้ด้วย Junit ดั้งเดิมซึ่งเป็นขอบเขตการทดสอบอีกอัน ความลึกของการเยาะเย้ยอาจขึ้นอยู่กับชุดเครื่องมือ (เช่นคลาสย่อย JspWriter เพื่อให้สามารถทดสอบสิ่งที่ถูกส่งไปได้อย่างง่ายดาย)

3

คุณยังสามารถพิจารณาใช้กรอบการทดสอบหน่วย HTTP เช่นHTTPUnit | http://httpunit.sourceforge.net/

อีกจุดสำคัญคือการแยกความกังวลของใบสมัครของคุณ

เช่นการใช้เทคนิคเช่นTDD (http://en.wikipedia.org/wiki/Test-driven_development) คุณจะออกแบบประเภทสำหรับความสามารถในการทดสอบ

ประเภทที่ใช้ภายใน JSP จะถูกทดสอบในการทดสอบหน่วยเฉพาะ หากเป็นไปไม่ได้คุณควรจำลองผู้ใช้ ->การโต้ตอบกับเบราว์เซอร์ (อีกครั้งเป็นเครื่องมือที่คล้ายกัน HTTPUnit)


2
  • พยายามส่งโค้ดฟังก์ชันการทำงานของเซิร์ฟเล็ตออกไปภายนอกเพื่อทดสอบนอกบริบทของเซิร์ฟเล็ตด้วยการทดสอบหน่วยจริง
  • ทดสอบจุดสิ้นสุด servlet ด้วยเครื่องมือเช่น:
    • HttpUnit
    • HtmlUnit
    • ซีลีเนียม
    • ต้นกระบองเพชร
    • JspTest
    • ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.