MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Kiểm tra tích hợp khởi động mùa xuân với MongoDB nhúng

1. Tổng quan

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách sử dụng giải pháp MongoDB nhúng của Flapdoodle cùng với Spring Boot để chạy các bài kiểm tra tích hợp MongoDB một cách suôn sẻ.

MongoDB là cơ sở dữ liệu tài liệu NoSQL phổ biến . Nhờ khả năng mở rộng cao, tính năng sharding tích hợp và hỗ trợ cộng đồng tuyệt vời, nó thường được coi là “ the Lưu trữ NoSQL ”của nhiều nhà phát triển.

Như với bất kỳ công nghệ bền bỉ nào khác, điều quan trọng là có thể kiểm tra tích hợp cơ sở dữ liệu với phần còn lại của ứng dụng của chúng tôi một cách dễ dàng . Rất may, Spring Boot cho phép chúng tôi viết loại thử nghiệm đó một cách dễ dàng.

2. Sự phụ thuộc của Maven

Đầu tiên, hãy thiết lập Maven cha cho dự án Khởi động của chúng ta.

Cảm ơn cha mẹ chúng tôi không cần xác định phiên bản cho từng phần phụ thuộc Maven theo cách thủ công .

Đương nhiên chúng tôi sẽ sử dụng Spring Boot:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.1</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

Bạn có thể tìm thấy phiên bản Boot mới nhất tại đây.

Vì chúng tôi đã thêm Spring Boot cha mẹ, chúng tôi có thể thêm các phụ thuộc bắt buộc mà không cần chỉ định phiên bản của chúng:

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

spring-boot-starter-data-mongodb sẽ bật hỗ trợ Spring cho MongoDB:

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

de.flapdoodle.embed.mongo cung cấp MongoDB được nhúng để kiểm tra tích hợp.

3. Kiểm tra bằng cách sử dụng MongoDB được nhúng

Phần này bao gồm hai tình huống:kiểm tra Spring Boot và kiểm tra thủ công.

3.1. Kiểm tra khởi động mùa xuân

Sau khi thêm de.flapdoodle.embed.mongo phụ thuộc Spring Boot sẽ tự động cố gắng tải xuống và khởi động MongoDB được nhúng khi chạy thử nghiệm.

Gói này sẽ chỉ được tải xuống một lần cho mỗi phiên bản để các thử nghiệm tiếp theo chạy nhanh hơn nhiều.

Ở giai đoạn này, chúng ta sẽ có thể bắt đầu và vượt qua bài kiểm tra tích hợp JUnit 5 mẫu:

@DataMongoTest
@ExtendWith(SpringExtension.class)
public class MongoDbSpringIntegrationTest {
    @DisplayName("given object to save"
        + " when save object using MongoDB template"
        + " then object is saved")
    @Test
    public void test(@Autowired MongoTemplate mongoTemplate) {
        // given
        DBObject objectToSave = BasicDBObjectBuilder.start()
            .add("key", "value")
            .get();

        // when
        mongoTemplate.save(objectToSave, "collection");

        // then
        assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key")
            .containsOnly("value");
    }
}

Như chúng ta có thể thấy, cơ sở dữ liệu nhúng đã được Spring tự động khởi động, cơ sở dữ liệu này cũng sẽ được đăng nhập trong bảng điều khiển:

...Starting MongodbExampleApplicationTests on arroyo with PID 10413...

3.2. Kiểm tra cấu hình thủ công

Spring Boot sẽ tự động khởi động và định cấu hình cơ sở dữ liệu được nhúng, sau đó đưa vào MongoTemplate ví dụ cho chúng tôi. Tuy nhiên, đôi khi chúng tôi có thể cần phải định cấu hình cơ sở dữ liệu Mongo được nhúng theo cách thủ công (ví dụ:khi thử nghiệm một phiên bản DB cụ thể).

Đoạn mã sau đây cho thấy cách chúng tôi có thể định cấu hình phiên bản MongoDB được nhúng theo cách thủ công. Điều này gần tương đương với bài kiểm tra Spring trước đó:

class ManualEmbeddedMongoDbIntegrationTest {
    private static final String CONNECTION_STRING = "mongodb://%s:%d";

    private MongodExecutable mongodExecutable;
    private MongoTemplate mongoTemplate;

    @AfterEach
    void clean() {
        mongodExecutable.stop();
    }

    @BeforeEach
    void setup() throws Exception {
        String ip = "localhost";
        int port = 27017;

        ImmutableMongodConfig mongodConfig = MongodConfig
            .builder()
            .version(Version.Main.PRODUCTION)
            .net(new Net(ip, port, Network.localhostIsIPv6()))
            .build();

        MongodStarter starter = MongodStarter.getDefaultInstance();
        mongodExecutable = starter.prepare(mongodConfig);
        mongodExecutable.start();
        mongoTemplate = new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, ip, port)), "test");
    }

    @DisplayName("given object to save"
        + " when save object using MongoDB template"
        + " then object is saved")
    @Test
    void test() throws Exception {
        // given
        DBObject objectToSave = BasicDBObjectBuilder.start()
            .add("key", "value")
            .get();

        // when
        mongoTemplate.save(objectToSave, "collection");

        // then
        assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key")
            .containsOnly("value");
    }
}

Lưu ý rằng chúng tôi có thể nhanh chóng tạo MongoTemplate bean được định cấu hình để sử dụng cơ sở dữ liệu nhúng được định cấu hình theo cách thủ công của chúng tôi và đăng ký nó bên trong vùng chứa Spring bằng cách chỉ tạo, ví dụ:a @TestConfiguration với @Bean phương thức sẽ trả về MongoTemplate mới (MongoClients.create (connectionString, “test”) .

Có thể tìm thấy nhiều ví dụ hơn trên kho lưu trữ GitHub chính thức của Flapdoodle.

3.3. Ghi nhật ký

Chúng tôi có thể định cấu hình thông báo ghi nhật ký cho MongoDB khi chạy kiểm tra tích hợp bằng cách thêm hai thuộc tính này vào src / test / resources / application.propertes tệp:

logging.level.org.springframework.boot.autoconfigure.mongo.embedded
logging.level.org.mongodb

Ví dụ:để tắt ghi nhật ký, chúng tôi chỉ cần đặt các giá trị thành tắt :

logging.level.org.springframework.boot.autoconfigure.mongo.embedded=off
logging.level.org.mongodb=off

3.4. Sử dụng cơ sở dữ liệu thực về sản xuất

Vì chúng tôi đã thêm de.flapdoodle.embed.mongo sự phụ thuộc bằng cách sử dụng kiểm tra không cần phải tắt cơ sở dữ liệu được nhúng khi chạy trên sản xuất . Tất cả những gì chúng ta phải làm là chỉ định chi tiết kết nối MongoDB (ví dụ:máy chủ và cổng) và chúng ta đã sẵn sàng.

Để sử dụng DB được nhúng bên ngoài các bài kiểm tra, chúng tôi có thể sử dụng cấu hình Spring sẽ đăng ký đúng MongoClient (nhúng hoặc sản xuất) tùy thuộc vào cấu hình hoạt động.

Chúng tôi cũng sẽ cần thay đổi phạm vi phụ thuộc sản xuất thành thời gian chạy .

4. Tranh cãi về thử nghiệm nhúng

Sử dụng cơ sở dữ liệu nhúng có thể giống như một ý tưởng tuyệt vời ngay từ đầu. Thật vậy, đó là một cách tiếp cận tốt khi chúng tôi muốn kiểm tra xem ứng dụng của mình có hoạt động chính xác trong các lĩnh vực như:

  • Đối tượng <-> Cấu hình ánh xạ tài liệu
  • Trình nghe sự kiện vòng đời liên tục tùy chỉnh (tham khảo AbstractMongoEventListener )
  • Logic của bất kỳ mã nào hoạt động trực tiếp với lớp bền bỉ

Rất tiếc, việc sử dụng máy chủ nhúng không thể được coi là “thử nghiệm tích hợp đầy đủ” . MongoDB nhúng của Flapdoodle không phải là sản phẩm MongoDB chính thức. Do đó, chúng tôi không thể chắc chắn rằng nó hoạt động chính xác như trong môi trường sản xuất.

Nếu chúng ta muốn chạy các bài kiểm tra giao tiếp trong môi trường càng gần với quá trình sản xuất càng tốt, thì giải pháp tốt hơn là sử dụng vùng chứa môi trường chẳng hạn như Docker.

Để tìm hiểu thêm về Docker, hãy đọc bài viết trước của chúng tôi tại đây.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tại sao hasOwnProperty của mô hình mongoose trả về false khi thuộc tính tồn tại?

  2. Kết nối ứng dụng Heroku với dịch vụ đám mây Atlas MongoDB

  3. Hình dung cấu trúc liên kết cụm của bạn trong ClusterControl

  4. Xóa nhiều tài liệu khỏi mongo trong một truy vấn

  5. Cách cập nhật tài liệu con trong mongodb