Tuve algunas pruebas de JUnit ya escritas en mi proyecto que solían rellenar datos en el método de configuración. Ahora he agregado maven a mi proyecto y quiero ejecutar todos los casos de prueba de maven, es decir, usando la prueba mvn. El problema ahora es que mi base de datos no se borra después de que se haya ejecutado cada clase de prueba. Necesito borrar el HSQLDB después de que se hayan ejecutado los casos de prueba de cada clase.¿Cómo puedo borrar los datos de mi HSQLDB después de cada prueba?
Respuesta
Puede borrar los datos al soltar el esquema. El esquema predeterminado se llama PUBLIC. Si ejecuta el estado de SQL a continuación, borrará todos los datos y descartará todas las tablas.
DROP SCHEMA PÚBLICA CASCADE
Como alternativa, si necesita las definiciones de tabla y el esquema de objetos, puede crear un archivo: base de datos que contiene los objetos pero no datos y añada el siguiente listado en el fichero .properties. El uso de este tipo de base de datos para las pruebas, los cambios en los datos no se conservan
files_read_only = true
La última alternativa, disponible en HSQLDB 2.2.6 y más tarde le permite borrar todos los datos en un esquema mientras manteniendo las tablas. En el siguiente ejemplo, el esquema PÚBLICO se borra. pública
TRUNCATE esquema y COMMIT
Esta declaración se ha mejorado en las últimas versiones de HSQLDB. Ver http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement según la Declaración Truncar
Lo que hacemos en todas nuestras pruebas es que retrotraemos la transacción al final de la ejecución (después de que todas las aserciones se hayan completado). Usamos Spring y las pruebas predeterminadas no se comprometen al final. Esto garantiza que siempre regrese al estado inicial de la base de datos (después de la creación inicial de las tablas de entidades y la ejecución de import.sql).
Incluso si no usa Spring, probablemente pueda hacer rodar su propio bloque try {} finally {}
para deshacer una transacción iniciada para cada prueba.
Esta es una buena idea si sólo se está probando una sola transacción. Es posible que la prueba abarque múltiples transacciones. –
Otra solución aparece en "Eliminación de la base de datos entre las pruebas" http://www.objectpartners.com/2010/11/09/unit-testing-your-persistence-tier-code/
ese artículo tiene una gran cantidad de excelentes soluciones. gracias –
Siguiendo el consejo fredt 's, TRUNCATE ESQUEMA PÚBLICA REINICIO DE IDENTIDAD Y COMMIT NO COMPROBAR trabajaron para mi. Parte relevante del código en la prueba JUnit para DAO.
@After
public void tearDown() {
try {
clearDatabase();
} catch (Exception e) {
fail(e.getMessage());
}
}
public void clearDatabase() throws Exception {
DataSource ds = (DataSource) SpringApplicationContext.getBean("mydataSource");
Connection connection = null;
try {
connection = ds.getConnection();
try {
Statement stmt = connection.createStatement();
try {
stmt.execute("TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK");
connection.commit();
} finally {
stmt.close();
}
} catch (SQLException e) {
connection.rollback();
throw new Exception(e);
}
} catch (SQLException e) {
throw new Exception(e);
} finally {
if (connection != null) {
connection.close();
}
}
}
De acuerdo con la documentación en http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement
Si se especifica IDENTIDAD REINICIAR, todas las secuencias tabla de identidad y todos los objetos secuencia en el esquema se restablecen a sus valores iniciales
I tenía un script SQL simple que se ejecutó antes de cada prueba con la siguiente instrucción al comienzo:
TRUNCATE SCHEMA public AND COMMIT;
pero se han topado con problemas de bloqueo entre las pruebas y la adición de esta trabajado para mí como un encanto:
@After
public void after() throws Exception {
if (entityManager.getTransaction().isActive()) {
entityManager.getTransaction().rollback();
}
}
¿de dónde viene 'entityManager'? –
Como estaba usando JPA en mi proyecto junto con Spring para DI, el corrector de pruebas me lo inyectó. –
- 1. ¿Cómo puedo restaurar automáticamente todos los espías de sinon.js después de cada prueba en Jasmine?
- 2. ¿Hay alguna manera de conservar los datos HSQLDB?
- 3. ¿Cómo puedo borrar los datos antiguos de logcat?
- 4. Cómo reiniciar el navegador después de cada escenario de prueba
- 5. Cómo borrar mediante programación los datos de la aplicación
- 6. HSQLDB Manager?
- 7. Borrar todos los campos después de enviar
- 8. Borrar datos de ZedGraph
- 9. HSQLDB está comiendo toda mi memoria
- 10. Spring/Hibernate/Junit ejemplo de prueba DAO contra HSQLDB
- 11. ¿Cómo obtengo la base de datos de prueba Rails para reconstruir antes de cada prueba?
- 12. ¿Cómo borrar los datos de sesión de System.Windows.Forms.WebBrowser?
- 13. ¿Manera correcta de organizar los casos de prueba que involucran un archivo de datos para cada caso de prueba?
- 14. HSQLDB - que es el archivo de base de datos principal
- 15. ¿Cómo puedo transferir un dispositivo de prueba de base de datos al dispositivo desde mi aplicación de prueba de unidad?
- 16. Después de ejecutar un caso de prueba junit, ¿debería eliminar los datos de prueba relacionados con este caso de prueba?
- 17. ¿Cómo puedo identificar al host de Selenium Grid ejecutando mi prueba desde dentro de la prueba?
- 18. Cómo borrar texto después de un símbolo especificado en Vim
- 19. Limpiar datos después de una prueba de selenio
- 20. Cómo borrar la caché del navegador en mi prueba de Selenium
- 21. ¿Cómo puedo agregar mis datos de inicialización a mi base de datos de prueba usando rake db: seed?
- 22. ¿Cómo puedo probar las vistas de prueba y los atributos de autorización de mi aplicación asp.net mvc en nUnit?
- 23. JUnit + + Derby de primavera: caída db en memoria después de cada prueba
- 24. Usando: después de borrar elementos flotantes
- 25. ¿Cómo puedo iniciar y seguir ejecutando hsqldb en modo servidor desde mi aplicación web?
- 26. NSKeyedUnarchiver: ¿borrar datos decodificados?
- 27. ¿Cómo puedo vincular los datos de Telerik ComboBox a mi modelo de datos
- 28. factory_girl + rspec a deshacer los cambios después de cada ejemplo
- 29. mostrar datos después de cada 10 segundos en Android
- 30. Controlar cómo se generan los datos de prueba en QuickCheck
Esto eliminará todas las tablas en el esquema. Sin embargo, mi requisito es que necesito las tablas pero no hay datos en ellas. – Robin
Enfoque alternativo agregado. – fredt
# 3 funciona muy bien para mí. Por varias razones, no puedo deshacer entre los métodos de prueba, así que hice un método @@ After @@ Transactional que toma el administrador de la entidad y lo ejecuta. –