Magento 1.9 में यूनिट परीक्षणों के लिए सबसे अच्छा अभ्यास


11

मैं कई कस्टम मॉड्यूल के साथ एक Magento 1.9 साइट बनाए रखता हूं। कुछ कार्यक्षमता व्यावसायिक महत्वपूर्ण है और कुछ यूनिट परीक्षणों की सख्त आवश्यकता है। जैसे एक यूनिट मूल्य कैलकुलेटर।

मैं आमतौर पर सिम्फनी में विकसित होता हूं और वास्तव में किसी भी तरह से PHPUnit (w / संगीतकार) का उपयोग करना पसंद करूंगा।

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

इसलिए मैं कुछ यूनिट परीक्षणों को लिखने के लिए सर्वोत्तम अभ्यास दृष्टिकोण की तलाश कर रहा हूं। मैं glady ट्यूटोरियल या कुछ इसी तरह स्वीकार करेंगे। किसी भी मदद की सराहना की है।

जवाबों:


10

मैं थोड़ी देर पहले उसी समस्या का सामना कर रहा था।

मैंने Ecomdev PHPUnit मॉड्यूल का उपयोग करने पर विचार किया, लेकिन मुझे इसका उपयोग करना मुश्किल है और खराब तरीके से प्रलेखित है (लेकिन मुझे अभी भी प्यार है कि इवान क्या करता है और मैगनेटो पारिस्थितिकी तंत्र में उसका महान योगदान है)।

इसलिए, विनय की मदद से, मैंने निम्नलिखित परीक्षण ढांचे के मॉड्यूल का विकास किया: https://github.com/digitalpianism/testframework

मूल उद्देश्य एकीकरण परीक्षणों के लिए था, लेकिन मैं इसका उपयोग इकाई परीक्षणों के लिए भी कर रहा हूं। आप इसे यहां क्रिया में देख सकते हैं: https://github.com/digitalpianism/easytoplinks/blob/master/app/code/community/DigitalPianism/EasyToplinks/Test/Unit/Block/Page/Template/LinksTest.php।

जुड़नार के बारे में, मैं डेटाबेस में नमूना डेटा बनाने से बचने के लिए लेन-देन रोलबैक का उपयोग कर रहा हूं।


यह वास्तव में आशाजनक लगता है। मैं इसे आज़माऊँगा। धन्यवाद।
फ्रिज

13

स्थापना

के बाद से Magento 1 बॉक्स से बाहर संगीतकार का उपयोग नहीं करता, मुझे नहीं लगता कि अगर आप संगीतकार का उपयोग कर PHPUnit स्थापित करने या सिर्फ डाउनलोड यह एक बड़ा फर्क नहीं पड़ता है phar संस्करण।
यदि आप पहले से ही अपनी साइट में अन्य तीसरे पक्ष के मॉड्यूल या पुस्तकालयों का प्रबंधन करने के लिए संगीतकार का उपयोग करते हैं, तो संगीतकार शायद सबसे अधिक समझ में आता है। जब तक आप PHP7 का उपयोग नहीं करते तब तक आप फ़पुनिट के एक पुराने संस्करण तक सीमित रहेंगे (हालांकि यही कारण है कि मैं ऊपर 4.8 संस्करण से जुड़ा हुआ हूं)।

एकीकरण टेस्ट बनाम / और / या यूनिट टेस्ट

चूंकि Magento 1 इतना भारी वजन अनुप्रयोग है, इसलिए यह फ़्यूपुनिट बूटस्ट्रैप को एकीकरण के लिए एक और इकाई परीक्षणों में से एक में अलग करने के लिए समझ में आता है।
यूनिट टेस्ट बूटस्ट्रैप को केवल ऑटोलैडर को इनिशियलाइज़ करने की आवश्यकता होती है, जबकि इंटीग्रेशन टेस्ट बूटस्ट्रैप को कॉन्फ़िगरेशन लोडिंग और डीबी कनेक्शन सहित पूरे एप्लिकेशन वातावरण को इनिशियलाइज़ करने की आवश्यकता होती है।
क्योंकि Magento में एकीकरण परीक्षण बहुत धीमी गति से चलाने के लिए इकाई परीक्षण (और भी अधिक तब अन्य अनुप्रयोगों में) करते हैं।

बूटस्ट्रैपिंग मैगेंटो को फ़पुनिट में

  • Magento के ऑटोलॉडेर PSR-0 के अनुरूप नहीं है क्योंकि यह एक अपवाद को फेंकता है यदि वह उस फ़ाइल को नहीं ढूंढ सकता है जो एक कक्षा में स्थित है। यह class_existsphpunit के कुछ उपयोगों को तोड़ता है। कई संभव (अगर हैडी) वर्कअराउंड हैं:

    • Magento के ऑटोलैडर को अपंजीकृत करें, \Varien_Autoload::autoload()एक डेकोरेटर में लपेटकर अपवादों को नजरअंदाज कर दिया जाए और रैपर को नए ऑटोलैडर के रूप में पंजीकृत किया जाए। यह तीसरे पक्ष के पुस्तकालयों के साथ संघर्ष की कम संभावना है जो ऑटोलॉजिस्ट को पंजीकृत करते हैं और एक विशिष्ट ऑटोलैडर आदेश पर निर्भर करते हैं।
    • Magento में निर्मित एक को लपेटने वाले कस्टम त्रुटि हैंडलर का उपयोग करें। 1. कस्टम त्रुटि हैंडलर Magento के ऑटोलैडर द्वारा ट्रिगर की गई त्रुटियों को निगल लेता है। यह वह समाधान है जो राफेल के परीक्षण ढांचे का उपयोग करता है । यह अन्य तृतीय पक्ष एक्सटेंशन के साथ सबसे अधिक संगत लगता है।
    • \Varien_Autoload::autoload()यदि फ़ाइल मौजूद नहीं है, तो त्रुटि को न फेंकने के लिए शामिल करने के लिए पथ हैक शामिल करें का उपयोग करें । यह हालांकि कई मॉड्यूल के साथ संघर्ष करता है जो एक ही वर्ग को भी ओवरराइड करता है। मैं स्वयं इस दृष्टिकोण का उपयोग नहीं करता हूं।
  • केवल $_SESSON = []बूटस्ट्रैप में सेट किए गए परीक्षणों के दौरान शुरू होने वाले सत्र से त्रुटियों से बचने के लिए ।

  • इसके माध्यम से एक कस्टम रिस्पांस ऑब्जेक्ट सेट करें Mage::app()->setResponse($testResponse)जो वास्तविक को बढ़ाता है लेकिन आउटपुट या हेडर नहीं भेजता है।

  • एकीकरण परीक्षणों के बीच मैगेंटो को फिर से संगठित करने के लिए जो रनटाइम स्थिति को पूरी तरह से बदल देते हैं, उपयोग करें Mage::reset(); Mage::app()। ध्यान दें कि उसके बाद त्रुटि हैंडलर को फिर से सजाना होगा।

फिक्स्चर

डीबी जुड़नार के लिए मैं जुड़नार बनाने के लिए नियमित मॉडल का उपयोग करने के लिए जुड़नार का उपयोग करता हूं, जैसे createSimpleProduct($sku)। जैसा कि राफेल ने कहा, परीक्षण में परीक्षण का उपयोग करें setUp()और tearDown()उसे लपेटें जो परीक्षण के बाद वापस मिल जाता है (उदाहरण के लिए Mage::getSingleton('core/resource')->getConnection('default_setup')->beginTransaction())।

स्टोर कॉन्फ़िगरेशन जुड़नार के लिए, मैं केवल मेमोरी का उपयोग करके इन-मेमोरी सेट अप करने के लिए हूं Mage::app()->getStore()->setConfig($path, $value)

EcomDev_PHPUnitविस्तार भी YAML फ़ाइलों का उपयोग कर डीबी जुड़नार बनाने का विकल्प प्रदान करता है, लेकिन खुद के लिए मैं उन कठिन मॉडल वर्गों का उपयोग कर बनाई जुड़नार की तुलना में बनाए रखने के लिए लगता है। YMMV।

टेस्ट डबल्स

के माध्यम से बनाई गई वस्तुओं के लिए परीक्षण डबल्स को इंजेक्ट करने के लिए रजिस्ट्री का उपयोग किया जा सकता है Mage::getSingleton(), Mage::getResourceSingleton()और Mage::helper()
कुछ अन्य केंद्रीय वस्तुओं को Mage::app()(जैसे अनुरोध) पर सेट किया जा सकता है ।
के माध्यम से Mage::getModel()या Mage::getResourceModel()परीक्षण डबल्स के साथ बनाई गई कक्षाओं को बदलने के लिए , एक कस्टम कॉन्फ़िगरेशन ऑब्जेक्ट रैपर का उपयोग करना होगा। राफेल के परीक्षण ढांचे में इस उदाहरण को देखें कि इसे कैसे पूरा किया जा सकता है।

सारांश

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


मैंने कभी इसकी कोशिश नहीं की लेकिन मैगेंटो टेस्ट फ्रेमवर्क का उपयोग क्यों नहीं किया? ( docs.magento.com/m1/ce/user_guide/magento/… )
Fra

3
हां, मैंने इसकी कोशिश की है, लेकिन यह कार्यात्मक परीक्षण है (इकाई या एकीकरण नहीं), यह धीमा है, यह जटिल है और परीक्षण परतदार और भंगुर हैं। सब के सब मैं समय मैं इसे एक बेकार के साथ बिताया पर विचार किया।
विनय

@Vinai मैं इसकी देरी से जानता हूं, लेकिन आम तौर पर एक नियंत्रक में मॉडल और संग्रह के लिए कॉल होते हैं, जो परीक्षण करते समय हमें ज़रूरत नहीं होगी। मैं आपके परीक्षण ढांचे (DigitalPianism) का उपयोग कर रहा हूं, और वहां हम मॉडल का परीक्षण कर सकते हैं, लेकिन एक नियंत्रक कार्रवाई के लिए अनुरोध करते हुए, जो बदले में एक मॉडल का उपयोग करता है, मैं उस मॉडल / संग्रह कॉल का मजाक कैसे उड़ा सकता हूं?
arqam
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.