2013-04-10 2 views
15

Ich muss NetsTests für Python-Code mit einem MongoDB-Speicher implementieren. Gibt es eine Python-Bibliothek, die mir erlaubt, einen Mock-In-Memory-MongoDB-Server zu initialisieren?Verwenden Sie Pseudo-MongoDB-Server für Unit-Test

Ich verwende kontinuierliche Integration. Daher möchte ich, dass meine Tests unabhängig von einem laufenden MongoDB-Server sind. Gibt es eine Möglichkeit, mongoDM Server im Speicher nachzuahmen, um den Code unabhängig von der Verbindung mit einem Mongo-Server zu testen?

Vielen Dank im Voraus!

Antwort

11

Sie könnten versuchen: https://github.com/vmalloc/mongomock, die eine kleine Bibliothek für Spott Pymongo Sammlung Objekte zu Testzwecken sein soll.

Allerdings bin ich mir nicht sicher, dass die Kosten für nur mongodb laufen würde improvitive im Vergleich zu der Gewährleistung einige spöttische Bibliothek Feature komplett ist.

+7

wäre es wirklich schön, ein Beispiel zu bekommen, wie Mongoengine und Mongomock gut zusammenspielen können. – badgley

+0

Stellen Sie sicher, dass Sie eine gute Kompatibilität mit Versionen nach 3.0 haben. Ich habe es versäumt, meine Sammlungen mit all den Gerüsten zu verspotten, die ich gleich nach dem Upgrade von Server und Treiber (pymongo) ausprobiert habe. –

4

Ich weiß nicht über Python, aber ich hatte eine ähnliche Sorge mit C#. Ich entschied mich, eine echte Instanz von Mongo auf meiner Arbeitsstation auszuführen, die auf ein leeres Verzeichnis zeigte. Es ist nicht großartig, weil der Code nicht isoliert ist, aber es ist schnell und einfach.

Nur die Datenzugriffsebene ruft während des Tests tatsächlich Mongo auf. Der Rest kann sich auf die Mocks der Datenzugriffsschicht verlassen. Ich hatte nicht das Gefühl, Mongo zu fälschen, war die Mühe wert, wenn ich wirklich überprüfen will, ob die Interaktion mit Mongo korrekt ist.

+4

+1 Ich verstehe nicht den Wunsch, alles isoliert zu testen. Das Beste, auf das Sie hoffen können, ist, dass es sich wie das Original verhält. Testen Sie das echte Ding. Konfigurieren Sie eine dedizierte Testdatenbank. – Leopd

+3

Das ist ein stichhaltiger Punkt, aber ein Grund, isoliert zu testen, besteht darin, dass Sie es anderen Personen leichter geben können, damit sie auch in ihrer Umgebung testen können. Das wird lästiger (obwohl es sich in diesem Fall wahrscheinlich lohnt), wenn sie auch einen externen Prozess einrichten müssen. –

+0

Und um hinzuzufügen, wenn die Tests in der Pipeline ausgeführt werden sollen, können Sie nicht sicher sein, dass Sie die DB installiert haben würden. – sri85

1

Sie können Ming verwenden, die einen in-memory mongo db pymongo Verbindungsersatz hat.

import ming 
mg = ming.create_datastore('mim://') 
mg.conn # is the connection 
mg.db # is a db with no name 
mg.conn.somedb.somecol 
# >> mim.Collection(mim.Database(somedb), somecol) 
col = mg.conn.somedb.somecol 
col.insert({'a': 1}) 
# >> ObjectId('5216ac3fe0323a1218f4e9aa') 
col.find().count() 
# >> 1 
+0

Das gleiche wie oben. Ich habe versucht mit MongoDB => 3.0 zu arbeiten und bin meistens gescheitert, weil ming nicht dafür gedacht ist. Es wird immer unzuverlässiger, solange die Komplexität zunimmt. –

+0

@ HéctorValverdePareja was versuchst du zu tun, das scheitert? Wie Sie aus dem Snippet sehen können, fügen Sie ein und finden Sie die Arbeit in Ordnung. – Pykler

+0

Entschuldigung, wenn ich 'oben' sagte, meinte ich den Kommentar, den ich in der genehmigten Antwort hinzugefügt habe. Es geht um Kompatibilität. Ming hat die neueste Version von Pymongo (später 3.0) nicht unterstützt, zum Beispiel die Funktion "insert_one()" anstelle von "insert()" wird von Ming nicht unterstützt (oder war nicht vor 2 - 3 Monaten, als ich damit spielte) es. –