कैसे एक jsp फ़ाइल का परीक्षण करने के लिए यूनिट?


12

मैं एक जावा 6 ईई एप्लिकेशन विकसित कर रहा हूं और मैं अपने जेएसपी कोड का परीक्षण दूसरे के साथ फ़ंक्शन कॉल और कोड के मूल संस्करण में परीक्षण कर रहा हूं, लेकिन यह ढीला और अव्यवहारिक लगता है। क्या इस तरह के परीक्षण को पूरा करने का एक अच्छा तरीका है?


2
परीक्षणों से आपको क्या जानने की आवश्यकता है?

जवाबों:


15

यदि आपने MVC (मॉडल व्यू कंट्रोलर) के बारे में नहीं पढ़ा है, तो ऐसा करें। आपको एक JSP में कोड नहीं होना चाहिए, बस प्रदर्शन करना चाहिए। जेएसपी में कोड डालना बहुत 1900 है।

गंभीरता से हालांकि, अगर JSP में कोई कोड नहीं है, तो आप JSP का परीक्षण नहीं कर रहे हैं। आप कार्रवाई / प्रवाह का परीक्षण कर रहे हैं। तब आप HttpUnit या सेलेनियम का उपयोग कर सकते हैं । बड़ा अंतर यह है कि सेलेनियम एक वास्तविक ब्राउज़र से परीक्षण करता है।


13

मुझे नहीं लगता कि JSPs का परीक्षण करने का एक अच्छा तरीका है, मुख्य रूप से क्योंकि वे यूनिट परीक्षण से पहले विकसित किए गए थे जो विकास का ध्यान केंद्रित करते हैं।

रॉबर्ट मार्टिन ने जेएसपी कंपाइलर को हैक करने के बारे में कई साल पहले एक लेख लिखा था ताकि आप गैर-कंटेनर आधारित इकाई परीक्षणों को निर्देशित कर सकें। उनका विचार अच्छा था, लेकिन अगले टॉमकैट प्रमुख रिलीज के साथ इसे तोड़ दिया गया। अभी बहुत जादू चल रहा है।

मैं "बस कोड नहीं जोड़ता हूं और आप इसे परीक्षण करने की आवश्यकता नहीं है" विचार से असहमत हैं। OBVIOUSLY आपको JSP में कोड नहीं डालना चाहिए। लेकिन फिर भी एक जटिल यूआई में अक्सर प्रदर्शन तर्क होंगे जो लाभकारी इकाई परीक्षण कर सकते हैं।

इस उदाहरण पर विचार करें:

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

यह कोड पहले से ही अच्छी तरह से बताया गया है: यह तय करने का तर्क कि क्या हम व्यवस्थापक मेनू दिखाते हैं, दृश्य में नहीं है। फिर भी, अगर JSPs को जांचने का एक आसान तरीका था, तो हम यह दिखाने के लिए एक परीक्षण लिख सकते हैं कि जो व्यवहार हम चाहते हैं वह वास्तव में प्रकट होता है, और यह हमें उस पृष्ठ में बदलाव से बचाएगा, जो गलती से व्यवस्थापक मेनू को दिखाई दे जब यह होना चाहिए 'हो न हो।


4

एक प्रोग्राम मौजूद है (जो भी एप्लिकेशन सर्वर आप उपयोग कर रहे हैं) एक .jsp फ़ाइल को .java फ़ाइल में संकलित करता है। उदाहरण के लिए, सूरज / ऑरेकल संस्करण jspc

एक बार जब आपके पास .java है कि .jsp अनुवाद द्वारा निर्मित किया जाएगा (आप इसे निर्माण प्रक्रिया के भाग के रूप में उपयोग करने पर भी विचार कर सकते हैं - पहले हिट पर प्रदर्शन सुधार के लिए jsp precompiling), तो आप इसके खिलाफ परीक्षण चला सकते हैं अनुरोध का मजाक उड़ाने और प्रतिक्रिया की पुष्टि करने से आप जो अपेक्षा कर रहे हैं।

(उदाहरण के साथ संपादित करें :)

इसके लिए प्रमुख विधि _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' नाम की डायरेक्टरी के भीतर स्थित है और 'आउट' डायरेक्टरी भी है। जब कमांड 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 के भीतर कोई तर्क नहीं होना चाहिए - ऐसा तर्क या तो नियंत्रक या टैगलिब में होगा जो अन्य तकनीकों के साथ परीक्षण किया जाता है।


1
JSP में ऐसा क्या होगा जिसका परीक्षण / परीक्षण किया जाएगा? अनुरोध / सत्र में डेटा सेट करना और फिर प्रदर्शन की जांच करना? या यह कि अगर अच्छे अभ्यास का पालन नहीं किया जाता है और जेएसपी में वास्तविक तर्क है?
जेनी बोयर्सकी

@JeanneBoyarsky उदाहरण जेएसपी और कोड के साथ अपडेट किया गया। मैं इसे पारंपरिक कनिष्ठ के साथ परीक्षण करने की कोशिश करना अच्छा नहीं मानूंगा - परीक्षण का एक और क्षेत्र। टूल सेट के आधार पर मॉकिंग की गहराई अजीब हो सकती है (जैसे कि JspWriter को उप-वर्ग करना ताकि कोई आसानी से परीक्षण कर सके कि उसे क्या भेजा गया है)।

3

आप HTTP यूनिट टेस्ट फ्रेमवर्क का उपयोग करने पर भी विचार कर सकते हैं जैसे HTTPUnit | http://httpunit.sourceforge.net/

एक अन्य महत्वपूर्ण बिंदु आपके आवेदन की अच्छी तरह से अलग चिंताएं हैं।

उदाहरण के लिए TDD (http://en.wikipedia.org/wiki/Test-driven_development) जैसी तकनीकों का उपयोग करके , आप परीक्षणशीलता के लिए प्रकारों को डिज़ाइन करेंगे।

JSP के भीतर उपभोग किए जाने वाले प्रकारों को विशिष्ट इकाई परीक्षणों में परखा जाएगा। यदि यह संभव नहीं है, तो आपको उपयोगकर्ता -> ब्राउज़र इंटरैक्शन (फिर से HTTPUnit o समान टूल) का अनुकरण करना चाहिए ।


2
  • वास्तविक इकाई परीक्षणों के साथ सर्वलेट संदर्भ के बाहर परीक्षण करने के लिए सर्वलेट के कार्यात्मक कोड को बाहरी करने का प्रयास करें
  • उपकरण जैसे उपकरणों के साथ सर्वलेट एंडपॉइंट का परीक्षण करें:
    • HTTPUnit
    • HtmlUnit
    • सेलेनियम
    • कैक्टस
    • JspTest
    • ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.