Pregunta

Tengo una aplicación donde muchos "unidad" pruebas utilizan una conexión real a una base de datos Oracle durante su ejecución.

Como se puede imaginar, estas pruebas requieren demasiado tiempo para ser ejecutado, ya que necesitan para inicializar algunos contextos de primavera, y se comunican a la instancia de Oracle. Además de eso, tenemos que manejar mecanismos complejos, tales como transacciones, con el fin de modificaciones de bases de datos evitar después de la ejecución de prueba (incluso si utilizamos clases Utiles de primavera como AbstractAnnotationAwareTransactionalTests).

Así que mi idea es reemplazar progresivamente esta instancia de prueba de Oracle mediante una base de datos en memoria. Voy a utilizar hsqldb o tal vez mejor h2 .

Mi pregunta es saber cuál es el mejor enfoque para hacer eso. Mi principal preocupación está relacionada con la construcción de la estructura de base de datos en memoria y la inserción de los datos de referencia.

Por supuesto, se puede extraer la estructura de base de datos de Oracle, utilizando algunas herramientas como SQL Developer o TOAD, y luego modificar estos scripts para adaptarlos al lenguaje hsqldb o h2. Pero no creo que ese es el mejor enfoque.


De hecho, ya lo hice que en otro proyecto utilizando hsqldb, pero he escrito todo manualmente los scripts para crear tablas. Afortunadamente, tenía sólo unas pocas mesas para crear. Mi principal problema durante este paso fue "traducir" las secuencias de comandos de Oracle para crear tablas en la lengua hsqldb.

Por ejemplo, una tabla creada en Oracle utilizando el siguiente comando SQL:

CREATE TABLE FOOBAR (
    SOME_ID NUMBER,
    SOME_DATE DATE, -- Add primary key constraint
    SOME_STATUS NUMBER,
    SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);

necesitaba ser "traducida" para hsqldb a:

CREATE TABLE FOOBAR (
    SOME_ID NUMERIC,
    SOME_DATE TIMESTAMP PRIMARY KEY,
    SOME_STATUS NUMERIC,
    SOME_FLAG INTEGER DEFAULT 0 NOT NULL);

En mi proyecto actual, hay demasiadas tablas de hacerlo manualmente ...


Así que mis preguntas:

  • ¿Cuáles son los consejos que me puede dar para lograr eso?
  • ¿El h2 o hsqldb proporcionan algunas herramientas para generar sus guiones desde una conexión de Oracle?

Información técnica

Java 1.6, Spring 2.5, Oracle 10.g, Maven 2


Editar

Parte de la información con respecto a mis pruebas de unidad:

En la aplicación donde solía hsqldb, tenía las siguientes pruebas: - Algunas pruebas unitarias "básicos", que nada tienen que ver con DB. - Para la prueba de DAO, solía hsqldb para ejecutar manipulaciones de bases de datos, tales como ABM. - A continuación, en la capa de servicio, solía burlarse Mockito mis objetos DAO, con el fin de centrarse en la prueba de servicio y no todo el aplicaciones (es decir, el servicio + DAO + DB)

.

En mi aplicación actual, que tiene el peor escenario: Las comprobaciones de la capa DAO necesitan una conexión de Oracle para ejecutarse. La capa de servicios hace uso (todavía) no cualquier simulacro de objetos para simular la DAO. Así pruebas de servicios también ¿Necesita una conexión de Oracle.

Soy consciente de que se burla y la base de datos en memoria son dos puntos separa, y me referiré a ellos tan pronto como sea posible. Sin embargo, mi primer paso es intente para eliminar la conexión de Oracle mediante una base de datos en memoria, y luego voy a utilizar mis conocimientos Mockito para mejorar las pruebas.

Tenga en cuenta que también quiero pruebas unitarias separadas de las pruebas de integración. Este último tendrá un acceso a la base de datos de Oracle, para ejecutar pruebas "reales", pero mi principal preocupación (y este es el propósito de esta pregunta) es que casi todas mis pruebas de unidad no se ejecutan de forma aislada en la actualidad.

¿Fue útil?

Solución

Usar una base de datos en memoria / Java para la prueba. Esto se asegurará de que las pruebas son más cerca del mundo real que si se intenta 'de distancia abstracto' en la base de datos de la prueba. Es probable que estas pruebas son también más fáciles de escribir y mantener. Por otro lado, lo que es probable que desea 'de distancia abstracto' en las pruebas es la interfaz de usuario, ya que las pruebas de interfaz de usuario suele ser difícil de automatizar.

La sintaxis de Oracle informados funciona bien con la base de datos de H2 (yo sólo probé), por lo que parece H2 es compatible con la sintaxis de Oracle mejor que HSQLDB. Exención de responsabilidad: yo soy uno de los autores de H2. Si algo no funciona, por favor, publicarlo en la lista de correo H2.

de todos modos debe tener las sentencias DDL para la base de datos en su sistema de control de versiones. Puede utilizar estos scripts para probar también. Posiblemente también es necesario para soportar múltiples versiones de esquema - en ese caso se podría escribir scripts de actualización de versión (alter table ...). Con una base de datos de Java puede probar esos también.

Por cierto, que no necesariamente tienen que utilizar el modo en memoria cuando se utiliza H2 o HSQLDB. Ambas bases de datos son rápidos, incluso si persisten los datos. Y son fáciles de instalar (sólo un archivo JAR) y necesitan mucha menos memoria que Oracle.

Otros consejos

Últimas HSQLDB sintaxis 2.0.1 soportes ORACLE para DUAL, ROWNUM, NEXTVAL y CURRVAL a través de un indicador de compatibilidad de sintaxis, sql.syntax_ora = verdadero. De la misma manera, la concatenación de una cadena con una cadena nula y las restricciones a NULL en restricciones UNIQUE se manejan con otras banderas. La mayoría de las funciones de Oracle como TO_CHAR, TO_DATE, etc. NVL ya están construidas en.

Por el momento, utilizar tipos de ORACLE simples, tales como número, puede utilizar una definición de tipo:

CREAR tipo de número como numérico

La siguiente instantánea permitirá número (N) y otros aspectos de compatibilidad de tipo de ORACLE cuando se establece el indicador.

http://hsqldb.org/support/

[Actualización:] La instantánea emitida el 4 oct traduce la mayoría de los tipos específicos de Oracle a tipos ANSI SQL. HSQLDB 2.0 también es compatible con el tipo ANSI SQL intervalo y fecha / timestamp aritmética de la misma manera como Oracle.

¿Cuáles son las pruebas unitarias para? Si ponen a prueba el buen funcionamiento de DDL y procedimientos almacenados entonces usted debe escribir las pruebas "más cerca" de Oracle:. Bien sin código Java o sin primavera y otras interfaces web agradable en absoluto centrado en la db

Si desea probar la lógica de la aplicación implementada en Java y primavera entonces puede usar la conexión objetos / base de datos simulada para hacer sus pruebas independiente de la base de datos.

Si desea probar el funcionamiento como un todo (lo que está en contra del desarrollo modular y el principio de la prueba), entonces puede virtualizar su base de datos y probar en esa instancia sin tener el riesgo de hacer algunas modificaciones irreversibles desagradables.

Mientras sus pruebas limpiar ellos mismos (como ya parece saber cómo configurar), no hay nada malo con la ejecución de pruebas en contra de una instancia de base de datos real. De hecho, es el enfoque que normalmente prefiero, porque se le probando algo tan cerca como sea posible de producción.

Las incompatibilidades parecer pequeño, pero en realidad terminan reprimiendo no mucho tiempo después. En un caso bueno, puede salirse con alguna traducción desagradable sql / extensa burla. En casos graves, las partes del sistema serán simplemente imposible de prueba, que creo que es un riesgo inaceptable para los sistemas críticos para el negocio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top