Yanıtlar:
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.
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.
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.jsp
bir 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.
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ç).