Birim jsp dosyası nasıl test edilir?


12

Bir Java 6 EE uygulaması geliştiriyorum ve orijinal bir kullanılan işlev çağrıları ve kod test sürümü ile başka bir jsp kodumu test ediyorum ama gevşek ve pratik görünmüyor. Bu tür bir test yapmanın iyi bir yolu var mı?


2
Testlerden neler bilmeniz gerekiyor?

Yanıtlar:


15

MVC (model görünümü denetleyicisi) hakkında okumadıysanız, bunu yapın. Bir JSP'de kodunuz olmamalı, sadece görüntüleyin. JSP kod koymak çok 1900's.

Cidden, JSP'de kod yoksa, JSP'yi test etmiyorsunuzdur. Eylemi / akışı test ediyorsunuz. Sonra HttpUnit veya Selenium kullanabilirsiniz . En büyük fark, Selenyum'un gerçek bir tarayıcıdan test edilmesidir.


13

JSP'leri test etmenin iyi bir yolu olduğunu düşünmüyorum, çünkü ünite testi bir gelişim odağı haline gelmeden önce geliştirildiler.

Robert Martin birkaç yıl önce JSP derleyicisini hackleme hakkında bir makale yazdı, böylece konteynır tabanlı olmayan birim testlerini yönetebildiniz. Fikri iyiydi, ama bir sonraki TomCat büyük sürümüyle kırıldı. Çok fazla sihir var.

"Sadece kod eklemeyin ve test etmek gerekmeyecek" fikrine katılmıyorum. KESİNLİKLE JSP'ye kod koymamalısınız. Bununla birlikte, karmaşık bir kullanıcı arayüzünde genellikle birim olarak test edilebilen görüntü mantığı bulunur.

Bu örneği düşünün:

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

Bu kod zaten iyi bir faktördür: yönetici menüsünü gösterip göstermememize karar veren mantık görünümde değildir. Bununla birlikte, JSP'leri birim olarak test etmenin kolay bir yolu olsaydı, istediğimiz davranışın gerçekten göründüğünü göstermek için bir test yazabiliriz ve bizi yönetici menüsünü yanlışlıkla gerektiğinde görünür yapan sayfadaki bir değişiklikten koruyabilirdi. Olmaz.


4

Bir .jsp dosyasını bir .java dosyasına derleyen bir program (kullandığınız uygulama sunucusu tarafından kullanılır) vardır. Örneğin, güneş / oracle sürümü jspc .

.Jsp çevirisi tarafından üretilecek .java'ya sahip olduğunuzda (bunu oluşturma işleminin bir parçası olarak kullanmayı düşünebilirsiniz - ilk isabette performans iyileştirmeleri için jsp'yi önceden derleyebilirsiniz), daha sonra buna karşı testler çalıştırabilirsiniz. isteği alay ederek ve yanıtı doğrulayarak beklediğiniz şeydir.

(örnekle düzenleyin :)

Bunun ana yöntemi _jspService(HttpServletRequest, HttpServletResponse)yöntemdir.

Önemsiz bir merhaba dünya 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' adlı bir dizinde ve ayrıca bir 'out' dizininde bulunur) Komutla derlendiğinde, jspc -v -d out -compile -uriroot webapp/ test.jspbir out klasörüne yerleştirilir test_jsp.java. Bu dosya içinde (diğer yapılandırma kurulumlarının bir kısmı ile birlikte) var:

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

Bu noktada, JspWriter'ın yazma veya yazdırma ile çağrıldığından ve aramanın içeriğinin beklediğiniz gibi olduğundan emin olmak için bir kontrol.

Bütün bunlar, ideal bir dünyada, jsp içinde herhangi bir mantık olmamalıdır - bu mantık ya kontrolörde ya da diğer tekniklerle test edilen taglibs'de olur.


1
JSP'de test edilecek / taklit edilecek ne olurdu? İstek / oturumdaki verileri ayarlama ve ardından ekranı kontrol etme? Yoksa iyi uygulama takip edilmezse ve JSP'de gerçek bir mantık var mı?
Jeanne Boyarsky

@JeanneBoyarsky Örnek jsp ve kod ile güncellendi. Bunu geleneksel bir hazine ile test etmenin iyi bir uygulama olduğunu düşünmüyorum - bu da başka bir test alanı. Alay etme derinliği, araç setine bağlı olarak garip olabilir (örneğin, JspWriter alt sınıflaması, kendisine gönderilenleri kolayca test edebilmek için).

3

HTTPUnit | gibi bir HTTP birim sınama çerçevesi kullanmayı da düşünebilirsiniz. http://httpunit.sourceforge.net/ .

Bir diğer önemli nokta da başvurunuzla ilgili kaygıları birbirinden ayırmaktır.

Örneğin, TDD (http://en.wikipedia.org/wiki/Test-driven_development) gibi teknikleri kullanarak , test edilebilirlik için türler tasarlayacaksınız.

JSP içinde tüketilen türler belirli birim testlerinde test edilecektir. Bu mümkün değilse, kullanıcı -> tarayıcı etkileşimini simüle etmelisiniz (yine HTTPUnit veya benzer bir araç).


2
  • gerçek birim testleri ile sunucu uygulaması bağlamının dışında test etmek için sunucu uygulamasının işlevsel kodunu harici hale getirmeye çalışın
  • sunucu uygulaması uç noktalarını aşağıdaki araçlarla test edin:
    • HttpUnit
    • HtmlUnit'in
    • Selenyum
    • Kaktüs
    • JspTest
    • ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.