Django में यूनिट परीक्षण


12

मैं वास्तव में एक बड़ी Django परियोजना के लिए प्रभावी इकाई परीक्षण लिखने के लिए संघर्ष कर रहा हूं। मेरे पास यथोचित परीक्षण कवरेज है, लेकिन मुझे पता चला है कि जो परीक्षण मैं लिख रहा हूं, वे निश्चित रूप से एकीकरण / स्वीकृति परीक्षण हैं, इकाई परीक्षण बिल्कुल नहीं हैं, और मेरे पास मेरे आवेदन के महत्वपूर्ण हिस्से हैं जो प्रभावी रूप से परीक्षण नहीं कर रहे हैं। मैं इस ASAP को ठीक करना चाहता हूं।

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

def summary(self, startTime=None, endTime=None):
    # ... logic to assign a proper start and end time 
    # if none was provided, probably using datetime.now()

    objects = self.related_model_set.manager_method.filter(...)

    return sum(object.key_method(startTime, endTime) for object in objects)

एक दृष्टिकोण कुछ इस तरह का परीक्षण कैसे करता है?

यहां मैं अब तक कहां हूं। यह मेरे लिए होता है कि इकाई परीक्षण उद्देश्य को उसके तर्कों पर कुछ मज़ाकिया व्यवहार दिया जाना चाहिए , क्या सही परिणाम उत्पन्न करने के लिए फ़िल्टरिंग / एग्रीगेटिंग सही है?by key_methodsummary

Mocking datetime.now () सीधा सीधा पर्याप्त है, लेकिन मैं बाकी व्यवहार का कैसे मजाक उड़ा सकता हूं?

  • मैं जुड़नार का उपयोग कर सकता हूं, लेकिन मैंने अपने डेटा के निर्माण के लिए जुड़नार का उपयोग करने के पेशेवरों और विपक्षों को सुना है (खराब रखरखाव एक शंकु है जो मेरे लिए घर हिट करता है)।
  • मैं अपने डेटा को ORM के माध्यम से भी सेट कर सकता था, लेकिन यह सीमित हो सकता है, क्योंकि तब मुझे संबंधित ऑब्जेक्ट भी बनाने होंगे। और ORM आपको auto_now_addमैन्युअल रूप से फ़ील्ड के साथ गड़बड़ नहीं करने देता है ।
  • ओआरएम को मॉक करना एक और विकल्प है, लेकिन न केवल ओआरएम विधियों का गहरा मजाक उड़ाना मुश्किल है, बल्कि ओआरएम कोड में तर्क का परीक्षण से बाहर हो जाना, और नकली का परीक्षण वास्तव में आंतरिक और निर्भरता पर निर्भर करता है। समारोह-अंडर-परीक्षण।

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


आपको यूनिट टेस्ट पहले से लिखना चाहिए, इससे आपको वास्तविक उत्पादन कोड लिखे जाने से पहले अपने डिजाइन में परीक्षण क्षमता की समस्याओं का पता लगाने में मदद मिलती है।
चेड्डी २१४ ९

2
यह मददगार है, लेकिन वास्तव में इस बात को संबोधित नहीं करता है कि कैसे स्वाभाविक रूप से राज्य के लिए सबसे अच्छा परीक्षण, ORM- भारी एप्लिकेशन।
अजय

आपको दृढ़ता की परत को दूर करना होगा
Chedy2149

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

इसे चेक करें: vimeo.com/43612849 और यह: vimeo.com/15007792
Chedy2149

जवाबों:


6

मैं आगे बढ़ने जा रहा हूं और अब तक जो कुछ भी आया हूं उसके लिए जवाब दर्ज करूंगा।

मेरी परिकल्पना यह है कि गहरी युग्मन और स्थिति के साथ एक फ़ंक्शन के लिए, वास्तविकता यह है कि यह बस इसके बाहरी संदर्भ को नियंत्रित करने के लिए बहुत सारी लाइनें लेने जा रहा है।

यहाँ मेरा परीक्षण मामला मोटे तौर पर मानक मॉक लाइब्रेरी पर निर्भर करता है:

  1. मैं घटनाओं के अनुक्रम को स्थापित करने के लिए मानक ORM का उपयोग करता हूं
  2. मैं अपनी शुरुआत बनाता हूं datetimeऔर auto_now_addअपने डिजाइन की एक निश्चित समयावधि को फिट करने के लिए समय को घटाता हूं। मैंने सोचा था कि ORM ने इसकी अनुमति नहीं दी थी, लेकिन यह ठीक काम करता है।
  3. मैं यह सुनिश्चित करता हूं कि फ़ंक्शन-अंडर-टेस्ट का उपयोग किया from datetime import datetimeजाए ताकि मैं datetime.now()बस उस फ़ंक्शन में पैच कर सकूं (यदि मैं पूरी datetimeकक्षा का मजाक उड़ाता हूं , तो ओआरएम एक फिट बैठता है)।
  4. मैं object.key_method()सरल, लेकिन अच्छी तरह से परिभाषित कार्यक्षमता के साथ अपना प्रतिस्थापन बनाता हूं जो तर्कों पर निर्भर करता है। मैं चाहता हूं कि यह तर्कों पर निर्भर हो, क्योंकि अन्यथा मुझे नहीं पता चल सकता है कि फ़ंक्शन-अंडर-टेस्ट का तर्क काम कर रहा है या नहीं। मेरे मामले में, यह केवल startTimeऔर के बीच सेकंड की संख्या देता है endTime। मैं इसे एक भेड़ के बच्चे में लपेटकर और सीधे object.key_method()के new_callableद्वार का उपयोग करके पैचिंग करता हूं patch
  5. अंत में, मैं summaryमॉक के दिए गए व्यवहार के लिए अपेक्षित हाथ-गणना परिणामों के साथ समानता की जांच करने के लिए विभिन्न तर्कों के साथ विभिन्न कॉल पर जोर देता हूं।key_method

कहने की जरूरत नहीं है, यह फ़ंक्शन की तुलना में काफी लंबा और अधिक जटिल है। यह DB पर निर्भर करता है, और वास्तव में एक इकाई परीक्षण की तरह महसूस नहीं करता है। लेकिन यह भी समारोह के आंतरिक से काफी हद तक decoupled है - बस अपने हस्ताक्षर और निर्भरता। इसलिए मुझे लगता है कि यह वास्तव में एक इकाई परीक्षण हो सकता है, फिर भी।

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

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