ইন্টিগ্রেশন পরীক্ষা চলাকালীন এম্বেড মোংগোডিবি


112

আমার প্রশ্ন একটি প্রকরণ হয় এই এক

যেহেতু আমার জাভা ওয়েব-অ্যাপ্লিকেশন প্রকল্পে গ্রিডএফএসের মতো সরঞ্জামগুলির সাথে প্রচুর পঠিত ফিল্টার / ক্যোয়ারী এবং ইন্টারফেসের প্রয়োজন রয়েছে, তাই উপরের সমাধানটি যেভাবে প্রস্তাব দেয় সেভাবে মঙ্গোডিবি নিয়োগের একটি বুদ্ধিমান উপায় সম্পর্কে ভাবতে লড়াই করছি strugg

অতএব, আমি আমার ইন্টিগ্রেশন পরীক্ষার পাশাপাশি মংগোডিবি-এর একটি এম্বেড ইনস্ট্যান্স চালানোর বিষয়ে বিবেচনা করছি। আমি এটি স্বয়ংক্রিয়ভাবে শুরু করতে চাই (প্রতিটি পরীক্ষার জন্য বা পুরো স্যুটটির জন্য), প্রতিটি পরীক্ষার জন্য ডাটাবেস ফ্লাশ করে এবং শেষে বন্ধ করে দেওয়া । এই পরীক্ষাগুলি সিআই সার্ভারের পাশাপাশি ডেভলপমেন্ট মেশিনে চালানো হতে পারে, সুতরাং আমার সমাধানটিও বহনযোগ্য হতে হবে ।

মোঙ্গোডিবি-র আরও জ্ঞানযুক্ত কেউ কি আমাকে এই পদ্ধতির সম্ভাব্যতা সম্পর্কে ধারণা পেতে এবং / অথবা সম্ভবত এমন কোনও পড়ার উপাদান সুপারিশ করতে সহায়তা করতে পারেন যা আমাকে শুরু করতে সহায়তা করতে পারে?

আমি কীভাবে এই সমস্যাটির কাছে যেতে পারি সে সম্পর্কে লোকদের থাকতে পারে এমন অন্যান্য পরামর্শের জন্যও আমি উন্মুক্ত ...



আপনি এই প্রকল্পটি যা জেভিএম মেমরির মধ্যে একটি মঙ্গোডিবি অনুকরণ করে তাও পরীক্ষা করতে পারেন। github.com/thiloplanz/jmockmongo তবে এটি এখনও চলছে।
সেবাস্তিয়ান লরবার

ইউনিট পরীক্ষার জন্য [কেবলমাত্র] নয়, আপনি যদি লিনাক্স ব্যবহার করে থাকেন তবে মংগোডিবি (এমনকি একটি ক্লাস্টার) মেমোরি স্থাপনার হিসাবে চালাতে চান তবে এই ব্লগ পোস্টটি পড়ুন। edgystuff.tumblr.com/post/49304254688 যদিও এটি রাভেনডিবি এর মতো বক্সের বাইরে রাখলে দুর্দান্ত হবে।
তামির

এখানে উল্লিখিত এম্বেডমঙ্গো-মাভেন-প্লাগইনের মতো, এখানে একটি গ্রেডল মঙ্গো প্লাগইনও উপলব্ধ। ম্যাভেন প্লাগইনের মতো এটি ফ্ল্যাপডুডল এম্বেডড মঙ্গোডিবি এপিও মুড়ে দেয় এবং আপনাকে আপনার গ্রেডল বিল্ডগুলি থেকে মঙ্গোর পরিচালিত উদাহরণ চালাতে দেয়।
রবার্ট টেলর

এই কোড উদাহরণটি এখানে দেখুন: github.com/familysyan/ebded-mongo-integ । কোনও ইনস্টলেশন, কোনও নির্ভরতা নেই। এটি কেবল একটি প্ল্যাটফর্ম স্বতন্ত্র পিপীলিকা স্ক্রিপ্ট যা আপনার জন্য ডাউনলোড এবং সেটআপ করে। এটি আপনার পরীক্ষার পরে সমস্ত কিছু পরিষ্কার করে দেয়।
এডমন্ড

উত্তর:


9

এখানে @rozky- এর গৃহীত উত্তরের একটি আপডেট সংস্করণ (2019 এর জন্য) (মঙ্গো এবং এম্বেডেড মঙ্গোডিবি উভয় লাইব্রেরিতেই অনেক কিছু পরিবর্তন করা হয়েছে)।

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
প্রতিটি পরীক্ষার জন্য এম্বেড এমঙ্গোটির বারবার শুরু এবং স্টপ বেশিরভাগ পরীক্ষায় ব্যর্থ হয়। সমস্ত পরীক্ষার আগে শুরু করা এবং একবারে সকলের মৃত্যুদন্ড কার্যকর হওয়ার পরে এটি ভাল
ডিবিএস

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)উপরের পরিবর্তনের পাশাপাশি
ডিবিএস

@ ডিবিএস আপনি সম্ভবত একটি এলোমেলো বন্দরও ব্যবহার করতে পারেন যাতে আপনি এখনও একটি তাজা এমবেডেড মোঙ্গো দৃষ্টান্তে একই সাথে আপনার পরীক্ষা চালাতে পারেন। ডক্সটি এখানে দেখুন
কলিন ক্রাওল

95

আমি এম্বেডেড মঙ্গোডিবি লাইব্রেরিটি পেয়েছি যা দেখতে বেশ আশাব্যঞ্জক এবং আপনি যা চেয়েছিলেন তা করে।

বর্তমানে মঙ্গোডিবি সংস্করণগুলি সমর্থন করে: 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
সবেমাত্র এই লাইব্রেরিটি ব্যবহার করেছেন এবং এটি ম্যাকের একটি মঙ্গো এপিআই পরীক্ষার জন্য জুনিত পুরোপুরি কাজ করেছে। প্রস্তাবিত।
মার্টিন ডা

1
+1 দুর্দান্ত সন্ধান! যখন আমি প্রথম এক বছর আগে মংডোব ব্যবহার শুরু করেছি, তখন ডাটাবেসের বিরুদ্ধে পরীক্ষা করার জন্য কোনও প্রোগ্রাম্যাটিক পদ্ধতি না রাখাই ছিল ডাউনসাইডগুলির মধ্যে একটি। আমরা প্রতিটি পরিবেশের একটি পরীক্ষার উদাহরণ দিয়ে এটি পেয়েছিলাম, একটি জাভা সম্পত্তি ফাইলের মাধ্যমে কনফিগার করা হয়েছে তবে অবশ্যই প্রতিটি পরিবেশে মঙ্গো ইনস্টল করা দরকার। দেখে মনে হচ্ছে এটি সমস্ত সমাধান করবে।
andyb

নিস! আমার উত্তরটি মুছে ফেলা হয়েছে কারণ এটি আর সঠিক নয়। কেউ কতটা ধারণা যে এটি কতটা পরিপক্ক? আমি কল্পনা করতে পারি যে এটি খুব নিম্ন স্তরে মঙ্গোডিবি অনুকরণ করা বেশ জটিল এবং উত্স থেকে বিচার করা এটি দেখতে বেশ উচ্চ স্তরের বলে মনে হচ্ছে।
রেমন ভ্যান ভালিট

অবশেষে আমার প্রকল্পে এটির সাথে খেলতে পেল এবং এটি প্রতিবেদন করতে পারে যে সেট আপ এবং রান করা অবিশ্বাস্যরকম সহজ। নিম্ন-স্তরের কলগুলি সমস্ত অফিশিয়াল com.mongodb জাভা এপিআই-র অংশ, তাই এটি নিয়মিত এপিআই ব্যবহার করা ছাড়া আর জটিল নয়।
andyb

17
এই সমাধানটি সম্পর্কে সতর্কতা অবলম্বন করুন। এটি কেবলমাত্র বর্তমান অপারেটিং সিস্টেম সম্পর্কিত তথ্য সংগ্রহ করে এবং উপযুক্ত প্ল্যাটফর্ম-নির্দিষ্ট মঙ্গোডিবি বাইনারিগুলি ইন্টারনেট থেকে ডাউনলোড করে, ডিমন চালায় এবং কিছু অন্যান্য কনফিগারেশন স্টাফ করে। একটি উদ্যোগ সমাধান হিসাবে, এটি না। বিদ্রূপ করা একমাত্র আসল বিকল্প হতে পারে।
জেমস ওয়াটকিন্স

18

ফোরসোয়ার পণ্য রয়েছে ফঙ্গো । ফঙ্গো হ'ল মঙ্গোর একটি স্মৃতি জাভা প্রয়োগ। এটি অনুসন্ধান, আপডেট, সন্নিবেশ, অপসারণ এবং অন্যান্য পদ্ধতির জন্য স্ট্যান্ডার্ড মঙ্গো-জাভা-ড্রাইভারকে কল দেয় to প্রাথমিক ব্যবহার হ'ল লাইটওয়েট ইউনিট পরীক্ষার জন্য যেখানে আপনি কোনও মঙ্গো প্রক্রিয়া চালাতে চান না।


1
ফোঙ্গো কি নেটওয়ার্কে কলগুলি বাধা দেওয়ার জন্য ঘটেছে, যেমন লোকালহোস্টের: 27017 যাতে কোড ছাড়াই ইন্টিগ্রেশন টেস্টিং সক্ষম করতে এটি ড্রপ-ইন জাল সার্ভার হিসাবে পরিবেশন করতে পারে?

মঙ্গো-জাভা-সার্ভার একটি ড্রপ-ইন জাল সার্ভার বাস্তবায়ন যা কোড পরিবর্তন ছাড়াই ইন্টিগ্রেশন পরীক্ষার জন্য ব্যবহার করা যেতে পারে।
বেনিডিক্ট ওয়াল্ডভোগেল

7

আপনি যদি মাভেন ব্যবহার করছেন তবে আপনি যে প্লাগইনটি তৈরি করেছেন তাতে আপনি আগ্রহী হতে পারেন যা ফ্ল্যাপডুডল.ডি 'এমবেডড মঙ্গো' এপিআই মোড়বে :

embedmongo-ম্যাভেন-প্লাগইন

এটি এমন একটি startলক্ষ্য সরবরাহ করে যা আপনি চান মোংগোডিবি এর যে কোনও সংস্করণ শুরু করতে ব্যবহার করতে পারেন (উদাহরণস্বরূপ pre-integration-test) এবং এমন একটি stopলক্ষ্য যা মঙ্গোডিবি (যেমন: চলাকালীন post-integration-test) বন্ধ করবে ।

অন্যদের উপর এই প্লাগইনটি ব্যবহারের আসল সুবিধা হ'ল মংগাডিবি এর আগে ইনস্টল করার কোনও প্রয়োজন নেই। মঙ্গোডিবি বাইনারিগুলি ডাউনলোড এবং ~/.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
"@EnableAutoConfigration (ব্যতীত = {এম্বেডডমঙ্গোআউটস কনফিগারেশন.ক্লাস})" টীকাটি কী করছে তা আপনি কী ব্যাখ্যা করতে পারেন?
ব্রুনো নেগ্রো জিকা

সম্ভবত সম্ভবত ডি.ফ্লেপডুডল.ইম্বেড.মঙ্গো নির্ভরতা পরীক্ষার সুযোগের জন্য চিহ্নিত করা হয়নি। এটিকে বাছাই করা এবং প্রযোজনার অ্যাপ্লিকেশন সেটআপে এমবেডড মঙ্গো চালানো নয় বাদ পড়ার প্রয়োজন।
সের্গেই শ্যাচারবাকভ

3

সংস্করণ 3.2.6 হিসাবে আপনি মেমোডেডিবি চালাতে পারেন। থেকে সাইটের :

মঙ্গোডিবি এন্টারপ্রাইজ সংস্করণ 3.2.6 থেকে শুরু করে, ইন-মেমরি স্টোরেজ ইঞ্জিনটি 64-বিট বিল্ডগুলিতে সাধারণ উপলব্ধতার (জিএ) অংশ। কিছু মেটাডেটা এবং ডায়াগোনস্টিক ডেটা বাদে ইন-মেমরি স্টোরেজ ইঞ্জিন কনফিগারেশন ডেটা, ইনডেক্স, ব্যবহারকারীর শংসাপত্রাদি ইত্যাদি সহ কোনও অনস্ক্রিয় ডেটা বজায় রাখে না


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

পাবলিক ইন্টারফেস ইউজাররেপোসিটোরি মোংগোরোপোসিটারি প্রসারিত করে {

}

রেফারেন্স এবং সমস্ত জাভা কোড নীচের লিঙ্ক ব্যবহারের জন্য: (ধাপে ধাপে ব্যাখ্যা)

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
আমি মনে করি আপনি আমার উদ্দেশ্যটি মিস করেছেন। আমি মঙ্গোর নকল উদাহরণ খুঁজছিলাম না, আমি একটি বাস্তব উদাহরণ চাইছিলাম তবে আমার পরীক্ষাগুলিতে এম্বেড। কারণটি ছিল মঙ্গোডিবি শুরু করে কোনও বিদ্যমান ডাটাবেসকে দূষিত না করে নির্দিষ্ট একটি রাজ্যে রেখে, একাধিক ক্রিয়াকলাপ চালানো, এবং তারপরে ফলাফলটি পরীক্ষা করা প্রয়োজন যা আমার পরীক্ষার সাথে সম্পর্কিত ছিল না। বাস্তব হিসাবে এটি সম্ভবত এখনও নিয়ন্ত্রিত পরীক্ষার পরিবেশ বজায় রাখতে পারে।
seanhodges

দুঃখিত, "সিমুলেট" শব্দ এবং এই সমস্ত "ইন-মেমোরি" পরামর্শগুলি জাভা-ভূমিতে "এমবেডেড" এর অর্থটি আমাকে ভুলে যেতে বাধ্য করেছিল। শুনে খুশি হলাম.
জ্যাকসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.