usuario una puedo por developer datos crear consola conexion conectarse conectar compartir como 11g java unit-testing hsqldb h2 in-memory-database

java - puedo - Crear una estructura de base de datos en memoria desde una instancia de Oracle



crear usuario en oracle (4)

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

Como se puede imaginar, estas pruebas toman demasiado tiempo para ejecutarse, ya que necesitan inicializar algunos contextos de Spring y comunicarse con la instancia de Oracle. Además de eso, tenemos que gestionar mecanismos complejos, como transacciones, para evitar modificaciones en la base de datos después de la ejecución de la prueba (incluso si usamos clases útiles de Spring como AbstractAnnotationAwareTransactionalTests ).

Entonces mi idea es reemplazar progresivamente esta instancia de prueba de Oracle por una base de datos en memoria. 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 la base de datos en memoria y la inserción de datos de referencia.

Por supuesto, puedo extraer la estructura de la base de datos de Oracle, usando algunas herramientas como SQL Developer o TOAD , y luego modificar estas secuencias de comandos para adaptarlas al lenguaje hsqldb o h2 . Pero no creo que ese sea el mejor enfoque.

De hecho, ya hice eso en otro proyecto usando hsqldb , pero escribí manualmente todos los scripts para crear tablas. Afortunadamente, tenía pocas tablas para crear. Mi principal problema durante este paso fue "traducir" los scripts de Oracle utilizados para crear tablas en el lenguaje 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 "traducido" 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 para hacerlo manualmente ...

Entonces mis preguntas:

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

Información técnica

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

Editar

Alguna información con respecto a mis pruebas unitarias:

En la aplicación donde utilicé hsqldb , tuve las siguientes pruebas: - Algunas pruebas de unidades "básicas", que no tienen nada que ver con DB. - Para las pruebas DAO, utilicé hsqldb para ejecutar manipulaciones de bases de datos, como CRUD. - Luego, en la capa de servicio, utilicé Mockito para burlar mis objetos DAO, con el fin de centrarme en la prueba de servicio y no en todas las aplicaciones (es decir, servicio + dao + DB).

En mi aplicación actual, tenemos el peor escenario: las pruebas de capa DAO necesitan una conexión Oracle para ejecutarse. La capa de servicios no usa (todavía) ningún objeto simulado para simular el DAO. Entonces, las pruebas de servicios también necesitan una conexión Oracle.

Soy consciente de que los simulacros y la base de datos en memoria son dos puntos separados, y los abordaré lo antes posible. Sin embargo, mi primer paso es intentar eliminar la conexión de Oracle mediante una base de datos en memoria, y luego Mockito mis conocimientos de Mockito para mejorar las pruebas.

Tenga en cuenta que también quiero separar las pruebas unitarias de las pruebas de integración. Este último necesitará un acceso a la base de datos 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 unitarias no se ejecutan de forma aislada hoy.


¿Para cuáles son sus pruebas de unidad? Si prueban el correcto funcionamiento de los DDL y los procedimientos almacenados, entonces debe escribir las pruebas "más cerca" de Oracle: ya sea sin código Java o sin Spring y otras interfaces web agradables centradas en el db.

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

Si desea probar el funcionamiento en conjunto (lo que está en contra del principio de desarrollo y prueba modular), entonces puede virtualizar su base de datos y probarla en esa instancia sin correr el riesgo de realizar algunas modificaciones desagradables e irreversibles.


La última HSQLDB 2.0.1 admite la sintaxis de ORACLE para DUAL, ROWNUM, NEXTVAL y CURRVAL a través de una bandera de compatibilidad de sintaxis, sql.syntax_ora = true. De la misma manera, la concatenación de una cadena con una cadena NULL y las restricciones sobre NULL en las restricciones ÚNICAS se manejan con otras banderas. La mayoría de las funciones de ORACLE, como TO_CHAR, TO_DATE, NVL, etc. ya están integradas.

Por el momento, para usar tipos ORACLE simples como NUMBER, puede usar una definición de tipo:

CREAR NÚMERO DE TIPO COMO NUMÉRICO

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

Descargar de http://hsqldb.org/support/

[Actualización:] La instantánea emitida el 4 de octubre traduce la mayoría de los tipos específicos de Oracle a tipos ANSI SQL. HSQLDB 2.0 también admite el tipo de INTERVALO ANSI SQL y la aritmética de fecha y hora de la misma manera que Oracle.


Siempre que sus pruebas se solucionen por sí solas (ya que usted ya sabe cómo configurarlas), no hay nada de malo en ejecutar pruebas contra una instancia de base de datos real. De hecho, es el enfoque que prefiero, porque probarás algo lo más cercano posible a la producción.

Las incompatibilidades parecen pequeñas, pero realmente terminan mordiendo no mucho después. En un buen caso, puede salirse con la suya con una desagradable traducción sql / burla extensa. En los casos malos, partes del sistema serán simplemente imposibles de probar, lo que creo que es un riesgo inaceptable para los sistemas críticos para el negocio.


Use una base de datos en memoria / Java para probar. Esto asegurará que las pruebas estén más cerca del mundo real que si intentas ''abstraer'' la base de datos en tu prueba. Probablemente, tales pruebas también sean más fáciles de escribir y mantener. Por otro lado, lo que probablemente desee ''abstraer'' en sus pruebas es la IU, porque las pruebas de IU suelen ser difíciles de automatizar.

La sintaxis de Oracle que publicó funciona bien con la base de datos H2 (la acabo de probar), por lo que parece que H2 admite la sintaxis de Oracle mejor que HSQLDB. Descargo de responsabilidad: soy uno de los autores de H2. Si algo no funciona, publíquelo en la lista de correo H2.

De todos modos, debe tener las declaraciones DDL para la base de datos en su sistema de control de versiones. Puede usar esos scripts para probarlos también. Posiblemente también necesite admitir múltiples versiones de esquema; en ese caso, podría escribir scripts de actualización de versión (alter table ...). Con una base de datos Java también puedes probarlos.

Por cierto, no necesariamente necesita usar el modo en memoria cuando usa H2 o HSQLDB. Ambas bases de datos son rápidas, incluso si persisten los datos. Y son fáciles de instalar (solo un archivo jar) y necesitan mucha menos memoria que Oracle.