Question

J'ai une application où beaucoup "unité" tests utilisent une vraie connexion à une base de données Oracle au cours de leur exécution.

Comme vous pouvez l'imaginer, ces tests prennent trop de temps à exécuter, car ils ont besoin d'initialiser certains contextes de printemps et de communiquer à l'instance Oracle. En plus de cela, nous devons gérer des mécanismes complexes, comme les transactions, afin de modifications de la base de données d'éviter après l'exécution du test (même si nous utilisons des cours du printemps comme usefull AbstractAnnotationAwareTransactionalTests).

Donc, mon idée est de remplacer progressivement cette instance de test Oracle par une base de données en mémoire. Je vais utiliser hsqldb ou peut-être mieux h2 .

Ma question est de savoir quelle est la meilleure approche pour le faire. Ma principale préoccupation est liée à la construction de la structure de base de données en mémoire et l'insertion de données de référence.

Bien sûr, je peux extraire la structure de base de données d'Oracle, en utilisant des outils tels que SQL Developer ou TOAD, puis modifier ces scripts pour les adapter à la langue hsqldb ou h2. Mais je ne pense pas que ce soit la meilleure approche.


En fait, je l'ai déjà fait ça sur un autre projet à l'aide hsqldb, mais je l'ai écrit manuellement tous les scripts pour créer des tables. Heureusement, je n'avais que quelques tables pour créer. Mon principal problème au cours de cette étape était de « traduire » les scripts Oracle utilisés pour créer des tables dans la langue de hsqldb.

Par exemple, une table créée dans Oracle en utilisant la commande SQL suivante:

CREATE TABLE FOOBAR (
    SOME_ID NUMBER,
    SOME_DATE DATE, -- Add primary key constraint
    SOME_STATUS NUMBER,
    SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);

besoin d'être "traduit" pour hsqldb à:

CREATE TABLE FOOBAR (
    SOME_ID NUMERIC,
    SOME_DATE TIMESTAMP PRIMARY KEY,
    SOME_STATUS NUMERIC,
    SOME_FLAG INTEGER DEFAULT 0 NOT NULL);

Dans mon projet actuel, il y a trop de tables pour le faire manuellement ...


Mes questions:

  • Quels sont les conseils que vous pouvez me donner pour y parvenir?
  • Est-ce h2 ou hsqldb fournissent des outils pour générer leurs scripts à partir d'une connexion Oracle?

Informations techniques

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


Modifier

Quelques informations concernant mes tests unitaires:

Dans l'application où je hsqldb, j'ai eu les tests suivants: - Certains tests unitaires « de base », qui n'a rien à voir avec DB. - Pour les essais de DAO, je hsqldb pour exécuter des manipulations de bases de données, telles que CRUD. - Ensuite, sur la couche de service, je Mockito pour se moquer de mes objets DAO, afin de se concentrer sur le test de service et non l'ensemble des applications (à savoir le service + dao + DB)

.

Dans ma demande actuelle, nous avons le pire scénario: Les tests de la couche DAO ont besoin d'une connexion Oracle à exécuter. La couche de services fait pas utiliser une maquette d'objets (encore) pour simuler le DAO. Ainsi, les tests de services aussi ont besoin d'une connexion Oracle.

Je suis conscient que se moque et base de données en mémoire sont deux Sépare points et je vais les aborder le plus tôt possible. Cependant, ma première étape consiste à essayer pour supprimer la connexion Oracle par une base de données en mémoire, puis je vais utiliser mes connaissances de Mockito pour améliorer les tests.

Notez que je veux aussi des tests unitaires séparés des tests d'intégration. Ce dernier aura besoin d'un accès à la base de données Oracle, pour exécuter des tests « réels », mais ma principale préoccupation (ce qui est le but de cette question) est que presque tous mes tests unitaires ne sont pas exécutés en vase clos aujourd'hui.

Était-ce utile?

La solution

Utilisez un en mémoire / base de données Java pour les tests. Cela permettra d'assurer les tests sont plus proches du monde réel que si vous essayez de «abstraire la base de données dans votre test. Probablement ces tests sont également plus faciles à écrire et à maintenir. D'autre part, ce que vous ne voulez probablement à « abstraire » dans vos tests est l'interface utilisateur, parce que les tests interface utilisateur est généralement difficile à automatiser.

La syntaxe Oracle posté fonctionne bien avec la base de données H2 (je viens de tester), donc il semble H2 supporte mieux que HSQLDB syntaxe Oracle. Disclaimer: Je suis l'un des auteurs de H2. Si quelque chose ne fonctionne pas, s'il vous plaît poster sur la liste de diffusion H2.

Vous devriez quand même avoir les instructions DDL pour la base de données dans votre système de contrôle de version. Vous pouvez utiliser ces scripts pour tester aussi bien. Peut-être vous devez également prendre en charge plusieurs versions de schéma - dans ce cas, vous pouvez écrire des scripts de mise à jour de version (alter table ...). Avec une base de données Java, vous pouvez tester ceux aussi bien.

Par ailleurs, vous ne doit pas nécessairement utiliser le mode en mémoire lors de l'utilisation H2 ou HSQLDB. Les deux bases de données sont rapides même si vous persistez les données. Et ils sont faciles à installer (juste un fichier jar) et ont besoin de beaucoup moins de mémoire que Oracle.

Autres conseils

Dernières HSQLDB 2.0.1 prend en charge la syntaxe ORACLE pour DUAL, ROWNUM, NEXTVAL et CURRVAL via un indicateur de compatibilité de syntaxe, sql.syntax_ora = true. De la même manière, concaténation d'une chaîne avec une chaîne NULL et les restrictions sur NULL dans UNIQUE sont traités avec d'autres drapeaux. La plupart des fonctions ORACLE telles que TO_CHAR, TO_DATE, etc. NVL sont déjà construits.

À l'heure actuelle, d'utiliser de simples types d'ORACLE tels que le numéro, vous pouvez utiliser une définition de type:

CREATE TYPE NUMÉRO NUMERIC

Le prochain instantané permettra (N) et d'autres aspects de la compatibilité de type ORACLE lorsque le drapeau est réglé.

Télécharger de http://hsqldb.org/support/

[Mise à jour:] Le cliché publié le 4 oct traduit la plupart des types spécifiques de Oracle à la norme ANSI SQL types. HSQLDB 2.0 prend également en charge le type ANSI SQL INTERVALLE et date / horodatage arithmétique de la même manière que Oracle.

Quels sont vos tests unitaires pour? S'ils testent le bon fonctionnement des DDLs et des procédures stockées, alors vous devriez écrire les tests « plus » à Oracle:. Soit sans code Java ou sans ressort et autres interfaces web agréable du tout en mettant l'accent sur la db

Si vous voulez tester la logique applicative en Java et Spring, vous pouvez utiliser la connexion des objets mock / base de données pour faire vos tests indépendants de la base de données.

Si vous voulez tester le travail dans son ensemble (ce qui est contre le développement modulaire et principe test), vous pouvez virtualiser votre base de données et un test sur cette instance sans avoir le risque de faire quelques modifications irréversibles désagréables.

Tant que vos tests nettoyer après eux-mêmes (comme vous semblez déjà savoir comment mettre en place), il n'y a rien de mal avec de l'exécution des tests contre une instance réelle de la base de données. En fait, il est l'approche que je préfère habituellement, parce que vous allez tester quelque chose d'aussi proche de la production que possible.

Les incompatibilités semblent petites, mais finissent vraiment mordre arrière pas si longtemps après. Dans un bon cas, vous pouvez vous en sortir avec une traduction sql méchant / grande moquerie. Dans les cas graves, les parties du système seront tout simplement impossible de test, qui je pense est un risque inacceptable pour les systèmes critiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top