Как заполнить веб-приложение исходными данными

#hibernate #maven-2 #orm #jpa

#переход в спящий режим #maven-2 #orm #jpa

Вопрос:

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

Модульные тесты работают со своими собственными данными, созданными в коде перед каждым тестированием. Мои тестовые классы расширяют org.springframework.test.jpa.AbstractJpaTests.

Наконец, я хотел бы иметь сборку maven, которая создает объекты формы базы данных (теперь мне нужно запустить приложение в первый раз, чтобы создать базу данных, затем запустить скрипт), затем заполняет исходные данные / словарь и запускает модульные и интеграционные тесты. Этот процесс должен быть полностью автоматизирован, чтобы поместить эту сборку на CI server (hudson), создание новой базы данных с нуля также приветствуется.

Дополнительное требование: решение, не зависящее от базы данных, будет наиболее ценным.

РЕДАКТИРОВАТЬ: Лучший пример того, что я ищу, — это закрытие инициализации в BootStrap.groovy.

Ответ №1:

РЕДАКТИРОВАТЬ: Добавлена ссылка на сообщение в блоге, показывающее, как протестировать Hibernate JPA с помощью Spring и DBUnit.

[…] Я хотел бы иметь сборку maven, которая создает базу данных из объектов

Существует плагин maven hibernate3 с целью hibernate3: hbm2ddl, который может помочь. В сочетании с плагином maven sql должно быть возможно создать эту схему из сгенерированного DDL.

[…] затем заполняет исходные данные / словарь

Опять же, плагин maven sql мог бы выполнить эту работу здесь. Или, может быть, с помощью DBUnit, что является другим элегантным решением (см. Плагин maven dbunit).

и запустить модульные и интеграционные тесты.

Ну, я не уверен, что ваши модульные тесты должны обращаться к базе данных, но для тестов интеграции проверьте DBUnit, как я уже сказал. Это действительно очень хороший инструмент, который позволяет вам настроить базу данных в известном состоянии, протестировать таблицы на предмет ожидаемого содержимого после выполнения теста и вернуть базу данных в исходное состояние. Хороший пример см. в разделе Тестирование JPA Hibernate с помощью Spring и DBUnit.

Этот процесс должен быть полностью автоматизирован, чтобы поместить эту сборку на CI server (hudson), создание новой базы данных с нуля также приветствуется.

Я думаю, что это возможно.

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

1. Я рассматриваю возможность использования Unitils для моего модульного теста. Мне интересно, есть ли способ определить исходные данные в файле script / xml, прочитать их в java и перенести, используя JPA / Hibernate, независимо от базы данных.

2. Проверьте DBUnit, это то, что вы ищете, за исключением того, что оно не основано на JPA. DBUnit и его API позволяют определять исходные и ожидаемые данные в xml / csv, загружать их из модульных тестов, выполнять assert для содержимого таблицы, восстанавливать базу данных в исходном состоянии. И существует интеграция между DBUnit и Unitils (см. unitils.org/apidocs/org/unitils/dbunit/package-summary.html )

Ответ №2:

@David, спасибо за твой пост. Единственное разумное решение, которое я нашел для заполнения исходных данных, похоже на ваше — это вставка данных в тесты. В моем коде я даже не использую hibernate3-maven-plugin. Создание базы данных выполняется Spring в файле jpaContext.xml

 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
  <bean
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
      <property name="showSql" value="true" />
      <property name="generateDdl" value="true" />
      <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect"/>
  </bean>
</property>
<property name="dataSource" ref="dataSource"/>
  

Как я уже писал, я использую org.springframework.test.jpa.AbstractJpaTests с переопределенным методом

 
  @Override
  protected String[] getConfigLocations() {
    return new String[]{
      "classpath:/jpaContext.xml"};
  }
  

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

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

1. Есть отрицательные отзывы о DBUnit (просто интересно, читаете ли вы мои ответы и / или комментарии)?

2. @Pascal. Почему отрицательный? 🙂 Я прочитал ваши комментарии / ответы. Наиболее предпочтительным решением для меня является настройка (я все еще ищу, как) способа JPA / Hibernate. Unitils / DBUnit — еще один хороший вариант, но уже второй.

Ответ №3:

Я решил проблему, почти идентичную вашей, расширив

org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests

Затем я использовал hibernate3-maven-plugin для заполнения базы данных (я использовал hsqldb) во время тестирования:

       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>hibernate3-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <components>
                    <component>
                        <name>hbm2ddl</name>
                        <implementation>jpaconfiguration</implementation>
                    </component>
                </components>
                <componentProperties>
                    <drop>true</drop>
                    <jdk5>true</jdk5>
                    <propertyfile>target/classes/jdbc.properties</propertyfile>
                    <skip>${maven.test.skip}</skip>
                </componentProperties>
            </configuration>
            <executions>
                <execution>
                    <phase>process-test-resources</phase>
                    <goals>
                        <goal>hbm2ddl</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>${jdbc.groupId}</groupId>
                    <artifactId>${jdbc.artifactId}</artifactId>
                    <version>${jdbc.version}</version>
                </dependency>
            </dependencies>
        </plugin>
  

Я опубликовал простой проект maven в Google Code, чтобы продемонстрировать технику.

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

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