2013-04-10 9 views
15

Muszę zaimplementować testy nosa dla kodu Pythona przy użyciu sklepu MongoDB. Czy istnieje biblioteka Pythona, która pozwala mi na zainicjowanie fałszywego serwera MongoDB w pamięci?Użyj makiety serwera MongoDB do testu jednostkowego

Używam ciągłej integracji. Tak więc chcę, aby moje testy były niezależne od jakiegokolwiek działającego serwera MongoDB. Czy istnieje sposób na sfałszowanie serwera MongoDM w pamięci w celu przetestowania kodu niezależnie od połączenia z serwerem Mongo?

Z góry dziękuję!

Odpowiedz

11

Możesz spróbować: https://github.com/vmalloc/mongomock, która ma być małą biblioteką do kpienia z obiektów kolekcji pymongo do celów testowych.

Jednak nie jestem pewien, czy koszt prowadzenia monondbu byłby wygórowany w porównaniu do zapewnienia, że ​​jakaś kpina z biblioteki jest kompletna.

+7

Byłoby naprawdę miło dostać przykład, w jaki sposób mongoengine i mongomock mogą ładnie grać razem. – badgley

+0

Upewnij się, że masz dobrą kompatybilność z wersjami później niż 3.0. Nie udało mi się wyśmiewać moich kolekcji za pomocą wszystkich frameworków, które wypróbowałem, zaraz po uaktualnieniu serwera i sterownika (pymongo). –

4

Nie wiem o Pythonie, ale miałem podobne obawy z C#. Postanowiłem po prostu uruchomić prawdziwą instancję Mongo na mojej stacji roboczej wskazaną na pusty katalog. Nie jest to wspaniałe, ponieważ kod nie jest izolowany, ale jest szybki i łatwy.

Tylko warstwa dostępu do danych rzeczywiście wywołuje Mongo podczas testu. Reszta może polegać na makietach warstwy dostępu do danych. Nie miałem ochoty udawać, że Mongo było warte wysiłku, kiedy naprawdę chcę sprawdzić, czy interakcja z Mongo jest poprawna.

+4

+1 Nie rozumiem chęci testowania wszystkiego w odosobnieniu. Najlepsze, na co możesz liczyć, to że zachowuje się jak prawdziwy. Po prostu przetestuj prawdziwą. Skonfiguruj dedykowaną bazę testową. – Leopd

+3

To jest ważna kwestia, ale jednym z powodów testowania w izolacji jest to, że łatwiej jest przekazać ją innym osobom, aby mogły również testować w swoim środowisku. To staje się coraz bardziej uciążliwe (choć pewnie warto w tym przypadku), jeśli muszą oni także skonfigurować zewnętrzny proces. –

+0

I dodać do tego, jeśli testy mają być uruchomione w potoku, nie można mieć pewności, że zainstalowałoby się DB. – sri85

1

Można użyć Ming z zamiennikiem połączenia mongo db pymongo w pamięci.

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

To samo co powyżej. Próbowałem ming z MongoDB => 3.0 i nie powiodło się większość razy, ponieważ ming nie jest przeznaczony do tego. Jest to coraz bardziej niewiarygodne, o ile złożoność wzrasta. –

+0

@ HéctorValverdePareja co próbujesz zrobić, to się nie powiedzie? Jak widać z fragmentu kodu, wstaw i znajdź pracę dobrze. – Pykler

+0

Przepraszam, kiedy powiedziałem "powyżej", miałem na myśli komentarz dodany w zatwierdzonej odpowiedzi. Chodzi o kompatybilność. Ming nie obsługiwał najnowszej wersji pymongo (później do wersji 3.0), na przykład funkcja "insert_one()" zamiast "insert()" nie jest obsługiwana przez Ming (lub nie była 2 - 3 miesiące temu kiedy grałem z to. –

Powiązane problemy