डेटाबेस के साथ काम करते समय OO और टेस्टेबल बने रहना


16

एक डेटाबेस के साथ काम करने के लिए कुछ ओओपी रणनीति क्या हैं लेकिन चीजों को परीक्षण योग्य बनाए रखना? मान लें कि मेरे पास एक उपयोगकर्ता वर्ग है और मेरा उत्पादन वातावरण MySQL के खिलाफ काम करता है। मुझे कुछ संभावित दृष्टिकोण दिखाई दे रहे हैं, जिन्हें PHP का उपयोग करके दिखाया गया है:

  1. के लिए इंटरफेस के साथ एक $ DATA_SOURCE पास करें load()और save()डेटा की सार बैकएंड स्रोत के लिए। परीक्षण करते समय, एक अलग डेटा स्टोर पास करें।

    $ उपयोगकर्ता = नया उपयोगकर्ता ($ mysql_data_source);
    $ उपयोगकर्ता-> लोड ('बॉब');
    $ उपयोगकर्ता-> setNickname ('रॉबी');
    $ उपयोगकर्ता-> सहेजें ();
    
  2. एक कारखाने का उपयोग करें जो डेटाबेस तक पहुंचता है और उपयोगकर्ता के निर्माता को परिणाम पंक्ति से गुजरता है। परीक्षण करते समय, मैन्युअल रूप से $ पंक्ति पैरामीटर उत्पन्न करें, या UserFactory :: $ data_source में ऑब्जेक्ट को मॉक करें। (मैं रिकॉर्ड में परिवर्तन कैसे बचा सकता हूं?)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

मेरे पास यहाँ डिज़ाइन पैटर्न और क्लीन कोड है, लेकिन मैं लागू अवधारणाओं को खोजने के लिए संघर्ष कर रहा हूँ।


जवाबों:


11

तो आप क्या चुनना चाहते हैं मार्टिन फाउलर्स के पैटर्न ऑफ एंटरप्राइज एप्लीकेशन आर्किटेक्चर (वह यहां अपनी वेबसाइट पर एक कैटलॉग भी प्रदान करता है )।

इसमें वह डेटा एक्सेस को अमूर्त करने के लिए कई पैटर्न का वर्णन करता है। आपके द्वारा वर्णित पहला दृष्टिकोण सक्रिय रिकॉर्ड है । आपका दूसरा दृष्टिकोण टेबल डेटा गेटवे के समान है ।

एक बेहतर तरीका हाथ से डेटा एक्सेस कोड लिखने की आवश्यकता को हटाने के लिए O / RM का उपयोग करना है। जब से हम Y2K के बारे में चिंतित थे, मैंने PHP का उपयोग नहीं किया, लेकिन विकिपीडिया आपके लिए विकल्पों की एक सूची है । मुझे नहीं पता कि क्या वे किसी भी अच्छे हैं। मैं आपको ओ / आरएम में देखने के लिए कुछ चीजें बता सकता हूं:

  • दृढ़ता अज्ञानता : डेटा एक्सेस रणनीति में भाग लेने के लिए ओ / आरएम को आपकी व्यावसायिक वस्तुओं को एक विशिष्ट इंटरफ़ेस / वर्ग से प्राप्त करने के लिए मजबूर नहीं करना चाहिए।
  • संबंध मानचित्रण : आपको अपनी वस्तुओं के बीच संबंधों को मैप करने में सक्षम होना चाहिए (एक ग्राहक के पास ऑर्डर, ऑर्डर में लाइन आइटम, लाइन आइटम का कोई उत्पाद आदि है)
  • Hierachical Mapping : आपको डेटाबेस के लिए श्रेणी हाइरेशीज़ को मैप करने में सक्षम होना चाहिए।
  • क्वेरी सिंटैक्स / मानदंड सहायता : आपको डेटाबेस के संदर्भ में अपनी वस्तुओं के संदर्भ में रन-टाइम पर एक क्वेरी बनाने में सक्षम होना चाहिए, और ओ / आरएम को डेटाबेस पर क्वेरी का अनुवाद और चलाना चाहिए। अतिरिक्त बिंदु यदि क्वेरी स्ट्रिंग के बजाय एक दृढ़ता से टाइप की गई श्रृंखला है।

विचार करने के लिए अन्य कारक हैं, लेकिन उनमें से कुछ सबसे महत्वपूर्ण हैं। उम्मीद है की यह मदद करेगा।


6

IMHO यह इस बात पर निर्भर करता है कि आप क्या परीक्षण करना चाहते हैं, यदि आप अपने व्यावसायिक तर्क का परीक्षण करना चाहते हैं तो आपको स्टब / मॉक ( मार्टिन फाउलर ) का उपयोग करना चाहिए ताकि आप डेटा का उपयोग कर सकें, इसलिए आपका पहला सुझाव अच्छी शुरुआत है। यह स्टैकओवरफ़्लो प्रश्न एक अच्छा सी # उदाहरण देता है (मैंने कुछ PHP नमूने खोजने की कोशिश की लेकिन कोई भी नहीं मिला)।

यदि आप अपने आप में डेटा एक्सेस का परीक्षण करना चाहते हैं तो इसे यूनिट परीक्षण नहीं बल्कि एकीकरण परीक्षण कहा जाता है। कुछ सामान्य मार्गदर्शन के लिए यहां पढ़ें , इस स्टैकओवरफ्लो प्रश्न में कुछ दिलचस्प लिंक भी हैं।

यदि आप अपने डेटाबेस में संग्रहीत कार्यविधि तर्क का परीक्षण करना चाहते हैं तो XUnit TestPattern को देखें

उम्मीद है की यह मदद करेगा


2

यह जरूरी नहीं कि एक तुरंत सहायक उत्तर है, लेकिन अगर आप वास्तव में डेटाबेस परीक्षण के बारे में चिंतित हैं, तो आपको यह देखना चाहिए कि यह रूबी में पटरियों पर कैसे किया जाता है। जहाँ तक मुझे पता है, किसी ने भी विषय को बेहतर या अधिक सहजता से कवर नहीं किया है।


2
रूबी ऑन रेल्स डिफ़ॉल्ट रूप से सक्रिय रिकॉर्ड पैटर्न को लागू करता है। साथ ही एक लिंक प्रदान करें: en.wikipedia.org/wiki/Active_record_pattern
Spoike

0

मैंने आपको इस तरह की समस्या के लिए सिम्फनी फ्रेमवर्क समाधान की जांच करने की सिफारिश की है। कार्यात्मक परीक्षणों के साथ इसका php OO फ्रेमवर्क सिम्फनी।

यहां एक लिंक दिया गया है , उन्होंने कुछ ऐसा इस्तेमाल किया है जिसके बारे में आप सोच रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.