Как заполнить веб-приложение начальными данными - PullRequest
10 голосов
/ 17 сентября 2009

Я пишу веб-приложение и мне интересно, какой рекомендуемый способ заполнить исходные данные. Это JPA / Hibernate и Spring приложение, созданное Maven. До сих пор я использовал скрипт, заполняющий базу данных исходными данными, начатый вручную.
Модульные тесты работают со своими собственными данными, созданными в коде перед каждым тестом. Мои тестовые классы расширяются org.springframework.test.jpa.AbstractJpaTests .
Наконец, я хотел бы иметь сборку maven, которая создает сущности формы базы данных (теперь мне нужно сначала запустить приложение, чтобы создать базу данных, а затем запустить скрипт), затем заполнить начальные данные / словарь и запустить модульные и интеграционные тесты. Этот процесс должен быть полностью автоматизирован, чтобы поместить эту сборку в CI-сервер (Hudson), также рекомендуется создать новую базу данных с нуля.


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

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

Ответы [ 3 ]

6 голосов
/ 17 сентября 2009

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

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

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

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

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

и запустите юнит-тесты и интеграционные тесты.

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

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

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

1 голос
/ 30 сентября 2009

@ Дэвид, спасибо за твой пост. Единственное разумное решение, которое я нашел для посева исходных данных, аналогично вашему - это вставка данных в тесты. В моем коде я даже не использую 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"};
  }

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

0 голосов
/ 30 сентября 2009

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

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, чтобы продемонстрировать эту технику.

...