web-dev-qa-db-fra.com

Inspecter en mémoire hsqldb pendant le débogage

Nous utilisons hdsqldb en mémoire pour exécuter des tests junit qui fonctionnent sur une base de données. La base de données est configurée avant l'exécution de chaque test via une configuration à ressort. Tout fonctionne bien .. Maintenant, lorsqu'un test échoue, il peut être pratique de pouvoir inspecter les valeurs de la base de données in memory. Est-ce possible? Si oui comment? Notre url est:

jdbc.url = jdbc: hsqldb: mem: testdb; sql.enforce_strict_size = true

La base de données est détruite après chaque test. Mais lorsque le débogueur est en cours d’exécution, la base de données doit également être toujours active. J'ai essayé de me connecter à la base de données sqldb. Cela fonctionne, mais je ne vois aucune table ou donnée. Toute aide est grandement appréciée!

38
Albert

HSQL est en mémoire. Par conséquent, lorsque vous dites que vous vous connectez au gestionnaire de base de données SQLDB, vous ne vous connectez pas à une autre base de données située dans l’espace mémoire du gestionnaire de base de données SQLDB, et Test de l'unité. C'est pourquoi la base de données dans le gestionnaire de base de données SQLDB est vide.

Vous pouvez exécuter HSQL en tant que serveur en utilisant org.hsqldb.Server comme décrit ici

Bien que la classe org.hsqldb.Server soit généralement utilisée pour démarrer un processus séparé, vous pouvez l'instancier et le configurer dans votre test unitaire, ce qui devrait permettre à un processus distant de se connecter et d'interroger la base de données.

Sinon, vous devrez écrire une sorte de fonctionnalité de vidage appelée au besoin dans votre test unitaire.

En passant, l'utilisation de HSQL dans les tests unitaires ne fait que prouver que votre code fonctionne contre HSQL, ce qui est différent de la base de données réelle. Cela signifie que vous pouvez obtenir des faux positifs et vice versa. La même chose peut être obtenue avec une API mocking ou, mieux, enregistrez les tests de base de données pour des tests d'intégration corrects qui fonctionnent avec la base de données réelle.

17
Nick Holt

Dans votre test unitaire ou dans la méthode @Before/setUp(), vous pouvez ajouter la ligne suivante pour lancer le gestionnaire de base de données HSQL:


org.hsqldb.util.DatabaseManager.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:testdb", "--noexit"
});

ou pour la version améliorée de Swing


org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:testdb", "--noexit"
});

Le gestionnaire de base de données vous permet d'inspecter votre schéma et d'exécuter des requêtes SQL sur la base de données Live In-Memory pendant l'exécution de l'application.

Assurez-vous de définir un point beak ou de suspendre l'exécution d'une manière ou d'une autre si vous souhaitez vérifier l'état de votre base de données sur une ligne spécifique.

66
dimdm

Exécutez votre test unitaire sur un point d'arrêt, puis dans la perspective Débogage d'Eclipse, ouvrez la vue Affichage (Fenêtre, Afficher la vue, Afficher) et entrez 

    org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:testdb", "--noexit"
});

(selon le post de dimdm), mettez-le en surbrillance, cliquez avec le bouton droit de la souris et choisissez Exécuter.

 enter image description here

14
Gwaptiva

Vous pouvez également utiliser la classe DatabaseManagerSwing incluse dans [HSQLDB] [1] en lui transmettant une connexion ouverte, qui vous permet de voir l'état de la base de données dans la transaction dans laquelle se trouve la connexion.

DatabaseManagerSwing manager = new DatabaseManagerSwing();
manager.main();
manager.connect(connection);
manager.start();
0
mic.sca