Тест интеграции пружин медленный с автопроводкой - PullRequest
18 голосов
/ 21 сентября 2010

Я пытаюсь ускорить интеграционные тесты в нашей среде. Все наши занятия проводные. В нашем файле applicationContext.xml мы определили следующее:

<context:annotation-config/>
<context:component-scan base-package="com.mycompany.framework"/>
<context:component-scan base-package="com.mycompany.service"/>
...additional directories

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

В результате следующий тест занимает около 14 секунд:

public class MyTest extends BaseSpringTest {
  @Test
  def void myTest(){
    println "test"
  }
}

Есть ли способ ленивой загрузки конфигурации? Я попытался добавить default-lazy-init="true", но это не сработало.

В идеале создаются только компоненты, необходимые для теста.

спасибо заранее.

Обновление : я должен был сказать это раньше, я не хочу иметь файл контекста для каждого теста. Я также не думаю, что один контекстный файл только для тестов будет работать. (Этот тестовый контекстный файл будет включать все)

Ответы [ 7 ]

15 голосов
/ 05 октября 2010

Если вы действительно хотите ускорить контекст приложения , отключите

Поскольку перед выполнением любого теста вам нужно выполнить описанную выше процедуру, вы можете создать абстрактный класс, в котором вы сможете запустить следующее

Настройка свойства системы Java для среды тестирования следующим образом

-Doptimized-application-context=false

И

public abstract class Initializer {

    @BeforeClass
    public static void setUpOptimizedApplicationContextFile() {
        if(System.getProperty("optimized-application-context").equals("false")) {
            // do as shown above

            // and

            System.setProperty("optimized-application-context", "true"); 
        }

    }

}

Теперь для каждого класса тестирования просто расширяется Initializer

2 голосов
/ 05 октября 2010

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

В этой теме обсуждается переопределение bean-компонентов и пользовательский тестовый класс для этого:

Переопределение бобов в тестовой среде

1 голос
/ 02 октября 2010

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

Добавление: Если этого недостаточно, и вы используете junit, вы можете использовать утилиту из проекта JUnit Addons . Класс DirectorySuiteBuilder динамически создает набор тестов из структуры каталогов. Так что вы можете сделать что-то вроде

DirectorySuiteBuilder builder = new DirectorySuiteBuilder();
Test suite = builder.suite("project/tests");

Инициализируя контекст Spring перед этим кодом, вы можете запустить все тесты одновременно. Однако, если каждый тест предполагает «чистый» контекст Spring, вы, вероятно, потерялись.

1 голос
/ 26 сентября 2010

Это цена, которую вы платите за автоопределение компонентов - она ​​медленнее.Даже если ваш тест требует только определенных bean-компонентов, ваш <context:component-scan> намного шире, и Spring будет создавать и инициализировать каждый бин, который он найдет.

Я предлагаю использовать для ваших тестов другой файл bean, которыйопределяет бины, необходимые для самого теста, т.е. не используя <context:component-scan>.

0 голосов
/ 26 декабря 2011

Поскольку ни один из ответов здесь не решил эту проблему для меня, я добавляю свой собственный опыт.

Моя проблема заключалась в том, что Spring, Hibernate и EhCache сгруппировались в попытке утопить мою консоль с подробными DEBUG сообщениями, что привело к нечитаемому журналу и - что еще хуже - невыносимой низкой производительности.

Настройка всех уровней логов фиксирована:

Logger.getLogger("org.hibernate").setLevel(Level.INFO);
Logger.getLogger("net.sf.ehcache").setLevel(Level.INFO);
Logger.getLogger("org.springframework").setLevel(Level.INFO);
0 голосов
/ 06 октября 2011

Конвенционная фабрика бобов предназначена для решения этой проблемы и значительно ускоряет весь процесс, в 3 раза или более.

0 голосов
/ 05 октября 2010

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

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

...