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
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 ...
É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.
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.
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.
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...>
.
Desafortunadamente, H2 no admite bastantes declaraciones, como 'CLAVE ÚNICA',' CREAR EVENTO' y 'INSERTAR IGNORAR'. – John29
Pero no es Mysql y usted todavía es propenso a problemas de incompatibilidades –
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
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
- 1. ¿Cómo ejecutar todos los casos de prueba JUnit de NetBeans?
- 2. ¿hay alguna anotación condicional en JUnit para marcar algunos casos de prueba para omitir?
- 3. ¿JUnit ejecuta casos de prueba secuencialmente?
- 4. Cómo evitar la herencia en los casos de prueba JUnit?
- 5. Cómo aplicar un JUnit @Rule para todos los casos de prueba en un conjunto
- 6. generador de caso de prueba junit
- 7. Prueba JUnit para System.out.println()
- 8. Marco de prueba de Google - Dependencia entre casos de prueba
- 9. ¿Cómo hacer que los casos de prueba JUnit se ejecuten en orden secuencial?
- 10. ¿Cómo hacer que los casos de prueba de JUnit se ejecuten en paralelo?
- 11. Forma fácil de obtener un archivo de prueba en JUnit
- 12. Cómo ejecutar casos de prueba explícitos de Nunit
- 13. ¿Maven Surefire ejecuta casos de prueba secuencialmente de forma predeterminada?
- 14. ¿Hay alguna manera de hacer que Eclipse ejecute una prueba JUnit varias veces hasta que falle?
- 15. Cómo ejecutar los casos de prueba NUnit desde el símbolo del sistema
- 16. Agregando múltiples casos de prueba de múltiples módulos para ejecutar en PyDev TestRunner
- 17. ¿Hay alguna forma de ejecutar las pruebas unitarias de forma secuencial con MSTests?
- 18. ¿Por qué JUnit ejecuta casos de prueba para teoría solo hasta la primera falla?
- 19. Casos de prueba para entradas de cadena
- 20. Ejecutar todas las pruebas en Junit 4
- 21. ¿hay alguna forma de ejecutar 2 objetos NSAnimation simultáneamente?
- 22. Después de ejecutar un caso de prueba junit, ¿debería eliminar los datos de prueba relacionados con este caso de prueba?
- 23. ¿Hay alguna forma de utilizar datos que ya están en la memoria para realizar pruebas unitarias?
- 24. método de prueba junit para getters & setters
- 25. ¿Hay algún buen software de código abierto para escribir casos de prueba?
- 26. ¿Hay alguna forma de engañar al compilador .net JIT para ejecutar otro método?
- 27. JUnit Reports - Descripciones de los métodos de prueba
- 28. ¿Hay alguna forma en php para hacer que SWITCH opreator compare casos estrictamente?
- 29. ¿Alguna forma de obtener una referencia para los elementos de la barra de acciones para las pruebas de Junit en android?
- 30. Mejor o personalizado JUnit prueba de filtrado
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. –
@Nicolae obviamente, sí. Necesitaría pruebas de integración dedicadas para estos métodos –