2009-09-17 16 views
10

Escribo aplicaciones web y me pregunto cuál es la forma recomendada de rellenar los datos iniciales. Esta es la aplicación JPA/Hibernate y Spring y está construida por maven. Hasta ahora he usado script que llena la base de datos con datos iniciales, comenzados a mano.
Las pruebas unitarias funcionan con sus propios datos, creados en código antes de cada prueba. Mis clases de prueba extienden org.springframework.test.jpa.AbstractJpaTests.
Finalmente me gustaría tener una construcción maven que cree entidades de formulario de base de datos (ahora necesito ejecutar la aplicación por primera vez para crear una base de datos, luego ejecutar el script) luego rellena los datos iniciales/del diccionario y ejecuta las pruebas de unidad e integración. Este proceso debe ser completamente automatizado para poner esta compilación en el servidor de CI (hudson), también se aprecia la creación de una nueva base de datos desde cero.Cómo rellenar la aplicación web con los datos iniciales


Requisito adicional: la solución agnóstica de la base de datos será más valiosa.

EDITAR: El mejor ejemplo de lo que estoy buscando es init closure in BootStrap.groovy.

Respuesta

6

EDIT: Se ha agregado un enlace a una publicación de blog que muestra cómo probar Hibernate JPA con Spring y DbUnit.

[...] me gustaría tener una acumulación experta en el que crear la base de datos de las entidades

Hay una maven hibernate3 plugin con un objetivo hibernate3:hbm2ddl que podría ayudar. Junto con maven sql plugin, debería ser posible crear este esquema a partir del DDL generado.

[...] continuación, rellena los datos iniciales/Diccionario

Una vez más, la maven sql plugin podría hacer el trabajo aquí. O tal vez con DBUnit, que es otra solución elegante (ver maven dbunit plugin).

y ejecutar la unidad y las pruebas de integración.

Bueno, no estoy seguro de que las pruebas de su unidad tengan acceso a la base de datos pero, para las pruebas de integraciones, marque DBUnit como ya he dicho. Es realmente una herramienta muy buena que le permite configurar la base de datos en un estado conocido, probar tablas para contenido esperado después de una ejecución de prueba y volver a poner la base de datos en el estado inicial. Ver Testing JPA Hibernate with Spring & DbUnit para un buen ejemplo.

Este proceso debe ser totalmente automatizado para poner esta compilación en el servidor de CI (hudson), también se aprecia la creación de nuevas bases de datos desde cero.

Creo que esto es factible.

+0

Considero el uso de Unitils para la prueba de mi unidad. Me pregunto si hay alguna forma de definir los datos iniciales en el archivo script/xml, leerlos en java y persistir usando JPA/Hibernate, en una base de datos independiente. – cetnar

+0

Compruebe DBUnit, esto es lo que está buscando, excepto que no está basado en JPA. DBunit y su API le permiten definir datos iniciales y esperados en xml/csv, cargarlos desde pruebas unitarias, realizar un aseverar el contenido de la tabla, restaurar la base de datos en el estado inicial. Y existe una integración entre DBUnit y Unitils (ver http://www.unitils.org/apidocs/org/unitils/dbunit/package-summary.html) –

0

I resuelto un problema casi idéntica a la suya extendiendo

org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests

Luego utiliza la Hibernate3-maven-plugin para poblar la base de datos (utilicé hsqldb) en el tiempo de prueba:

 <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> 

He publicado un simple maven project en Google Code para demostrar la técnica.

+0

¿Por qué no usas DbUnit? –

+0

No tengo razones técnicas para no usar DBUnit. Simplemente no lo he usado. Lo echaré un vistazo y actualizaré mi proyecto de muestra de manera apropiada. Hasta este punto he creado datos de prueba en el código. Esto es razonable para un proyecto de muestra, pero cuando se trata de probar el código del mundo real, será necesaria una solución como DBUnit. Gracias por su sugerencia. –

1

@David, gracias por su publicación. La única solución razonable que he encontrado para inicializar los datos iniciales es similar a la tuya, es decir, insertar datos en las pruebas. En mi código, incluso no uso hibernate3-maven-plugin. la creación de bases de datos en el hecho de Primavera en el archivo 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"/> 

como he escrito yo uso org.springframework.test.jpa.AbstractJpaTests con el método sobreescrito


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

Creo que se debe simplificar tu solución. Todavía busco una mejor resolución para crear datos iniciales. Crear objetos con muchas relaciones a mano es engorroso.

+0

Cualquier comentario negativo sobre DbUnit (solo me pregunto si está leyendo mis respuestas y/o comentarios)? –

+0

@Pascal. Por qué negativo? :) Leí tus comentarios/respuestas. La resolución más prefabricada para mí es tunning (todavía estoy buscando cómo) JPA/Hibernate manera. Unitils/DBUnit es otra buena opción, pero la segunda. – cetnar

Cuestiones relacionadas