135 votes

Embarquer MongoDB lors de l'exécution des tests d'intégration

Ma question est une variante de celui-ci .

Étant donné que mon projet d'application Web Java nécessite de nombreux filtres et requêtes en lecture et des interfaces avec des outils tels que GridFS, j'ai du mal à trouver une manière judicieuse d'utiliser MongoDB comme le suggère la solution ci-dessus.

J'envisage donc d'exécuter une instance intégrée de MongoDB parallèlement à mes tests d'intégration. J'aimerais qu'elle démarrer automatiquement (soit pour chaque test, soit pour la suite entière), purger la base de données pour chaque test, et fermer à la fin. Ces tests pourraient être exécutés sur des machines de développement ainsi que sur le serveur CI, donc ma solution devra également être portable .

Quelqu'un ayant plus de connaissances sur MongoDB peut-il m'aider à me faire une idée de la faisabilité de cette approche, et/ou peut-être me suggérer des lectures qui pourraient m'aider à démarrer ?

Je suis également ouvert aux autres suggestions que les gens pourraient avoir sur la façon dont je pourrais aborder ce problème...

0 votes

Si vous utilisez maven, vous pouvez utiliser le nôtre mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin

0 votes

Vous pouvez également consulter ce projet qui simule un MongoDB dans la mémoire de la JVM. github.com/thiloplanz/jmockmongo Mais il est toujours en cours de développement.

0 votes

Pas [seulement pour] les tests unitaires, mais lisez cet article de blog si vous souhaitez exécuter MongoDB (même un cluster) en tant que déploiement en mémoire si vous utilisez Linux. edgystuff.tumblr.com/post/49304254688 Ce serait formidable de l'avoir prêt à l'emploi comme RavenDB.

103voto

rozky Points 1385

J'ai trouvé MongoDB intégré qui semble très prometteuse et qui fait ce que vous avez demandé.

Prend actuellement en charge les versions de MongoDB : 1.6.5 a 3.1.6 à condition que les binaires soient toujours disponibles sur le miroir configuré.

Voici un petit exemple d'utilisation, que je viens d'essayer et qui fonctionne parfaitement :

public class EmbeddedMongoTest {
    private static final String DATABASE_NAME = "embedded";

    private MongodExecutable mongodExe;
    private MongodProcess mongod;
    private Mongo mongo;

    @Before
    public void beforeEach() throws Exception {
        MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance();
        mongodExe = runtime.prepare(new MongodConfig(Version.V2_3_0, 12345, Network.localhostIsIPv6()));
        mongod = mongodExe.start();
        mongo = new Mongo("localhost", 12345);
    }

    @After
    public void afterEach() throws Exception {
        if (this.mongod != null) {
            this.mongod.stop();
            this.mongodExe.stop();
        }
    }

    @Test
    public void shouldCreateNewObjectInEmbeddedMongoDb() {
        // given
        DB db = mongo.getDB(DATABASE_NAME);
        DBCollection col = db.createCollection("testCollection", new BasicDBObject());

        // when
        col.save(new BasicDBObject("testDoc", new Date()));

        // then
        assertThat(col.getCount(), Matchers.is(1L));
    }
}

1 votes

Je viens d'utiliser cette bibliothèque et elle a parfaitement fonctionné en testant JUnit une API Mongo sur un Mac. Recommandé.

1 votes

+1 excellente trouvaille ! Quand j'ai commencé à utiliser mongodb il y a un an, le fait de ne pas avoir de moyen programmatique pour tester contre une base de données était l'un des inconvénients. Nous avons contourné cela en ayant une instance de test sur chaque environnement, configurée par un fichier de propriétés Java, mais bien sûr, il fallait que mongo soit installé sur chaque environnement. On dirait que cela va résoudre tout cela.

0 votes

Joli ! J'ai supprimé ma réponse puisqu'elle n'est plus exacte. Quelqu'un sait à quel point c'est mature ? Je peux imaginer que simuler MongoDB à un niveau très bas serait assez compliqué et à en juger par la source, cela semble assez haut niveau.

18voto

zlob Points 111

Il y a le produit Foursquare Fongo . Fongo est une implémentation java en mémoire de mongo. Il intercepte les appels au pilote standard mongo-java pour les recherches, les mises à jour, les insertions, les suppressions et autres méthodes. L'utilisation principale est pour les tests unitaires légers où vous ne voulez pas faire tourner un processus mongo.

1 votes

Fongo intercepte-t-il les appels vers le réseau, par exemple vers localhost:27017, afin de servir de faux serveur pour permettre les tests d'intégration sans modification du code ?

0 votes

mongo-java-server est une implémentation de faux serveur qui peut être utilisée pour les tests d'intégration sans modification du code.

8voto

joelittlejohn Points 3799

Si vous utilisez Maven, vous serez peut-être intéressé par un plugin que j'ai créé et qui englobe l'outil de gestion de l'environnement de travail de Maven. API "mongo embarqué" de flapdoodle.de :

embedmongo-maven-plugin

Il fournit un start que vous pouvez utiliser pour démarrer n'importe quelle version de MongoDB que vous voulez (par exemple pendant pre-integration-test ), et un stop qui arrêtera MongoDB (par exemple lors de post-integration-test ).

Le véritable avantage de l'utilisation de ce plugin par rapport aux autres est qu'il n'est pas nécessaire d'installer MongoDB au préalable. Les binaires MongoDB sont téléchargés et stockés dans le dossier ~/.embedmongo pour les constructions futures.

0 votes

Et voici la version Clojure pour Leiningen : github.com/joelittlejohn/lein-embongo

7voto

Aurélien Thieriot Points 1882

Si vous utilisez sbt et specs2, j'ai écrit le même type de wrapper pour embedmongo.

https://github.com/athieriot/specs2-embedmongo

2voto

markdsievers Points 1845

Si vous utilisez maven, vous pouvez utiliser le nôtre http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin

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