Я создал веб-систему с использованием сервлетов Java и теперь хочу провести тестирование JUnit. My dataManager
- это просто базовый фрагмент кода, который отправляет его в базу данных. Как бы вы протестировали сервлет с JUnit?
Мой пример кода, который позволяет пользователю регистрироваться / регистрироваться, который отправляется с моей главной страницы через AJAX:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// Get parameters
String userName = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
try {
// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
//pass reg details to datamanager
dataManager = new DataManager();
//store result as string
String result = dataManager.register(userName, password, name);
//set response to html + no cache
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
//send response with register result
response.getWriter().write(result);
} catch(Exception e){
System.out.println("Exception is :" + e);
}
}
unit-testing
testing
servlets
junit
Лунный
источник
источник
Во-первых, в реальном приложении вы никогда не получите информацию о подключении к базе данных в сервлете; вы должны настроить его на своем сервере приложений.
Однако есть способы тестирования сервлетов без запуска контейнера. Один из них - использовать фиктивные объекты. Spring предоставляет набор очень полезных макетов для таких вещей, как HttpServletRequest, HttpServletResponse, HttpServletSession и т. Д .:
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html
Используя эти макеты, вы можете протестировать такие вещи, как
Что произойдет, если в запросе нет имени пользователя?
Что произойдет, если в запросе указано имя пользователя?
и т.д
Затем вы могли бы делать что-то вроде:
источник
Я считаю, что тесты Selenium более полезны при интеграции или функциональном (сквозном) тестировании. Я пытаюсь использовать org.springframework.mock.web , но я не очень далеко. Я прикрепляю образец контроллера с набором тестов jMock .
Во-первых, Контроллер:
Далее тест:
Надеюсь, это поможет.
источник
Обновлено в феврале 2018 г .: OpenBrace Limited закрыта , а его продукт ObMimic больше не поддерживается.
Вот еще одна альтернатива, используя библиотеку OpenBrace ObMimic тестовых двойников Servlet API (раскрытие: я ее разработчик).
Ноты:
Каждый «имитатор» имеет объект «mimicState» для своего логического состояния. Это обеспечивает четкое различие между методами API сервлета и конфигурацией и проверкой внутреннего состояния мнемосхемы.
Вы можете быть удивлены, что проверка Content-Type включает "charset = ISO-8859-1". Однако для данного кода «doPost» это соответствует документации API сервлетов Javadoc и собственному методу getContentType HttpServletResponse, а также фактическому заголовку Content-Type, созданному, например, Glassfish 3. Вы можете не осознавать этого, если используете обычные фиктивные объекты и ваши собственные ожидания от поведения API. В этом случае это, вероятно, не имеет значения, но в более сложных случаях это своего рода непредвиденное поведение API, которое может стать чем-то вроде издевательства над макетами!
Я использовал
response.getMimicState().getContentType()
как самый простой способ проверить Content-Type и проиллюстрировать вышеупомянутый пункт, но вы действительно можете проверить наличие "text / html" самостоятельно, если хотите (используяresponse.getMimicState().getContentTypeMimeType()
). Также работает проверка заголовка Content-Type так же, как и для заголовка Cache-Control.В этом примере содержимое ответа проверяется как символьные данные (при этом используется кодировка Writer). Мы также могли бы проверить, что использовался Writer ответа, а не его OutputStream (using
response.getMimicState().isWritingCharacterContent()
), но я понял , что нас интересует только конечный результат, и нам все равно, какие вызовы API его создали (хотя это может быть тоже проверил ...). Также возможно получить содержимое тела ответа в виде байтов, изучить подробное состояние Writer / OutputStream и т. Д.Полная информация об ObMimic и бесплатная загрузка на сайте OpenBrace . Или вы можете связаться со мной, если у вас возникнут вопросы (контактные данные на сайте).
источник
РЕДАКТИРОВАТЬ : Cactus теперь мертвый проект: http://attic.apache.org/projects/jakarta-cactus.html
Вы можете посмотреть на кактус.
http://jakarta.apache.org/cactus/
источник
Другой подход заключается в создании встроенного сервера для «размещения» вашего сервлета, позволяющего писать вызовы против него с помощью библиотек, предназначенных для вызовов реальных серверов (полезность этого подхода в некоторой степени зависит от того, насколько легко вы можете сделать «законный» программный звонки на сервер - я тестировал точку доступа JMS (Java Messaging Service), клиентов которой предостаточно).
Есть несколько разных маршрутов, обычно два из них - это кот и причал.
Предупреждение: при выборе сервера для встраивания следует помнить об используемой вами версии servlet-api (библиотеки, которая предоставляет классы, такие как HttpServletRequest). Если вы используете версию 2.5, я обнаружил, что Jetty 6.x работает хорошо (пример, который я приведу ниже). Если вы используете servlet-api 3.0, встроенный компонент tomcat-7 кажется хорошим вариантом, однако мне пришлось отказаться от попытки его использовать, поскольку приложение, которое я тестировал, использовало servlet-api 2.5. Попытка смешать эти два результата приведет к NoSuchMethod и другим подобным исключениям при попытке настроить или запустить сервер.
Вы можете настроить такой сервер (Jetty 6.1.26, servlet-api 2.5):
источник
Используйте Selenium для веб-модульных тестов. Существует плагин Firefox под названием Selenium IDE, который может записывать действия на веб-странице и экспортировать в тестовые наборы JUnit, которые используют Selenium RC для запуска тестового сервера.
источник
источник
Сначала вам, вероятно, следует немного реорганизовать это, чтобы DataManager не создавался в коде doPost .. вы должны попробовать Dependency Injection, чтобы получить экземпляр. (См. Видео Guice, где можно найти хорошее введение в DI.) Если вам говорят начать все модульное тестирование, то DI просто необходим.
После внедрения ваших зависимостей вы можете тестировать свой класс изолированно.
Чтобы протестировать сервлет, есть другие старые потоки, которые обсуждали это ... попробуйте здесь и здесь .
источник