Как проверить наличие ошибок в конфигурации Spring?

#java #spring #testing #junit

#java #spring #тестирование #junit

Вопрос:

В последние годы я работал над веб-приложениями, написанными на Java, используя Spring MVC framework. Проекты имеют хорошее тестовое покрытие с помощью JUnit и Selenium. Однако в двух случаях ошибки в конфигурации Spring прошли через процесс тестирования.

В одном случае было внесено изменение в родительский компонент в controllerContext.xml что также потребовало изменения двух наследуемых компонентов. Но требуемое изменение было внесено только в один из двух наследуемых компонентов. Ошибка была видна только в небольшой, но важной части веб-приложения. Тесты Selenium UA позже были расширены, чтобы проверить это непосредственно в веб-приложении. до развертывания, но ущерб уже был нанесен, поскольку ошибка попала в живую среду.

В другом случае свойство, необходимое для установки формата данных, не вводилось должным образом через applicationContext.xml . Единственная видимая ошибка была в формате даты сгенерированного отчета, загруженного из веб-приложения. Сложно протестировать с помощью Selenium.

Одним из преимуществ использования Spring MVC является возможность устанавливать вводимые объекты в ваших тестах JUnit (т. Е. Макет объекта), но это не говорит вам, что вы на самом деле собираетесь вводить, когда приложение выполняется в живой среде.

Ответом может быть интеграционное тестирование, однако настройка и запуск интеграционного тестирования в прошлом оказывались сложными… но это другой вопрос …

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

Итак, мой вопрос:

Каков наилучший способ проверки на наличие ошибок в конфигурации Spring?

Комментарии:

1. Извините, но я не понимаю, почему мы должны рассматривать ошибку конфигурации spring как какую-то особую ошибку. Кстати, я не вижу никаких преимуществ в использовании наследования компонентов, если у вас настроено только два компонента. Что касается интеграционного тестирования, Test Context Framework был разработан, чтобы помочь вам в этом, можно разделить контекст вашего приложения на несколько контекстов (которые формируют наборы конфигураций в STS) и запускать интеграционные тесты для реальных объектов и объединять их.

2. @BorisTreukhov Я думаю, что это другое (но не обязательно в плохом смысле). Конфигурация spring кажется на один шаг удаленной от тестового кода по сравнению с самим кодом Java. И мой непосредственный опыт показывает, что ошибки, внесенные в конфигурацию Spring, оказалось сложнее обнаружить, поэтому мы (я) что-то упустили, и я благодарен за все советы.

Ответ №1:

Этот тестовый пример сотворит волшебство

 import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@ContextConfiguration(locations={"/server-application-context.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringConfigurationTest {

    @Test
    public void testSpringConfiguration() {
    }
}
  

Комментарии:

1. Спасибо за публикацию этого кода. Будет ли это проверять синтаксис applicationContext.xml ?

2. @rdc: Да, код завершится ошибкой, если возникнут какие-либо проблемы с конфигурацией (например, синтаксические ошибки, компоненты, которые не могут быть решены, все, что вы получите при обычном запуске).

Ответ №2:

Тип ошибок, которые вы описываете, будет обнаружен тестами только тогда, когда кто-то подумает / вспомнит, чтобы проверить эти условия:

В одном случае было внесено изменение в родительский компонент в controllerContext.xml что также потребовало изменения двух наследуемых компонентов. Но требуемое изменение было внесено только в один из двух наследуемых компонентов. Ошибка была видна только в небольшой, но важной части веб-приложения. Тесты Selenium UA позже были расширены, чтобы проверить это непосредственно в веб-приложении. до развертывания, но ущерб уже был нанесен, поскольку ошибка попала в живую среду.

В другом случае свойство, необходимое для установки формата данных, не вводилось должным образом через applicationContext.xml . Единственная видимая ошибка была в формате даты сгенерированного отчета, загруженного из веб-приложения. Сложно протестировать с помощью Selenium.

В обоих случаях у вас есть разработчик, который внес изменения, не проверив, что везде, где это изменение затрагивает, нет ошибок. Как вы можете обнаружить ошибку такого типа в тесте в стиле JUnit, не полагаясь на то, что человек, вносящий изменения, явно добавит тест на ошибку, которую он совершает? Другими словами, вы можете обнаружить эти типы ошибок только тогда, когда не забудете их проверить.

Лично я считаю, что лучший подход для выявления подобных ошибок — это более селеноподобные тесты, которые фактически вызывают приложение и утверждают правильное поведение.

Но если ваши тесты не знают правильного поведения для тестирования, вы не сможете отлавливать подобные ошибки — для обнаружения ошибок требуется, чтобы вы сначала поняли, какие ошибки нужно отлавливать.

Другими словами — вы не можете проверить, что вводятся правильные значения, если тест не знает, каковы правильные значения. Эти тесты не будут улавливать сценарии, в которых то, что кто-то считает правильным значением, на самом деле неверно.

Комментарии:

1. Я думаю, вы понимаете, что я пытался спросить. И я думаю, что вы пришли к аналогичному выводу для меня, что тесты рабочего приложения в стиле Selenium (возможно, в промежуточной среде) — это способ выявить подобные вещи — к сожалению, такого рода тестирование можно отложить до конца процесса разработки.

Ответ №3:

@ContextConfiguration(..) и @RunWith(SpringJUnit4ClassRunner.class) в вашем тестовом классе

Это загрузит весь контекст. Вам понадобится фиктивный @Test метод, чтобы контекст был загружен.

Комментарии:

1. Да, это то, что мы делаем. Это проверка работоспособности, чтобы убедиться, что контекст правильный. Если есть проблема, это должно привести к тем же ошибкам, которые вы получите при запуске вашего контейнера.

2. Это круто. Я попробовал, и это работает. Но есть одна проблема с этим способом. Если я использую проект maven, в моем конфигурационном файле будет много переменных (будут заменены на maven во время установки). Когда я запускаю переменную тестового примера, она не заменяется должным образом. Так что не удалось протестировать.

3. вот почему я не использую фильтры maven для замены свойств. Вместо этого я использую spring для загрузки их из внешнего хранилища.

4. Я просто подумал, что могу настроить профиль maven в моем eclipse. Теперь ваш подход полностью работает и для меня…

5. это решает техническую проблему, поставленную в этом вопросе — как загрузить контекст Spring в тесте JUnit, — но я не думаю, что это решает часть вопроса о людях / процессах.