Модульный тест сервлета

В настоящее время я использую платформу TestNG для тестирования бизнес-логики приложения, недавно я добавил несколько классов сервлетов.

Как выполнить модульное тестирование этих классов сервлетов в среде TestNg?


person Tony    schedule 03.04.2010    source источник
comment
возможный дубликат сервлетов для модульного тестирования   -  person Raedwald    schedule 10.06.2013


Ответы (3)


Следуйте совету Скаффмана, если это возможно. Если нет, или если вы хотите протестировать поведение сервлетов как интерфейсных контроллеров, а не бизнес-логику внутри них, вы можете использовать:

person Bozho    schedule 03.04.2010
comment
Спасибо, Божо, Selenium поддерживает TestNG? - person Tony; 03.04.2010
comment
Да, Selenium поддерживает TestNG. Я бы использовал его только в том случае, если вам нужно, чтобы тесты выполнялись параллельно. Если нет, придерживайтесь JUnit. - person djangofan; 20.02.2013

Одним из самых простых способов является ServletTester от Jetty. Во встроенном Jetty все делается автоматически, так что во время тестирования ни один порт не открывается! Если вы используете Maven, для включения этого метода требуется следующий артефакт:

<dependency>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>jetty-servlet-tester</artifactId>
  <version>6.1.16</version>
  <scope>test</scope>
</dependency>

Пример:

Подготовить сервлеттестер

ServletTester tester=new ServletTester(); 
tester.addServlet(HelloServlet.class, "/hello"); 
tester.start();

Создать HTTP-запрос

HttpTester request = new HttpTester(); 
request.setMethod("GET");
request.setHeader("Host","tester"); 
request.setURI("/hello");
request.setVersion("HTTP/1.0");

Вызовите сервлет и получите ответ:

HttpTester response = new HttpTester();
response.parse(tester.getResponses(request.generate()));

Укажите, что вы хотите проверить в ответе и его содержании:

assertEquals(200,response.getStatus()); 
assertEquals("Hello Servlet",response.getContent());
person kopper    schedule 03.04.2010
comment
@koppernickus: Могу ли я интегрировать этот тестовый класс с TestNG? - person Tony; 03.04.2010
comment
@ Томман: Да. Этот класс не зависит ни от какой тестовой среды. - person kopper; 04.04.2010
comment
Интересный. Для других тестеров сервлетов требуется порт и т. д. - person Raedwald; 10.06.2013

Я предлагаю вам перенести всю бизнес-логику из классов сервлетов в ваши собственные классы, которые вы сможете протестировать. Это оставляет сервлеты просто связующим звеном между вашей бизнес-логикой и контейнером, и в них нет ничего, что стоило бы тестировать.

Классы API, такие как HttpServletRequest, ServletConfig и т. д., являются основными целями для использования фиктивной среды по вашему выбору (JMock, Mockito и т. д.), поскольку все они являются интерфейсами.

person skaffman    schedule 03.04.2010
comment
Спасибо, Скаффман, мои сервлеты обрабатывают операции, связанные с сессиями и файлами cookie. Поэтому перенос этой логики в другой класс невозможен. Я ищу API, который позволяет мне использовать сервлет модульного тестирования в testNG. - person Tony; 03.04.2010
comment
@Thomman: Это всегда возможно - просто делегируйте от сервлета классу бизнес-логики. В сервлете нет ничего, что должно идти. - person skaffman; 03.04.2010
comment
Все еще может потребоваться тестирование на уровне сервлета, хотя это будет интеграционное тестирование, а не модульное тестирование. - person Raedwald; 10.06.2013