itsource

임베디드 MongoDB(연동 테스트 실행 시)

mycopycode 2022. 12. 4. 22:37
반응형

임베디드 MongoDB(연동 테스트 실행 시)

제 질문은 이것들의 변형입니다.

Java Web-app 프로젝트에는 많은 읽기 필터/쿼리가 필요하며 GridFS와 같은 툴과의 인터페이스가 필요하기 때문에 위의 솔루션에서 제안하는 방법으로 MongoDB를 사용하는 현명한 방법을 고민하고 있습니다.

따라서 통합 테스트와 함께 MongoDB의 임베디드 인스턴스를 실행하는 것을 검토하고 있습니다. 테스트 또는 전체 스위트에 대해 자동으로 시작하고 모든 테스트에 대해 데이터베이스를 플러시하고 마지막에 종료합니다.이러한 테스트는 CI 서버뿐만 아니라 개발 머신에서도 실행할 수 있기 때문에 솔루션도 휴대성이 필요합니다.

MongoDB에 대한 더 많은 지식을 가진 사람이 이 접근법의 실현 가능성을 이해하는 데 도움이 될 만한 자료 및/또는 시작에 도움이 될 만한 읽을거리를 제안해 주실 수 있습니까?

이 문제에 어떻게 접근할 수 있는지에 대해 사람들이 제안할 수 있는 다른 제안도 받아들일 수 있습니다.

저는 당신이 요청한 대로 매우 유망해 보이는 Embedded 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));
    }
}

다음은 @rozky에서 승인된 답변의 업데이트된 버전입니다(Mongo 라이브러리와 Embedded 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.MongodConfig;
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;
        MongodConfig mongodConfig = MongodConfig.builder()
            .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());
    }

}

포스퀘어 제품 Fongo가 있습니다.Fongo는 mongo의 인메모리 자바 구현입니다.표준 mongo-java 드라이버에 대한 콜을 대행 수신하여 검색, 업데이트, 삽입, 삭제 및 기타 메서드를 수행합니다.주요 용도는 mongo 프로세스를 회전시키고 싶지 않은 경량 유닛 테스트에 사용됩니다.

Maven을 사용하고 있다면, flapdoodle.de의 'http mongo' API를 정리한 제가 만든 플러그인에 관심이 있을 것입니다.

내장형 맵의 개재에 의한

이 기능을 통해start원하는 버전의 MongoDB를 시작하는 데 사용할 수 있는 목표입니다(예: 실행 중).pre-integration-test) 및 a.stopMongoDB를 정지하는 목표(예: 중)post-integration-test).

이 플러그인을 사용하는 것의 진정한 장점은 MongoDB를 미리 설치할 필요가 없다는 것입니다.MongoDB 바이너리가 다운로드되어 저장됩니다.~/.embedmongo향후 구축에 대비합니다.

만약 sbt와 speces2를 사용한다면, 저는 같은 종류의 inbedmongo 포장지를 작성했습니다.

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

spring-boot 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(MongoConfig)

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

버전 3.2.6 이후 메모리에서 MongoDB를 실행할 수 있습니다.사이트:

MongoDB Enterprise 버전 3.2.6 이후 인메모리 스토리지 엔진은 64비트 빌드에서 GA(General Availability)의 일부입니다.일부 메타데이터 및 진단 데이터 외에 인메모리 스토리지 엔진은 구성 데이터, 인덱스, 사용자 자격 증명 등을 포함한 온디스크 데이터를 유지 보수하지 않습니다.

유닛 테스트뿐만 아니라 rest api를 사용한 메모리 mongodb 사용법도 설명했습니다.

maven 의존관계:

        <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

퍼블릭 인터페이스 User Repository는 Mongo Repository를 확장합니다{

}

참조 및 모든 Java 코드를 아래 링크에서 사용합니다(단계별 설명).

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

은 '실행할 때'를 실행하는 것이 좋습니다.mongodstorageEngine='ephemeralForTest'

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

통합 테스트를 위해 Embedded mongodb를 실행하는 데 필요한 의존 관계는 다음과 같습니다.

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.5.2</version>
        </dependency>

        <dependency>
            <groupId>de.flapdoodle.embed</groupId>
            <artifactId>de.flapdoodle.embed.mongo</artifactId>
            <version>3.0.0</version>
            <scope>test</scope>
        </dependency>

다음 코드 snip을 사용해 보십시오.EmbeddedMongoAutoConfiguration:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class EmbeddedMongoApplication {

    public static void main(String[] args) {
         System.setProperty("os.arch", "x86_64");
         SpringApplication.run(EmbeddedMongoApplication.class, args);
    }
    
    @Bean
    public EmbeddedMongoAutoConfiguration embeddedMongoAutoConfiguration(MongoProperties mongoProperties) {
        return new EmbeddedMongoAutoConfiguration(mongoProperties);
    }
}

주의:

임베디드 mongodb가 Path 아래에 다운로드 됩니다.따라서 경로에 적절한 권한이 있다는 점을 고려하십시오.

Linux : $HOME/.embedmongo/linux/mongodb-linux-x86_64-3.2.2.tgz
Windows : C:\Users\<username>\.embedmongo\win32\mongodb-win32-x86_64-3.x.x.zip

실제 환경에서는 실제 데이터베이스를 사용합니다.

테스트에서 제품의 동작을 반영하려면 Mongo의 실제 인스턴스를 사용하십시오.

가짜 실장은 실제 실장과 완전히 동일하게 동작하지 않을 수 있습니다.테스트를 할 때는 정확성을 위해 노력해야 합니다.실행 속도가 두 번째입니다.

언급URL : https://stackoverflow.com/questions/6437226/embedded-mongodb-when-running-integration-tests

반응형