Відповіді:
Якщо ви ще не читали про MVC (контролер перегляду моделі), зробіть це. У вас не повинно бути коду в JSP, просто показуйте. Введення коду в JSP дуже 1900-х.
Якщо серйозно, якщо в JSP немає коду, ви не тестуєте JSP. Ви протестуєте дію / потік. Тоді ви можете використовувати HttpUnit або Selenium . Велика різниця полягає в тому, що тести Selenium від справжнього браузера.
Я не думаю, що існує хороший спосіб тестування JSP, головним чином, тому, що вони були розроблені до того, як тестування одиниць стало центром розвитку.
Роберт Мартін кілька років тому написав статтю про злом компілятора JSP, щоб ви могли направляти тести на одиниці, що не містять контейнери. Його ідея була гарна, але вона була порушена з наступним головним випуском TomCat. Просто надто багато магії відбувається.
Я не згоден з ідеєю "просто не додавати код і вам не потрібно буде тестувати його". ОБОВ'ЯЗКОВО вам не слід вводити код у JSP. Але, тим не менш, складний інтерфейс часто матиме логіку відображення, яка може бути вигідно перевірена одиницею.
Розглянемо цей приклад:
<c:choose>
<c:when test="${mydto.showAdminMenu}">
The admin menu....
</c:when>
<c:otherwise>
Something completely different
</c:otherwise>
</c:choose>
Цей код вже добре врахований: логіка для вирішення, чи буде ми відображати меню адміністратора, відсутня. Тим не менш, якби був простий спосіб встановити тестові JSP, тоді ми могли б написати тест, щоб показати, що поведінка, яку ми хочемо, насправді з’являється, і це захистило б нас від зміни сторінки, яка випадково зробила меню адміністратора видимим, коли воно не повинно не бути.
Існує програма (використовується будь-яким сервером додатків, який ви використовуєте), який компілює файл .jsp у файл .java. Наприклад, версія sun / 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', а також у каталозі 'out'). При компіляції з командою 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 - така логіка буде або в контролері, або в талібах, які тестуються за допомогою інших методик.
Ви також можете розглянути можливість використання тестової основи HTTP-блоку, наприклад HTTPUnit | http://httpunit.sourceforge.net/ .
Ще одним важливим моментом є чітке розділення вашої заявки.
Наприклад, використовуючи такі методи, як TDD (http://en.wikipedia.org/wiki/Test-driven_development), ви спроектуєте типи для перевірки.
Типи, що споживаються в рамках JSP, будуть перевірені в конкретних одиничних тестах. Якщо це неможливо, слід імітувати взаємодію користувача -> браузера (знову ж таки, HTTPUnit або подібний інструмент).