एकीकरण परीक्षण चलाते समय MongoDB एंबेडेड


112

मेरा प्रश्न इस एक का रूपांतर है

चूंकि मेरे जावा वेब-ऐप प्रोजेक्ट के लिए बहुत सारे रीड फ़िल्टर / क्वेरीज़ और ग्रिड्स जैसे टूल के साथ इंटरफेस की आवश्यकता होती है, इसलिए मैं उपरोक्त समाधान के तरीके से MongoDB को नियोजित करने के लिए एक समझदार तरीके से सोचने के लिए संघर्ष कर रहा हूं।

इसलिए, मैं अपने एकीकरण परीक्षणों के साथ-साथ MongoDB के एक एम्बेडेड उदाहरण को चलाने पर विचार कर रहा हूं। मैं इसे स्वचालित रूप से (या तो प्रत्येक परीक्षण या पूरे सूट के लिए) शुरू करना चाहता हूं , हर परीक्षण के लिए डेटाबेस को फ्लश करता हूं , और अंत में बंद कर देता हूं । ये परीक्षण विकास मशीनों के साथ-साथ सीआई सर्वर पर भी चलाए जा सकते हैं, इसलिए मेरा समाधान भी पोर्टेबल होना चाहिए ।

क्या MongoDB के बारे में अधिक जानकारी वाला कोई व्यक्ति मुझे इस दृष्टिकोण की व्यवहार्यता के बारे में जानने में मदद कर सकता है, और / या शायद किसी भी पढ़ने की सामग्री का सुझाव देता है जो मुझे आरंभ करने में मदद कर सकती है?

मैं अन्य सुझावों के लिए भी खुला हूं जो लोग इस समस्या से कैसे निपट सकते हैं ...



आप इस परियोजना को भी देख सकते हैं जो JVM मेमोरी के अंदर एक MongoDB का अनुकरण करती है। github.com/thiloplanz/jmockmongo लेकिन यह अभी भी विकास में है।
सेबेस्टियन लॉर्बर

यूनिट परीक्षण के लिए [सिर्फ] के लिए नहीं, लेकिन यदि आप लिनक्स का उपयोग कर रहे हैं, तो इस ब्लॉग पोस्ट को MongoDB (यहां तक ​​कि क्लस्टर) के रूप में इन-मेमोरी तैनाती के रूप में चलाना पसंद करते हैं। edgystuff.tumblr.com/post/49304254688 हालांकि इसे रेनबीडी जैसे बॉक्स से बाहर रखना बहुत अच्छा होगा।
तामिर

यहाँ उल्लिखित एम्बेडमोंगो-मावेन-प्लगइन के समान, एक ग्रैडल मोंगो प्लगिन भी उपलब्ध है। मावेन प्लगइन की तरह यह भी फ्लैपडूड एंबेडेडमोंगडोब एपी को लपेटता है और आपको अपने ग्रैड बिल्ड से मोंगो का एक प्रबंधित उदाहरण चलाने की अनुमति देता है।
रॉबर्ट टेलर

इस कोड उदाहरण को यहां देखें: github.com/familysyan/embedded-mongo-integ । कोई स्थापना नहीं, कोई निर्भरता नहीं। यह बस एक प्लेटफ़ॉर्म स्वतंत्र चींटी स्क्रिप्ट है जो आपके लिए डाउनलोड और सेटअप करती है। यह आपके परीक्षणों के बाद भी सब कुछ साफ कर देता है।
एडमंड

जवाबों:


9

यहां @rozky से स्वीकृत उत्तर का 2019 (अपडेटेड) संस्करण है ( मानगो और एंबेडेड दोनों MongoDB पुस्तकालयों में बहुत कुछ बदल दिया गया है)।

package com.example.mongo;

import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess;
import de.flapdoodle.embed.mongo.MongodStarter;
import de.flapdoodle.embed.mongo.config.IMongodConfig;
import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
import de.flapdoodle.embed.mongo.config.Net;
import de.flapdoodle.embed.mongo.distribution.Version;
import de.flapdoodle.embed.process.runtime.Network;
import java.util.Date;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;

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

    private MongodExecutable mongodExe;
    private MongodProcess mongod;
    private MongoClient mongo;

    @Before
    public void beforeEach() throws Exception {
        MongodStarter starter = MongodStarter.getDefaultInstance();
        String bindIp = "localhost";
        int port = 12345;
        IMongodConfig mongodConfig = new MongodConfigBuilder()
        .version(Version.Main.PRODUCTION)
        .net(new Net(bindIp, port, Network.localhostIsIPv6()))
        .build();
        this.mongodExe = starter.prepare(mongodConfig);
        this.mongod = mongodExe.start();
        this.mongo = new MongoClient(bindIp, port);
    }

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

    @Test
    public void shouldCreateNewObjectInEmbeddedMongoDb() {
        // given
        MongoDatabase db = mongo.getDatabase(DATABASE_NAME);
        db.createCollection("testCollection");
        MongoCollection<BasicDBObject> col = db.getCollection("testCollection", BasicDBObject.class);

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

        // then
        assertEquals(1L, col.countDocuments());
    }

}

1
प्रत्येक परीक्षण के लिए एंबेडेड मोंगो की बार-बार शुरू और रोकना अधिकांश परीक्षणों में विफल रहता है। सभी परीक्षणों और शटडाउन से पहले सभी को निष्पादित करने से पहले इसकी शुरुआत बेहतर है
DBS

आप शामिल करने की ज़रूरत @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)ऊपर परिवर्तन के साथ ही
डीबीएस

@ डीबीएस आप शायद एक यादृच्छिक पोर्ट का भी उपयोग कर सकते हैं ताकि आप अभी भी अपने परीक्षणों को एक ताजा एम्बेडेड मोंगो उदाहरण पर चला सकें। यहां डॉक्स देखें ।
कॉलिन क्रॉल

95

मुझे एंबेडेड MongoDB मिला है लाइब्रेरी जो काफी आशाजनक लगती है और वही करती है जो आपने मांगी है।

वर्तमान में MongoDB संस्करणों का समर्थन करता है: 1.6.5से3.1.6 प्रदान की है, बाइनरी अभी भी कॉन्फ़िगर किया गया दर्पण से उपलब्ध हैं।

यहाँ उपयोग का संक्षिप्त उदाहरण है, जिसे मैंने अभी आज़माया है और यह पूरी तरह से काम करता है:

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
बस इस पुस्तकालय का इस्तेमाल किया और यह पूरी तरह से JUnit एक मैक पर एक मोंगो एपीआई का परीक्षण काम किया। सिफारिश की।
मार्टिन डॉव

1
+1 उत्कृष्ट खोज! जब मैंने पहली बार एक वर्ष पहले मोंगोडब का उपयोग करना शुरू किया था, तो डेटाबेस के खिलाफ परीक्षण करने के लिए प्रोग्रामेटिक तरीका नहीं था। हमने जावा वातावरण फ़ाइल के माध्यम से कॉन्फ़िगर किए गए हर परिवेश पर एक परीक्षण उदाहरण देकर इसे प्राप्त किया, लेकिन निश्चित रूप से हर पर्यावरण में मोंगो को स्थापित करने की आवश्यकता थी। ऐसा लग रहा है कि यह सब हल कर देगा।
एंडब

अच्छा! मेरा उत्तर हटा दिया गया क्योंकि यह अब सटीक नहीं है। किसी को भी किसी भी विचार यह कितना परिपक्व है? मैं कल्पना कर सकता हूँ कि यह बहुत ही निम्न स्तर पर MongoDB का अनुकरण करने के लिए काफी जटिल होगा और स्रोत से देखते हुए यह काफी उच्च स्तर का लगता है।
रेमन वैन Vliet

अंत में मेरी परियोजना में इसके साथ खेलने के लिए मिला और यह रिपोर्ट कर सकता है कि सेट-अप और रन के लिए अविश्वसनीय रूप से आसान है। निम्न स्तर की कॉलें आधिकारिक com.mongodb जावा एपीआई का हिस्सा हैं, इसलिए यह नियमित एपीआई का उपयोग करने से अधिक जटिल नहीं है।
एंडब जूल

17
इस उपाय से सावधान रहें। यह सिर्फ वर्तमान ऑपरेटिंग सिस्टम के बारे में जानकारी इकट्ठा करता है और इंटरनेट से उपयुक्त प्लेटफ़ॉर्म-विशिष्ट MongoDB बायनेरिज़ डाउनलोड करता है, डेमन चलाता है और कुछ अन्य कॉन्फ़िगरेशन सामान करता है। एक उद्यम समाधान के रूप में, यह नहीं है। मॉकिंग एकमात्र वास्तविक विकल्प हो सकता है।
जेम्स वाटकिंस

18

फोर्स्क्यू प्रोडक्ट फोंगो है । फोंगो एक इन-मेमोरी जावा मोंगो का कार्यान्वयन है। यह खोज, अद्यतन, आवेषण, हटाने और अन्य तरीकों के लिए मानक मोंगो-जावा-चालक को कॉल को इंटरसेप्ट करता है। प्राथमिक उपयोग हल्के इकाई परीक्षण के लिए है जहां आप एक मोंगो प्रक्रिया को स्पिन नहीं करना चाहते हैं।


1
क्या फोंगो नेटवर्क को कॉल को इंटरसेप्ट करने के लिए होता है, जैसे कि लोकलहोस्ट को: 27017 ताकि कोड परिवर्तन के बिना एकीकरण परीक्षण को सक्षम करने के लिए यह ड्रॉप-इन नकली सर्वर के रूप में काम कर सके?

मोंगो-जावा-सर्वर एक ड्रॉप-इन नकली सर्वर कार्यान्वयन है जिसे कोड परिवर्तन के बिना एकीकरण परीक्षण के लिए उपयोग किया जा सकता है।
बेनेडिक्ट वाल्डवोगेल 8

7

यदि आप मावेन का उपयोग कर रहे हैं, तो आप एक ऐसे प्लगइन में दिलचस्पी ले सकते हैं जो मैंने बनाया है जो फ्लैपडूडल के लिए लपेटता है। 'एम्बेडेड मोंगो' एपीआई :

embedmongo-Maven-प्लगइन

यह एक ऐसा startलक्ष्य प्रदान करता है जिसका उपयोग आप अपने इच्छित (जैसे दौरान pre-integration-test) MongoDB के किसी भी संस्करण को शुरू करने के लिए कर सकते हैं , और एक stopलक्ष्य जो MongoDB (जैसे दौरान post-integration-test) को रोक देगा ।

दूसरों पर इस प्लगइन का उपयोग करने का वास्तविक लाभ यह है कि MongoDB को पहले से स्थापित करने की कोई आवश्यकता नहीं है। MongoDB बायनेरिज़ ~/.embedmongoभविष्य के निर्माण के लिए डाउनलोड और संग्रहीत किए जाते हैं ।




4

वसंत-बूट 1.3 के साथ आप उपयोग कर सकते EmbeddedMongoAutoConfiguration

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.2.RELEASE</version>
</parent>
 ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <version>${embedded-mongo.version}</version>
    </dependency>

MongoConfig

@Configuration
@EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class })
public class MongoConfig{
}

1
क्या आप बता सकते हैं कि "@EnableAutoConfiguration (बहिष्कृत = {एंबेडेड मैंगोऑटोऑनफिगरेशन.क्लास})" एनोटेशन वास्तव में क्या कर रहा है?
ब्रूनो नेग्रो ज़ीका

कारण शायद सबसे अधिक है। de.flapdoodle.embed.mongo निर्भरता परीक्षण के दायरे के लिए चिह्नित नहीं है। इसे लेने के लिए नहीं और उत्पादन एप्लिकेशन सेटअप में एम्बेडेड मैंगो चलाने के लिए अपवर्जन की आवश्यकता है।
सेर्गेई शोकरबकोव

3

आप संस्करण 3.2.6 के रूप में स्मृति में MongoDB चला सकते हैं। से साइट :

MongoDB एंटरप्राइज संस्करण 3.2.6 में शुरू, इन-मेमोरी स्टोरेज इंजन 64-बिट बिल्ड में सामान्य उपलब्धता (GA) का हिस्सा है। कुछ मेटाडेटा और नैदानिक ​​डेटा के अलावा, इन-मेमोरी स्टोरेज इंजन किसी भी ऑन-डिस्क डेटा को बनाए नहीं रखता है, जिसमें कॉन्फ़िगरेशन डेटा, इंडेक्स, उपयोगकर्ता क्रेडेंशियल्स आदि शामिल हैं।


1

सिर्फ यूनिट टेस्टिंग के लिए ही नहीं, बल्कि यह भी समझाया गया कि रेस्ट एपी के साथ इनमोमीरी मोंगोडब का उपयोग कैसे करें।

मावेन निर्भरता:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <dependency>
            <groupId>de.flapdoodle.embed</groupId>
            <artifactId>de.flapdoodle.embed.mongo</artifactId>
        </dependency>

================================================== ===========================

application.properties

server.port = 8080
spring.data.mongodb.database=user_db
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost

================================================== ===========================

UserRepository.java

सार्वजनिक इंटरफ़ेस UserRepository MongoRepository का विस्तार करता है {

}

संदर्भ के लिए और लिंक के नीचे सभी जावा कोड का उपयोग करें: (चरण स्पष्टीकरण द्वारा चरण)

https://www.youtube.com/watch?v=2Tq2Q7EzhSA&t=7s


0

निष्पादन के mongodसाथ प्रदर्शन बेहतर होता हैstorageEngine='ephemeralForTest'

new MongodConfigBuilder()
    .version(Version.Main.PRODUCTION)
    .cmdOptions(new MongoCmdOptionsBuilder()
         .useStorageEngine("ephemeralForTest")
         .build())
    .net(new Net("localhost", port, Network.localhostIsIPv6()))
    .build()

-1

उत्पादन में, आप एक वास्तविक डेटाबेस का उपयोग कर रहे होंगे।

यदि आप चाहते हैं कि आपके परीक्षण यह दर्शाएं कि आपका उत्पाद उत्पादन में कैसे व्यवहार करता है, तो मानगो के वास्तविक उदाहरण का उपयोग करें।

एक नकली कार्यान्वयन वास्तव में एक ही जैसा व्यवहार नहीं कर सकता है। परीक्षण करते समय, आपको शुद्धता के लिए प्रयास करना चाहिए। निष्पादन की गति दूसरी आती है।


6
मुझे लगता है कि तुम मेरे उद्देश्य से चूक गए। मैं मानगो के एक नकली उदाहरण की तलाश में नहीं था, मैं एक वास्तविक उदाहरण चाहता था लेकिन मेरे परीक्षणों में एम्बेडेड था। इसका कारण था कि MongoDB को शुरू करना और एक मौजूदा डेटाबेस को प्रदूषित किए बिना एक विशेष स्थिति में डाल देना, संचालन की एक श्रृंखला चलाना, और फिर मनमाने ढंग से डेटा के माध्यम से निचोड़ने के बिना परिणाम का निरीक्षण करना जो मेरे परीक्षण से संबंधित नहीं था। असली के रूप में यह संभवतः अभी भी नियंत्रित परीक्षण वातावरण बनाए रखने के दौरान हो सकता है।
सीनहेड्स

क्षमा करें, शब्द "अनुकरण" और इन सभी "इन-मेमोरी" सुझावों के कारण मुझे जावा-भूमि में "एम्बेडेड" का अर्थ भूल गया। सुन के अच्छा लगा।
जैक्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.