Як встановити тест на файл jsp?


12

Я розробляю програму Java 6 EE і тестую свій jsp-код з іншим з тестовою версією функціональних викликів та коду, що використовується в оригінальній, але це видається вільним і непрактичним. Чи є хороший спосіб провести такий вид тестування?


2
Що потрібно знати з тестів?

Відповіді:


15

Якщо ви ще не читали про MVC (контролер перегляду моделі), зробіть це. У вас не повинно бути коду в JSP, просто показуйте. Введення коду в JSP дуже 1900-х.

Якщо серйозно, якщо в JSP немає коду, ви не тестуєте JSP. Ви протестуєте дію / потік. Тоді ви можете використовувати HttpUnit або Selenium . Велика різниця полягає в тому, що тести Selenium від справжнього браузера.


13

Я не думаю, що існує хороший спосіб тестування 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, тоді ми могли б написати тест, щоб показати, що поведінка, яку ми хочемо, насправді з’являється, і це захистило б нас від зміни сторінки, яка випадково зробила меню адміністратора видимим, коли воно не повинно не бути.


4

Існує програма (використовується будь-яким сервером додатків, який ви використовуєте), який компілює файл .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 - така логіка буде або в контролері, або в талібах, які тестуються за допомогою інших методик.


1
Що було б у ПСП, яке було б випробувано / знущено? Встановлення даних у запиті / сесії, а потім перевірка дисплея? Або це, якщо належної практики не дотримуються і в ССП є фактична логіка?
Жанна Боярський

@JeanneBoyarsky Оновлено прикладом jsp та кодом. Я б не вважав, що це було б хорошою практикою спробувати тестування цього традиційного джуніту - його ще одна сфера тестування. Глибина глузування може бути незручною залежно від набору інструментів (наприклад, підкласифікація JspWriter, щоб можна було легко перевірити те, що їй направлено).

3

Ви також можете розглянути можливість використання тестової основи HTTP-блоку, наприклад HTTPUnit | http://httpunit.sourceforge.net/ .

Ще одним важливим моментом є чітке розділення вашої заявки.

Наприклад, використовуючи такі методи, як TDD (http://en.wikipedia.org/wiki/Test-driven_development), ви спроектуєте типи для перевірки.

Типи, що споживаються в рамках JSP, будуть перевірені в конкретних одиничних тестах. Якщо це неможливо, слід імітувати взаємодію користувача -> браузера (знову ж таки, HTTPUnit або подібний інструмент).


2
  • спробуйте розширити функціональний код сервлета, щоб перевірити його поза контекстом сервлета за допомогою реальних тестових одиниць
  • протестуйте кінцеві точки сервлетів за допомогою таких інструментів:
    • HTTPUnit
    • HtmlUnit
    • Селен
    • Кактус
    • JspTest
    • ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.