Comment faire pour simuler un DB pour les tests (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).

En passant, j'utilise un ORM partiellement, et mes premières requêtes SQL sont assez simple et ne devrait pas varier d'une plateforme à une autre.

InformationsquelleAutor Eyal Roth | 2009-05-30