इसलिए मैंने H2 PosgreSQL संगतता मोड का उपयोग करने के बारे में सोचा, यह सोचकर कि सभी पोस्टग्रेज़ प्रश्न H2 पर काम करेंगे, कृपया मुझे गलत होने पर सुधारें
मुझे डर है कि यह सच नहीं है।
H2 PostgreSQL सिंटैक्स का अनुकरण करने और कुछ सुविधाओं और एक्सटेंशन का समर्थन करने का प्रयास करता है। यह PostgreSQL के व्यवहार के लिए कभी भी पूर्ण मिलान नहीं होगा, और सभी सुविधाओं का समर्थन नहीं करता है।
आपके पास एकमात्र विकल्प हैं:
- परीक्षण में PostgreSQL का प्रयोग करें; या
- H2 द्वारा समर्थित सुविधाओं का उपयोग करना बंद करें
मैं परीक्षण के लिए पीजी का उपयोग करने का सुझाव देता हूं। एक परीक्षण हार्नेस लिखना अपेक्षाकृत सरल है जो initdb एक पोस्टग्रेज इंस्टेंस है और इसे परीक्षण के लिए लॉन्च करता है और बाद में इसे फाड़ देता है।
टिप्पणियों के आधार पर अपडेट करें:
"इकाई" और "एकीकरण" परीक्षणों के बीच कोई कठोर रेखा नहीं है। इस मामले में, H2 एक बाहरी घटक भी है। शुद्धतावादी इकाई परीक्षणों में परीक्षण हार्नेस के भाग के रूप में प्रश्नों के लिए एक डमी उत्तरदाता होगा। H2 के खिलाफ परीक्षण उतना ही "एकीकरण" परीक्षण है जितना कि PostgreSQL के खिलाफ परीक्षण। तथ्य यह है कि यह इन-प्रोसेस और इन-मेमोरी एक सुविधा है, लेकिन कार्यात्मक रूप से महत्वपूर्ण नहीं है।
यदि आप इकाई परीक्षण करना चाहते हैं आपको अपने "PostgreSQL", "SybaseIQ", आदि लक्ष्यों के साथ जाने के लिए अपने ऐप के लिए एक और डेटाबेस लक्ष्य लिखना चाहिए। इसे कॉल करें, कहें, "मॉकडेटाबेस"। यह केवल अपेक्षित परिणामों को प्रश्नों से वापस करना चाहिए। यह वास्तव में प्रश्नों को नहीं चलाता है, यह केवल शेष कोड के व्यवहार का परीक्षण करने के लिए मौजूद है।
व्यक्तिगत रूप से, मुझे लगता है कि यह समय की एक बड़ी बर्बादी है, लेकिन टेस्ट हार्नेस में बाहरी निर्भरता को शुरू करने से बचने के लिए एक यूनिट परीक्षण शुद्धतावादी यही करेगा।
यदि आप अपने DB घटकों के लिए इकाई (एकीकरण के विपरीत) परीक्षण करने पर जोर देते हैं, लेकिन नकली इंटरफ़ेस नहीं लिख सकते/नहीं लिख सकते हैं, तो आपको इसके बजाय मौजूदा एक का उपयोग करने का एक तरीका खोजना होगा। H2 इसके लिए एक उचित उम्मीदवार होगा - लेकिन आपको प्रश्नों के एक नए सेट के साथ एक नया बैकएंड लिखना होगा जो H2 के लिए काम करता है, आप केवल अपने PostgreSQL बैकएंड का पुन:उपयोग नहीं कर सकते। जैसा कि हम पहले ही स्थापित कर चुके हैं, H2 उन सभी सुविधाओं का समर्थन नहीं करता है जिन्हें आपको PostgreSQL के साथ उपयोग करने की आवश्यकता है, इसलिए आपको H2 के साथ समान काम करने के लिए अलग-अलग तरीके खोजने होंगे। एक विकल्प यह होगा कि "अपेक्षित" परिणामों और सरल प्रश्नों के साथ एक साधारण H2 डेटाबेस बनाया जाए जो वास्तविक एप्लिकेशन की स्कीमा को पूरी तरह से अनदेखा करते हुए उन परिणामों को वापस कर दे। यहां केवल वास्तविक नकारात्मक पक्ष यह है कि इसे बनाए रखने के लिए एक बड़ा दर्द हो सकता है ... लेकिन यह इकाई परीक्षण है।
व्यक्तिगत रूप से, मैं सिर्फ PostgreSQL के साथ परीक्षण करूंगा। जब तक मैं अलग-अलग वर्गों या मॉड्यूल का परीक्षण नहीं कर रहा हूं जो संकीर्ण-इंटरफेस वाली अच्छी तरह से परिभाषित इकाइयों के रूप में अकेले खड़े हैं, मुझे परवाह नहीं है कि कोई इसे "इकाई" या "एकीकरण" परीक्षण कहता है या नहीं। मैं डेटा सत्यापन कक्षाओं का परीक्षण करूँगा, कहूँगा। डेटाबेस इंटरफ़ेस कोड के लिए शुद्धतावादी इकाई परीक्षण बहुत कम समझ में आता है और मैं केवल एकीकरण परीक्षण करूँगा।
जबकि इन-प्रोसेस इन-मेमोरी डेटाबेस उसके लिए सुविधाजनक है, इसकी आवश्यकता नहीं है। आप अपना टेस्ट हार्नेस लिख सकते हैं ताकि सेटअप कोड initdb
एक नया PostgreSQL है और इसे लॉन्च करता है; फिर टियरडाउन कोड पोस्टमास्टर को मार देता है और डेटादिर को हटा देता है। मैंने इसके बारे में इस उत्तर में और लिखा है।
यह भी देखें:
- केवल मेमोरी में PostgreSQL चलाना
के लिए:
<ब्लॉकक्वॉट>यदि अपेक्षित अंत डेटासेट वाले सभी प्रश्न पोस्टग्रेस में ठीक काम करते हैं तो मैं मान सकता हूं कि यह अन्य सभी डीबीएस में ठीक काम करेगा
अगर मैं आपकी बात को सही ढंग से समझ पा रहा हूँ तो हाँ, ऐसा ही है - यदि आपका शेष कोड PostgreSQL के डेटासेट के साथ काम करता है, इसे आम तौर पर दूसरे डेटाबेस से समान डेटा वाले डेटासेट के साथ समान रूप से काम करना चाहिए। जब तक यह साधारण डेटा प्रकारों का उपयोग कर रहा है, न कि डेटाबेस विशिष्ट सुविधाओं का।