85 votes

Comment simuler une base de données à tester (Java)?

Je suis à la programmation en Java et mes applications sont faites beaucoup de l'utilisation de la DB. Par conséquent, il est important pour moi d'être en mesure de tester ma DB utilisation facilement.
Ce DB tests sont tout au sujet? Pour moi, ils devraient l'approvisionnement de deux exigences simples:

  1. Vérifier la syntaxe SQL.
  2. Plus important encore, de vérifier que les données sont sélectionnées, mis à jour correctement inséré, selon une situation donnée.

Eh bien, il semble que tout ce que je besoin est un DB.
Mais en fait, je ne préfère pas, comme il y a peu de difficultés à l'aide d'un DB pour un test:

  • "Juste obtenir vous-même un test DB, comment dur peut-il être?" - Eh bien, dans mon lieu de travail, avoir un personnel de test DB est assez impossible. Vous devez utiliser un "public" de la DB, qui est accessible pour tout le monde.
  • "Ces tests sûr, c'est pas du rapide..." - DB tests ont tendance à être plus lent que d'habitude tests. C'est vraiment pas l'idéal pour se ralentir tests.
  • "Ce programme doit traiter tous les cas!" - Il devient un peu ennuyeux et même impossible de les essayer et de simuler tous les cas dans une DB. Pour chaque cas, une certaine quantité de requêtes insert/update devrait être fait, ce qui est ennuyeux et prend du temps.
  • "Attendez une seconde, comment savez-vous il y a 542 lignes dans cette table?" - L'un des grands principes de l'essai, est d'être en mesure de tester la fonctionnalité d'une manière différente de celle de votre test de code. Lors de l'utilisation de la base de données, il est généralement un moyen de faire quelque chose, donc le test est exactement la même que la base de code.

Donc, vous pouvez comprendre que je n'aime pas DBs quand il s'agit de tests (bien sûr, je vais avoir à obtenir dans un certain point, mais je préfère y aller plus tard sur mes tests, après j'ai trouvé la plupart des bugs en utilisant le reste de l'méthodes d'essai). Mais ce que je cherche?

Je suis à la recherche d'un moyen de simuler une DB, un simulacre DB, en utilisant le système de fichiers ou tout simplement de la mémoire virtuelle. J'ai pensé que peut-être il y a un outil Java/package qui permet simplement de construire (en utilisant le code de l'interface) d'une base de maquette par test, avec des tables et des lignes, avec SQL vérification, et avec un code d'interface pour le suivi de son état (plutôt qu'à l'aide de SQL).

Êtes-vous familier avec ce genre d'outil?


Edit: Merci pour les réponses! Même si j'ai été demander à un outil de, vous aussi m'a fourni des conseils concernant le problème :) Ça va me prendre un certain temps pour vérifier vos offres, donc je ne peux pas dire pour l'instant si vos réponses satisfaisaient pas.

De toute façon, voici une meilleure vue de ce que je suis à la recherche pour - Imagine une classe nommée DBMonitor, que l'une de ses caractéristiques est de trouver le nombre de lignes dans une table. Voici un imaginaire code de la façon dont je voudrais tester cette fonctionnalité en utilisant JUnit:

public class TestDBMonitor extends TestCase {

    @Override
    public void setUp() throws Exception {

       MockConnection connection = new MockConnection();

       this.tableName = "table1";
       MockTable table = new MockTable(tableName);

       String columnName = "column1";
       ColumnType columnType = ColumnType.NUMBER;
       int columnSize = 50;
       MockColumn column = new MockColumn(columnName, columnType, columnSize);
       table.addColumn(column);

       for (int i = 0; i < 20; i++) {
           HashMap<MockColumn, Object> fields = new HashMap<MockColumn, Object>();
           fields.put(column, i);
           table.addRow(fields);
       }

       this.connection = connection;
    }

    @Test
    public void testGatherStatistics() throws Exception {

       DBMonitor monitor = new DBMonitor(connection);
       monitor.gatherStatistics();
       assertEquals(((MockConnection) connection).getNumberOfRows(tableName),
                    monitor.getNumberOfRows(tableName));
    }

    String tableName;
    Connection connection;
}

J'espère que ce code est assez clair pour comprendre mon idée (excusez-moi pour les erreurs de syntaxe, j'ai été taper manuellement sans mes chers Eclipse :P).

Par ailleurs, j'ai utiliser l'ORM partiellement, et mes premières requêtes SQL sont assez simple et ne devrait pas varier d'une plateforme à une autre.

42voto

ykaganovich Points 8497

Java est livré avec Java DB .

Cela dit, je déconseille d'utiliser un type de base de données différent de celui que vous utilisez en production, sauf si vous passez par une couche ORM. Sinon, votre SQL pourrait ne pas être aussi multiplateforme que vous le pensez.

Consultez également DbUnit

11voto

Paul Keeble Points 577

Il y a beaucoup de points de vue sur la façon de tester l'intégration des points tels que la connexion de Base de données via SQL. Mon ensemble de règles qui a bien fonctionné pour moi, est comme suit:

1) Séparer la Base de données d'accéder à la logique et les fonctions générales de la logique métier et de le cacher derrière une interface. Raison: afin de tester la grande majorité de la logique du système, il est préférable d'utiliser un mannequin/stub en place de la base de données comme sa plus simple expression. Raison 2: Il est beaucoup plus rapide

2) Traiter les tests dans la base de données des tests d'intégration qui sont séparés du corps principal de tests unitaires et besoin pour exécuter un programme d'installation de la base de données Raison: la Vitesse et de la qualité des tests

3) Tous les développeurs ont besoin de leur propre base de données. Ils auront besoin d'un système automatisé de mise à jour de sa structure basée sur les modifications de leurs coéquipiers et de présenter des données. Voir les points 4 et 5.

4) Utiliser un outil comme http://www.liquibase.org pour gérer les mises à niveau dans vos bases de données de la structure. Raison: vous Donne de l'agilité dans la capacité de modifier la structure actuelle et aller de l'avant dans les versions

5) Utiliser un outil comme http://www.dbunit.org/ pour gérer les données. Configurer les fichiers de scénario (xml ou XLS) pour notamment des cas de test et des données de base et claires de ce qui est nécessaire à un cas de test. La raison: Beaucoup mieux qu'à la main de l'insertion et de suppression de données Raison 2: plus Facile pour les testeurs de comprendre comment ajuster les scénarios Raison 3: Son plus rapide pour exécuter cette

6) Vous avez besoin de tests fonctionnels, qui ont aussi des DBUnit tout comme le scénario de données, mais ce sont de loin les plus grands ensembles de données, et l'exécution de l'ensemble du système. Ceci termine l'étape de combiner les connaissances que a) L'unité exécution des tests et donc la logique est bonne b) Que les tests d'intégration à la base de données, exécuter et SQL est correcte résultant dans "et l'ensemble du système fonctionne comme un haut vers le bas de la pile"

Cette combinaison m'a bien servi jusqu'à présent pour atteindre une haute qualité des tests et des produits ainsi que le maintien de la vitesse de test de l'unité de développement et de l'agilité au changement.

10voto

Eddie Points 27755

J'ai utilisé Hypersonic à cet effet. Fondamentalement, c'est un fichier JAR (une base de données en mémoire Java pure) que vous pouvez exécuter dans sa propre JVM ou dans votre propre JVM et pendant son exécution, vous avez une base de données. Ensuite, vous l'arrêtez et votre base de données disparaît. Je l'ai utilisé - jusqu'à présent - comme une base de données purement en mémoire. Il est très simple de démarrer et d'arrêter via Ant lors de l'exécution de tests unitaires.

8voto

banjollity Points 2980

"Juste obtenir vous-même un test DB, comment dur peut-il être?" - Eh bien, dans mon lieu de travail, avoir un personnel de test DB est assez impossible. Vous devez utiliser un "public" de la DB, qui est accessible pour tout le monde.

On dirait que vous avez des problèmes culturels au travail, en fournissant une barrière à vous d'être en mesure de faire votre travail au maximum de vos capacités et de l'intérêt de votre produit. Vous voulez peut-être faire quelque chose à ce sujet.

D'autre part, si votre schéma de base de données est sous contrôle de version, alors vous pourriez toujours avoir un test de construire qui crée une base de données à partir du schéma, le remplit avec les données de test, exécute vos tests, rassemble les résultats, puis les gouttes de la base de données. Il avait seulement être dans l'existence pour la durée des tests. Il peut être une nouvelle base de données sur une installation existante si le matériel est un problème. Ceci est similaire à ce que nous faisons, où je travaille.

3voto

Blair Zajac Points 1838

Nous avons récemment passé à JavaDB ou Derby à mettre en œuvre. Derby 10.5.1.1 implémente désormais d'une représentation en mémoire de sorte qu'il court très vite, il n'a pas besoin d'aller sur le disque: Derby Dans La Mémoire De L'Apprêt

Nous la conception de notre application à exécuter sur Oracle, PostgreSQL et Derby, afin de ne pas aller trop loin en bas de la route sur une plate-forme, avant de découvrir qu'une base de données prend en charge une fonctionnalité que les autres n'ont pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X