Tengo una aplicación en la que muchos «unidad» pruebas de uso real de una conexión a una base de datos de Oracle durante su ejecución.

Como se puede imaginar, estas pruebas se toman demasiado tiempo para ser ejecutado, ya que necesitan para inicializar algunos Primavera contextos, y a comunicar a la instancia de Oracle. Además de eso, tenemos que gestionar mecanismos complejos, tales como las transacciones, con el fin de evitar modificaciones de base de datos después de la ejecución de las pruebas (incluso si utilizamos útil clases a partir de la Primavera como AbstractAnnotationAwareTransactionalTests).

Así que mi idea es reemplazar progresivamente esta prueba de Oracle instancia de 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 es la relativa a la construcción de la base de datos en memoria de la estructura y de la inserción de los datos de referencia.

De curso, que se puede extraer de la estructura de base de datos de Oracle, el uso de algunas herramientas como SQL Developer o TOAD y, a continuación, la modificación de estas secuencias de comandos para adaptarlas a la hsqldb o h2 idioma. Pero no creo que es el mejor enfoque.


De hecho, yo ya lo hice en otro proyecto con hsqldb, pero he escrito manualmente todas las secuencias de comandos para crear tablas. Afortunadamente, sólo había unas tablas para crear. Mi problema principal durante este paso fue para «traducir» el Oráculo de los scripts utilizados para crear las tablas en la hsqldb idioma.

Por ejemplo, crea una tabla en Oracle con 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);

debía ser «traducido» por 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 mesas para hacerlo manualmente…


Así que mis preguntas:

  • ¿Cuáles son los consejos que me puedan dar para lograrlo?
  • Hace h2 o hsqldb ofrecer algunas herramientas para generar sus guiones a partir de una conexión de Oracle?

Información técnica

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


Editar

Alguna información con respecto a mi unidad de pruebas:

En la aplicación donde solía hsqldb, tenía las siguientes pruebas:
– Algunos de los «básicos» de la unidad de pruebas, que no tienen nada que ver con DB.
– Para DAO pruebas, he utilizado hsqldb para ejecutar la base de datos de manipulaciones, como la BASURA.
– A continuación, en la capa de servicio, he utilizado Mockito para burlarse de mis objetos DAO, a fin de centrarse en el servicio de prueba y no la totalidad de las aplicaciones (es decir, servicio + dao + DB).

En mi aplicación actual, tenemos el peor escenario: La capa DAO pruebas de la necesidad de una conexión a Oracle para que se ejecuten. La capa de servicios no no uso (aún) ningún simulacro de objetos para simular el DAO. Para los servicios de pruebas de también necesita una conexión a Oracle.

Soy consciente de que la burla y la base de datos en memoria se separa dos puntos, y voy a tratar tan pronto como sea posible. Sin embargo, mi primer paso es intentar para quitar la conexión a Oracle una base de datos en memoria y, a continuación, voy a utilizar mi Mockito conocimientos para mejorar las pruebas.

Tenga en cuenta que también quiero separar de unidad pruebas de integración pruebas. El último se necesita un acceso a la base de datos de Oracle, para ejecutar «real» de las pruebas, pero mi principal preocupación (y este es el propósito de esta pregunta) es que casi todos los de mi unidad de pruebas no se ejecuta en el aislamiento de hoy.

4 Comentarios

  1. 19

    El uso de una memoria /Java base de datos para la prueba. Esto asegurará que las pruebas están más cerca del mundo real que si intenta ‘resumen de distancia de la base de datos en la prueba. Probablemente estas pruebas también son más fáciles de escribir y mantener. Por otro lado, probablemente lo que quiero ‘abstracto’ en sus pruebas es la interfaz de usuario, porque la prueba de interfaz de usuario es generalmente difícil de automatizar.

    La sintaxis de Oracle publicado funciona bien con la base de datos H2 (acabo de probar, por lo que parece H2 admite la sintaxis de Oracle mejor que HSQLDB. Descargo de responsabilidad: yo soy uno de los autores de H2. Si algo no funciona, por favor, publicarlo en la H2 de la lista de correo.

    Debe de todos modos tiene las instrucciones DDL para la base de datos en su sistema de control de versiones. Usted puede utilizar las secuencias de comandos para probar así. Posiblemente usted también necesita el apoyo de múltiples versiones de esquema – en ese caso, usted podría escribir actualización de la versión de secuencias de comandos (alter table…). Con una base de datos con Java puedes probar también.

    Por cierto, no es necesario el uso de la memoria cuando se utiliza el modo de 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 con menos cantidad de memoria de Oracle.

    • Dado el código DAO parece bien junto a Oracle, y el DAO no puede ser abstracta, ésta parece la mejor acercamiento-aunque esperemos que el código DAO no depende de ningún Oracle peculiaridades. El mejor resumen a cabo los DAOs lo antes posible…
  2. 4

    Última HSQLDB 2.0.1 es compatible con ORACLE sintaxis para la DOBLE, ROWNUM, NEXTVAL y CURRVAL a través de una sintaxis indicador de compatibilidad, sql.syntax_ora=true. De la misma manera, la concatenación de una cadena con una cadena NULA y restricciones en NULL en las ÚNICAS limitaciones son manejados con otras banderas. La mayoría de las funciones de ORACLE, tales como TO_CHAR, TO_DATE, NVL etc. ya están integrados.

    Por el momento, a simple uso de ORACLE, tales como el NÚMERO, puede utilizar una definición de tipo:

    CREAR EL TIPO DE NÚMERO COMO VALOR NUMÉRICO

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

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

    [Actualización]: El instantáneas emitido en Octubre 4 se traduce la mayoría de Oracle tipos específicos de ANSI SQL tipos. HSQLDB 2.0 también soporta el ANSI SQL tipo de INTERVALO de la fecha y la marca de tiempo de la aritmética de la misma manera como Oracle.

  3. 2

    ¿Cuáles son su unidad de pruebas?
    Si se prueba el correcto funcionamiento de Ddl y procedimientos almacenados, a continuación, usted debe escribir las pruebas «más cerca» de Oracle: sin código Java o sin Resorte y otras bonitas interfaces web en todos centrados en la db.

    Si quieres poner a prueba la lógica de la aplicación implementada en Java y Spring, a continuación, puede utilizar objetos ficticios/conexión de base de datos para hacer las pruebas independientes de la base de datos.

    Si quieres probar el trabajo como un todo (lo que está en contra de la modulares de desarrollo y prueba de principio), entonces usted puede virtualizar su base de datos de prueba y en esa instancia sin tener el riesgo de hacer un poco desagradable irreversible modificaciones.

    • He editado mi pregunta con el fin de ser más precisos acerca de por qué quiero usar una memoria db.
  4. 1

    Mientras sus pruebas de limpiar después de sí mismos (como ya se parecen saber cómo configurar), no hay nada malo con la ejecución de pruebas en contra de una real instancia de base de datos. De hecho, es el método por lo general prefieren, porque vas a estar probando algo tan cercano a la producción como sea posible.

    Las incompatibilidades parecer pequeño, pero en realidad termina mordiendo de nuevo no mucho tiempo después. En un buen caso, usted puede conseguir lejos con un poco desagradable sql traducción /amplia burla. En casos graves, las partes del sistema será imposible prueba, que creo que es un riesgo inaceptable para los negocios-sistemas críticos.

    • «no Hay nada de malo con la ejecución de pruebas en contra de un verdadero DB«. No estoy de acuerdo con eso. El uso de un real DB para unidad de pruebas no es una buena idea, por lo menos por 2 razones: 1. su prueba es dependiente de la bd, y no sólo porque su base de datos es hacia abajo. 2. Crear una conexión a un real DB es más caro, y cuando usted está hablando de cientos de pruebas, su ejecución será un problema. Especialmente en un TDD manera.
    • Pero, por supuesto, tener pruebas de que el acceso real DB también es una buena idea, pero no estamos tratando con unidad de pruebas, pero más de integración de pruebas. Y este no era mi punto aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here