1. अवलोकन
इस ट्यूटोरियल में, हम सीखेंगे कि कैसे MongoDB एकीकरण परीक्षण सुचारू रूप से चलाने के लिए स्प्रिंग बूट के साथ Flapdoodle के एम्बेडेड MongoDB समाधान का उपयोग करें।
MongoDB एक लोकप्रिय NoSQL दस्तावेज़ डेटाबेस है . उच्च मापनीयता, अंतर्निहित शार्डिंग और उत्कृष्ट सामुदायिक समर्थन के कारण इसे अक्सर “द माना जाता है कई डेवलपर्स द्वारा नोएसक्यूएल स्टोरेज”।
किसी भी अन्य दृढ़ता तकनीक की तरह, हमारे शेष एप्लिकेशन के साथ डेटाबेस एकीकरण का आसानी से परीक्षण करने में सक्षम होना महत्वपूर्ण है . शुक्र है, स्प्रिंग बूट हमें इस तरह के परीक्षण आसानी से लिखने की अनुमति देता है।
2. मावेन निर्भरताएं
सबसे पहले, हमारे बूट प्रोजेक्ट के लिए मावेन पैरेंट सेट करें।
माता-पिता के लिए धन्यवाद हमें प्रत्येक मावेन निर्भरता के लिए मैन्युअल रूप से संस्करण को परिभाषित करने की आवश्यकता नहीं है ।
हम स्वाभाविक रूप से स्प्रिंग बूट का उपयोग करने जा रहे हैं:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
आप नवीनतम बूट संस्करण यहां पा सकते हैं।
चूंकि हमने स्प्रिंग बूट पैरेंट को जोड़ा है, इसलिए हम उनके संस्करणों को निर्दिष्ट किए बिना आवश्यक निर्भरताएं जोड़ सकते हैं:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
स्प्रिंग-बूट-स्टार्टर-डेटा-मोंगोडब MongoDB के लिए स्प्रिंग सपोर्ट सक्षम करेगा:
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<scope>test</scope>
</dependency>
de.flapdoodle.embed.mongo एकीकरण परीक्षण के लिए एम्बेडेड MongoDB प्रदान करता है।
3. एंबेडेड MongoDB का उपयोग करके परीक्षण करें
इस खंड में दो परिदृश्य शामिल हैं:स्प्रिंग बूट परीक्षण और मैन्युअल परीक्षण।
3.1. स्प्रिंग बूट टेस्ट
de.flapdoodle.embed.mongo . जोड़ने के बाद निर्भरता स्प्रिंग बूट स्वचालित रूप से एम्बेडेड MongoDB को डाउनलोड करने और प्रारंभ करने का प्रयास करेगा परीक्षण चलाते समय।
पैकेज प्रत्येक संस्करण के लिए केवल एक बार डाउनलोड किया जाएगा ताकि बाद के परीक्षण बहुत तेजी से चल सकें।
इस स्तर पर हमें नमूना 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");
}
}
जैसा कि हम देख सकते हैं, एम्बेडेड डेटाबेस स्वचालित रूप से स्प्रिंग द्वारा शुरू किया गया था, जिसे कंसोल में भी लॉग इन किया जाना चाहिए:
...Starting MongodbExampleApplicationTests on arroyo with PID 10413...
3.2. मैन्युअल कॉन्फ़िगरेशन परीक्षण
स्प्रिंग बूट स्वचालित रूप से एम्बेडेड डेटाबेस को प्रारंभ और कॉन्फ़िगर करेगा और फिर MongoTemplate . को इंजेक्ट करेगा हमारे लिए उदाहरण। हालांकि, कभी-कभी हमें एम्बेडेड Mongo डेटाबेस को मैन्युअल रूप से कॉन्फ़िगर करने की आवश्यकता हो सकती है (उदाहरण के लिए, किसी विशिष्ट DB संस्करण का परीक्षण करते समय)।
निम्नलिखित स्निपेट दिखाता है कि हम एम्बेडेड MongoDB इंस्टेंस को मैन्युअल रूप से कैसे कॉन्फ़िगर कर सकते हैं। यह मोटे तौर पर पिछले स्प्रिंग टेस्ट के बराबर है:
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");
}
}
ध्यान दें, कि हम जल्दी से MongoTemplate बना सकते हैं बीन को हमारे मैन्युअल रूप से कॉन्फ़िगर किए गए एम्बेडेड डेटाबेस का उपयोग करने के लिए कॉन्फ़िगर किया गया है और इसे केवल बनाकर स्प्रिंग कंटेनर के अंदर पंजीकृत किया गया है, उदाहरण के लिए, एक @TestConfiguration @Bean . के साथ वह तरीका जो नया MongoTemplate(MongoClients.create(connectionString, “test”) लौटाएगा ।
अधिक उदाहरण आधिकारिक Flapdoodle के GitHub रिपॉजिटरी पर पाए जा सकते हैं।
3.3. लॉगिंग
हम इन दो गुणों को src/test/resources/application.propertes में जोड़कर एकीकरण परीक्षण चलाते समय MongoDB के लिए लॉगिंग संदेशों को कॉन्फ़िगर कर सकते हैं। फ़ाइल:
logging.level.org.springframework.boot.autoconfigure.mongo.embedded
logging.level.org.mongodb
उदाहरण के लिए, लॉगिंग को अक्षम करने के लिए, हम केवल मानों को बंद . पर सेट करते हैं :
logging.level.org.springframework.boot.autoconfigure.mongo.embedded=off
logging.level.org.mongodb=off
3.4. उत्पादन पर वास्तविक डेटाबेस का उपयोग करना
चूंकि हमने de.flapdoodle.embed.mongo . को जोड़ा है
परीक्षणों के बाहर एक एम्बेडेड डीबी का उपयोग करने के लिए, हम स्प्रिंग प्रोफाइल का उपयोग कर सकते हैं जो सही MongoClient पंजीकृत करेगा। (एम्बेडेड या प्रोडक्शन) सक्रिय प्रोफ़ाइल के आधार पर।
हमें उत्पादन निर्भरता के दायरे को
4. अंतःस्थापित परीक्षण विवाद
एम्बेडेड डेटाबेस का उपयोग करना शुरुआत में एक महान विचार की तरह लग सकता है। वास्तव में, यह एक अच्छा तरीका है जब हम यह जांचना चाहते हैं कि क्या हमारा आवेदन इस तरह के क्षेत्रों में सही ढंग से व्यवहार करता है:
- ऑब्जेक्ट<->दस्तावेज़ मैपिंग कॉन्फ़िगरेशन
- कस्टम हठ जीवनचक्र घटना श्रोता (सारमोंगोइवेंट लिस्टनर देखें) )
- दृढ़ता परत के साथ सीधे काम करने वाले किसी भी कोड का तर्क
दुर्भाग्य से, एम्बेडेड सर्वर का उपयोग करने को "पूर्ण एकीकरण परीक्षण" नहीं माना जा सकता है . Flapdoodle का एम्बेडेड MongoDB एक आधिकारिक MongoDB उत्पाद नहीं है। इसलिए, हम यह सुनिश्चित नहीं कर सकते हैं कि यह ठीक वैसा ही व्यवहार करता है जैसा कि उत्पादन परिवेश में होता है।
यदि हम जितना संभव हो सके उत्पादन के करीब वातावरण में संचार परीक्षण चलाना चाहते हैं, तो एक बेहतर उपाय यह है कि डॉकर जैसे पर्यावरण कंटेनर का उपयोग किया जाए।
डॉकर के बारे में और जानने के लिए, हमारे पिछले लेख को यहां पढ़ें।