ฉันกำลังพัฒนาแอปพลิเคชัน Java 6 EE และฉันกำลังทดสอบรหัส jsp ของฉันกับอีกอันหนึ่งด้วยเวอร์ชันการทดสอบของการเรียกใช้ฟังก์ชั่นและรหัสที่ใช้ในแอปพลิเคชันดั้งเดิม แต่ดูเหมือนจะหลวมและใช้งานไม่ได้ มีวิธีที่ดีในการทำแบบทดสอบนี้หรือไม่?
ฉันกำลังพัฒนาแอปพลิเคชัน Java 6 EE และฉันกำลังทดสอบรหัส jsp ของฉันกับอีกอันหนึ่งด้วยเวอร์ชันการทดสอบของการเรียกใช้ฟังก์ชั่นและรหัสที่ใช้ในแอปพลิเคชันดั้งเดิม แต่ดูเหมือนจะหลวมและใช้งานไม่ได้ มีวิธีที่ดีในการทำแบบทดสอบนี้หรือไม่?
คำตอบ:
หากคุณไม่ได้อ่านเกี่ยวกับ MVC (ตัวควบคุมมุมมองแบบจำลอง) ให้ทำเช่นนั้น คุณไม่ควรมีรหัสใน JSP เพียงแสดง ใส่รหัสใน JSP เป็น 1900 มาก
อย่างจริงจังแม้ว่าหากไม่มีรหัสใน JSP คุณไม่ได้ทดสอบ JSP คุณกำลังทดสอบการกระทำ / การไหล จากนั้นคุณสามารถใช้HttpUnitหรือซีลีเนียม ความแตกต่างที่สำคัญคือซีลีเนียมทดสอบจากเบราว์เซอร์จริง
ฉันไม่คิดว่าจะมีวิธีที่ดีในการทดสอบ 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 แล้วเราสามารถเขียนการทดสอบเพื่อแสดงว่าพฤติกรรมที่เราต้องการจะปรากฏขึ้นจริงและมันจะปกป้องเราจากการเปลี่ยนแปลงไปยังหน้าเว็บที่ทำให้เมนูผู้ดูแลระบบปรากฏโดยไม่ตั้งใจ ไม่เป็น
มีโปรแกรมอยู่ (ใช้โดยแอปพลิเคชันเซิร์ฟเวอร์ใดก็ตามที่คุณใช้) ที่รวบรวมไฟล์. 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 ซึ่งทดสอบด้วยเทคนิคอื่น
คุณยังสามารถพิจารณาใช้กรอบการทดสอบหน่วย HTTP เช่นHTTPUnit | http://httpunit.sourceforge.net/
อีกจุดสำคัญคือการแยกความกังวลของใบสมัครของคุณ
เช่นการใช้เทคนิคเช่นTDD (http://en.wikipedia.org/wiki/Test-driven_development) คุณจะออกแบบประเภทสำหรับความสามารถในการทดสอบ
ประเภทที่ใช้ภายใน JSP จะถูกทดสอบในการทดสอบหน่วยเฉพาะ หากเป็นไปไม่ได้คุณควรจำลองผู้ใช้ ->การโต้ตอบกับเบราว์เซอร์ (อีกครั้งเป็นเครื่องมือที่คล้ายกัน HTTPUnit)