2011-07-18 6 views
40

Estoy tratando de agregar casos de prueba para los servicios que acceden a una base de datos MySQL, y me gustaría recrear el esquema completo (y para algunos escenarios simplemente usar un archivo de volcado MySQL con los datos necesarios para cada caso de prueba). Estaba buscando y encontré algunos chicos que usaban SQLite/H2 y otros para hacer esto, pero estoy deambulando si hay alguna forma de ejecutar MySQL en la memoria, así que no tengo que preocuparme por nada específico del MySQL dialecto que podría estar usando en nuestros servicios.¿Hay alguna forma de ejecutar MySQL en memoria para los casos de prueba de JUnit?

Respuesta

0

prueba http://hsqldb.org/, no tengo experiencia con eso, pero escuché cosas buenas.

EDITAR Lo sentimos - Parece que le necesidad de eliminar cualquier sintaxis específica de MySQL ...

3

Ésta es una de las razones por las que el uso de extensiones SQL patentados por lo general no es una buena idea.

Lo que haría sería tratar de identificar los lugares donde utiliza SQL no estándar y refactorizar su código para mover estas piezas a servicios dedicados. Entonces puede simular esto cuando ejecute pruebas unitarias.

+2

Todavía hay casos en que algo podría salir mal (por ejemplo, algunas palabras son palabras clave en un DBMS, y otras no), y el uso de un DBMS diferente para las pruebas podría no ahuyentarlas. –

+0

@Nicolae obviamente, sí. Necesitaría pruebas de integración dedicadas para estos métodos –

1

Puede usar un esquema diferente para las pruebas JUnit. Si está utilizando Spring, sus extensiones JUnit permiten que cada prueba se ejecute en una transacción de solo lectura, por lo que no habrá datos persistentes en la base de datos después de las pruebas. Si necesita datos iniciales para las pruebas, ingrese los datos necesarios en el método marcado @Before que participa en la transacción.

1

Puede montar un ramdrive (usando ImDisk), copiar sus archivos de datos en él e iniciar servicios Mysql después de cambiar la configuración apropiada en my.cnf Las bases de datos de pruebas unitarias son generalmente pequeñas (y debe mantenerlas pequeñas para rápido prueba), normalmente pueden caber en un ramdrive.

También puede considerar el uso de transacciones en sus pruebas de primavera en lugar de reconstruir tablas en cada prueba.

Lo usamos para nuestro equipo de desarrollo y funcionó como un amuleto, ganamos un orden de magnitud en la velocidad.

20

Usamos MySQL y flyway para manejar la migración.

Para pruebas unitarias y pruebas simples de integración utilizamos H2 en la base de datos de memoria con el parámetro MODE = MySQL param. Mode = MySQL permite que el H2 db maneje la mayor parte del dialecto de MySQL.

Nuestra fuente de datos de prueba en la configuración de la primavera está configurado de esta manera:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" > 
     <property name="driverClassName" value="org.h2.Driver"/> 
     <property name="url" value="jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" /> 
    </bean> 

(Si usted no sabe la primavera - el XML se traduce en llamar nueva BasicDataSource y luego llamar setDriverClassName y setURL en la instancia creada)

a continuación, utilizamos ruta de vuelo en el origen de datos para crear el esquema y leer en como lo haríamos contra una base de datos MySQL normal:

<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="cleanOnValidationError" value="false" /> 
     <property name="initOnMigrate" value="true" /> 
     <property name="sqlMigrationSuffix" value=".ddl" /> 
    </bean> 

Usted también podría simplemente usar el bean dataSource en una jdbcTemplate y ejecutar algunos scripts SQL de esa manera o ejecutar un número de scripts MySQL usando la etiqueta <jdbc:initialize-database...>.

+5

Desafortunadamente, H2 no admite bastantes declaraciones, como 'CLAVE ÚNICA',' CREAR EVENTO' y 'INSERTAR IGNORAR'. – John29

+3

Pero no es Mysql y usted todavía es propenso a problemas de incompatibilidades –

+1

H2 tampoco admite funciones IF :( Causado por: org.h2.jdbc.JdbcSQLException: Función "IF" no encontrada; instrucción SQL: seleccione if (len <4, 'default', val) como val from (seleccione val, length (val) como len desde config donde scope = 'test' y keyname = 'defaultName') temp [90022-191] – Kunal

22

La manera más fácil de usar una base de datos en memoria que es totalmente compatible con MySQL y se puede usar en los casos de prueba JUnit es imho MariaDB4j. sólo tiene una dependencia Gradle (/ Maven) (http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22mariaDB4j%22) y unas pocas líneas de código para iniciar:

DB database = DB.newEmbeddedDB(3306); 
database.start(); 
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", ""); 

un guión startupt puede incluirse a través de

database.source("path/to/resource.sql"); 

Más información en GitHub readme: https://github.com/vorburger/MariaDB4j

Cuestiones relacionadas