Spring 3 - настоящий интеграционный тест - PullRequest
1 голос
/ 07 ноября 2011

В настоящее время я работаю над приложением на основе пружины. У меня есть некоторые модульные тесты для многих целей приложения. Проблема в том, что я не нашел никакого решения для проведения реального интеграционного теста в моем приложении.

Позвольте привести пример:

В моих текущих тестах я настраиваю запрос для конкретного контроллера и передаю эти компоненты моему обработчику:

// setup request
request.setMethod("GET");
request.setRequestURI("/customer");
request.addHeader("Accept", "application/json");
request.addHeader("Authorization", "Basic xyz"); // base_64
handlerAdapter.handle(request, response, myController);

Но это не настоящий интеграционный тест, потому что я говорю: хорошо, у меня есть запрос, и myController должен обработать этот запрос.

Это проблема, потому что я действительно хочу проверить следующее:

У меня есть запрос, и мое приложение должно обработать этот запрос. Я не хочу указывать контроллер, потому что в случае работающего приложения и запроса к «/ customer» Spring отправляет, какой контроллер решает мой запрос. Я действительно хочу смоделировать, что я являюсь браузером или другим клиентом, отправляющим запросы в мой бэкэнд.

Причина, по которой я хочу это проверить, заключается в том, что в противном случае некоторые виды тестов проходят, хотя проверенная функциональность не работает в "реальном мире"

Я мог бы дать вам этот пример, чтобы понять, чем тесты отличаются от производственного цикла:

Предположим, у меня есть загрузка файла в форме с параметром. Вот моя функция контроллера:

@RequestMapping(value="/{id}", method = RequestMethod.PUT, headers="content-type=multipart/form-data")
public ResponseEntity<String> createFromMyForm(@PathVariable("id") Long id, @RequestParam String myParameter, @RequestParam MultipartFile myFile) {
//...
}

Посмотрите на RequestMethod.PUT, это не работает в производственной сборке, потому что стандарт HTML для загрузки файлов - это POST.

В моем модульном тесте я делаю это:

// setup request
MockMultipartHttpServletRequest multipartRequest = new MockMultipartHttpServletRequest();
MockHttpServletResponse multipartResponse = new MockHttpServletResponse();

// Open file
final FileInputStream fis = new FileInputStream("img/test.png");
MockMultipartFile multipartFile = new MockMultipartFile(
            "myParameter", fis);

// generate multipart mock
multipartRequest.addFile(multipartFile);
multipartRequest.addParameter("json", "test");

// send request
handlerAdapter.handle(multipartRequest, multipartResponse, controller);

Проблема: тест проходит, а не должен. Причин, по которым этот тест проходит, несколько. Сначала я уточняю запрос. Я не говорю, что у меня есть запрос, но вместо этого я должен сказать, что у меня есть MultipartRequest. Это приводит к тому, что сервлет диспетчера возвращает true в функции, называемой что-то вроде isMultipartRequest (). В производственном прогоне возвращается false, потому что в методах PUT нет многочастных запросов. Далее я снова указываю контроллер, который должен обрабатывать этот запрос.

Может быть, есть и другие примеры, но я хочу сказать, есть ли способ протестировать мое приложение в реальных условиях, включая мой протокол html и все остальное?

Буду очень признателен за любую помощь!

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

На прошлой неделе я нашел эти два весенних класса,

Я никогда не использовал их, и я не уверен на 100%, как они работают.Но я хотел указать на это, потому что они не упомянуты в Spring Reference.И поверьте мне, это очень много работы, чтобы получить первый реальный интеграционный тест с запущенным развернутым сервером.Так что, пока макеты не высмеивают то, что вы хотите протестировать, я настоятельно рекомендую использовать макеты.


Но я вам действительно нуждаюсь в развернутом приложении (как предложил Скаффман в своем ответ ).Затем я хочу упомянуть две другие рамки тестирования:

  • Selenium 2.0 / Webdriver - это среда для управления браузером, но в ней также есть драйвер HtmlUnit, который "имитирует""браузер
  • Apache HttpComponents HttpClient .Это более низкий уровень, чем Selenium, но я запускаю его через 10 минут, в то время как мне нужно гораздо больше времени для реальных испытаний Selenium.
1 голос
/ 07 ноября 2011

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

Еще лучше, посмотрите Selenium .Это на самом деле будет управлять реальным браузером и утверждать содержимое страницы.Он более сложный, чем HtmlUnit, но обычно приводит к более содержательному тесту, особенно для веб-приложений, насыщенных JavaScript.

...