MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Pengujian Integrasi Boot Musim Semi dengan MongoDB Tersemat

1. Ikhtisar

Dalam tutorial ini, kita akan belajar bagaimana menggunakan solusi MongoDB Flapdoodle yang disematkan bersama dengan Spring Boot untuk menjalankan tes integrasi MongoDB dengan lancar.

MongoDB adalah database dokumen NoSQL yang populer . Berkat skalabilitas tinggi, sharding bawaan, dan dukungan komunitas yang sangat baik, sering kali dianggap sebagai “the Penyimpanan NoSQL” oleh banyak pengembang.

Seperti halnya teknologi persistensi lainnya, sangat penting untuk dapat menguji integrasi database dengan aplikasi kita yang lain dengan mudah . Untungnya, Spring Boot memungkinkan kita untuk menulis tes semacam itu dengan mudah.

2. Ketergantungan Maven

Pertama, mari siapkan induk Maven untuk proyek Boot kita.

Terima kasih kepada induk kami tidak perlu mendefinisikan versi untuk setiap ketergantungan Maven secara manual .

Kami secara alami akan menggunakan 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>

Anda dapat menemukan versi Boot terbaru di sini.

Karena kami menambahkan induk Spring Boot, kami dapat menambahkan dependensi yang diperlukan tanpa menentukan versinya:

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

spring-boot-starter-data-mongodb akan mengaktifkan dukungan Spring untuk MongoDB:

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

de.flapdoodle.embed.mongo menyediakan MongoDB tertanam untuk pengujian integrasi.

3. Uji Menggunakan MongoDB Tersemat

Bagian ini mencakup dua skenario:uji Spring Boot dan uji manual.

3.1. Tes Boot Musim Semi

Setelah menambahkan de.flapdoodle.embed.mongo ketergantungan Boot Musim Semi akan secara otomatis mencoba mengunduh dan memulai MongoDB yang disematkan saat menjalankan pengujian.

Paket hanya akan diunduh sekali untuk setiap versi sehingga pengujian selanjutnya berjalan lebih cepat.

Pada tahap ini kita harus dapat memulai dan lulus uji integrasi sampel JUnit 5:

@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");
    }
}

Seperti yang bisa kita lihat, database yang disematkan secara otomatis dimulai oleh Spring, yang juga harus dicatat di konsol:

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

3.2. Uji Konfigurasi Manual

Spring Boot akan secara otomatis memulai dan mengonfigurasi basis data tertanam dan kemudian menyuntikkan MongoTemplate contoh bagi kita. Namun, terkadang kita mungkin perlu mengonfigurasi basis data Mongo yang disematkan secara manual (mis., saat menguji versi DB tertentu).

Cuplikan berikut menunjukkan bagaimana kita dapat mengonfigurasi instance MongoDB yang disematkan secara manual. Ini kira-kira setara dengan tes Musim Semi sebelumnya:

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");
    }
}

Perhatikan, bahwa kita dapat dengan cepat membuat MongoTemplate bean dikonfigurasi untuk menggunakan database tertanam kami yang dikonfigurasi secara manual dan mendaftarkannya di dalam wadah Spring hanya dengan membuat, mis., @TestConfiguration dengan @Bean metode yang akan mengembalikan MongoTemplate(MongoClients.create(connectionString, “test”) baru .

Contoh lainnya dapat ditemukan di repositori GitHub resmi Flappdoodle.

3.3. Masuk

Kita dapat mengonfigurasi pesan logging untuk MongoDB saat menjalankan tes integrasi dengan menambahkan dua properti ini ke src/test/resources/application.propertes berkas:

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

Misalnya, untuk menonaktifkan logging, kita cukup menyetel nilainya ke off :

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

3.4. Menggunakan Basis Data Nyata pada Produksi

Karena kami menambahkan de.flapdoodle.embed.mongo ketergantungan menggunakan test tidak perlu menonaktifkan basis data tertanam saat menjalankan produksi . Yang harus kita lakukan adalah menentukan detail koneksi MongoDB (mis., Host dan port) dan kita siap melakukannya.

Untuk menggunakan DB tertanam di luar pengujian, kita dapat menggunakan profil Spring yang akan mendaftarkan MongoClient yang tepat (tersemat atau produksi) tergantung pada profil aktif.

Kita juga perlu mengubah cakupan ketergantungan produksi ke runtime .

4. Kontroversi Pengujian Tertanam

Menggunakan basis data tertanam mungkin terlihat seperti ide bagus di awal. Memang, ini adalah pendekatan yang baik ketika kita ingin menguji apakah aplikasi kita berperilaku dengan benar di area seperti:

  • Objek<->Konfigurasi pemetaan dokumen
  • Pemroses peristiwa siklus hidup persistensi khusus (lihat AbstractMongoEventListener )
  • Logika dari setiap kode yang bekerja secara langsung dengan lapisan persistensi

Sayangnya, menggunakan server tertanam tidak dapat dianggap sebagai "pengujian integrasi penuh" . MongoDB tertanam Flapdoodle bukanlah produk MongoDB resmi. Oleh karena itu, kami tidak dapat memastikan bahwa ia berperilaku persis seperti di lingkungan produksi.

Jika kita ingin menjalankan tes komunikasi di lingkungan sedekat mungkin dengan produksi, solusi yang lebih baik adalah menggunakan wadah lingkungan seperti Docker.

Untuk mengetahui lebih lanjut tentang Docker, baca artikel kami sebelumnya di sini.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Operator sampel MongoDB

  2. Cara memasukkan banyak item sekaligus dalam koleksi MongoDB

  3. Kueri Mongodb pada bulan, hari, tahun... dari suatu tanggal

  4. Berapa ukuran maksimal operasi batch MongoDB?

  5. Peta Hadoop/Kurangi vs Peta bawaan/Kurangi