2009-06-15 12 views
10

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

मेरे पास एक कक्षा है, और __init__ विधि में मैं खराब तर्कों की जांच करने के लिए कुछ दावे कर रहा हूं। मैं एक अनजान बनाना चाहता हूं जो नए उदाहरण बनाते समय ऐसे AssertionError के लिए जांच करता है।

अनजान मॉड्यूल में, कोई कॉल करने योग्य होने पर विशिष्ट अपवाद के लिए (assertRaises के साथ) परीक्षण कर सकता है, लेकिन जाहिर है कि कक्षा के तरीकों पर लागू होगा। कन्स्ट्रक्टर के लिए ऐसे परीक्षण को चलाने का सही तरीका क्या है?

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

उत्तर

1

ठीक है, शुरुआत के रूप में, खराब तर्कों की जांच करना अजगर में एक अच्छा विचार नहीं है। पाइथन एक कारण के लिए गतिशील रूप से मजबूत टाइप किया गया है।

आपको यह मानना ​​चाहिए कि तर्क अच्छे तर्क हैं। आप अपने वर्ग के उपयोगकर्ताओं के इरादे को कभी नहीं जानते हैं, इसलिए अच्छे तर्कों की जांच करके अधिक सामान्य उदाहरणों में अपनी कक्षा के उपयोग को सीमित करने का एक तरीका है।

बजाय एक अच्छा एपीआई परिभाषित करें और दस्तावेज़ों और टेक्स्ट का उपयोग करके इसे बहुत अच्छी तरह से दस्तावेज़ करें, और उपयोगकर्ता को स्वचालित रूप से खराब तर्कों की त्रुटियों को छोड़ दें।

उदाहरण:

def sum_two_values(value_a, value_b): 
    return value_a + value_b 

ठीक है, इस उदाहरण बेवकूफ है, लेकिन अगर मैं जाँच करें और पूर्णांक के रूप में मूल्य पर जोर, समारोह तैरता है, तार, सूची के साथ काम नहीं करेगा, के अलावा अन्य किसी कारण के लिए मेरी जांचें, तो पहली जगह क्यों जांचें? यह स्वचालित रूप से उन प्रकारों से असफल हो जाएगा जो यह काम नहीं करेंगे, इसलिए आपको चिंता करने की ज़रूरत नहीं है।

+0

ठीक है, मेरे विशेष मामले में मैं यह कहना चाहूंगा कि कुछ गलत हो गया है, क्योंकि बाद में मैं कुछ सी पुस्तकालयों को सीटीपीएस के साथ लोड करता हूं और उन्हें रचनाकार से तर्क प्राप्त करना पड़ता है ... –

+0

@asen_asenov: उस मामले में , बस उचित परिवर्तन के साथ अपने ctypes कॉल लपेटें ctypes.c_int (परम)। यह सुनिश्चित करेगा कि प्रकार संगत है और आपके लिए असंगत प्रकारों पर स्वचालित रूप से एक त्रुटि उत्पन्न करेगा; – nosklo

7

assertRaises के साथ गड़बड़ मत करो। यह बहुत जटिल है।

इस

class Test_Init(unittest.TestCase): 
    def test_something(self): 
     try: 
      x= Something("This Should Fail") 
      self.fail("Didn't raise AssertionError") 
     except AssertionError, e: 
      self.assertEquals("Expected Message", e.message) 
      self.assertEquals(args, e.args) 

किसी भी अन्य अपवाद एक साधारण परीक्षण त्रुटि हो जाएगा मत करो।

इसके अलावा, __init__ विधि में बहुत अधिक अप-फ्रंट त्रुटि जांच के साथ गड़बड़ न करें। अगर कोई गलत प्रकार का ऑब्जेक्ट प्रदान करता है, तो आपका कोड घटनाओं के सामान्य पाठ्यक्रम में विफल हो जाएगा और सामान्य माध्यमों के माध्यम से सामान्य अपवाद बढ़ाएगा। आपको ऑब्जेक्ट्स को "प्री-स्क्रीन" करने की ज़रूरत नहीं है।

+2

क्या आप "यह बहुत जटिल" पर विस्तार कर सकते हैं? मुझे 'assertRaises (assertionError, ...)' के साथ समस्याएं आ रही हैं (दावा किया गया है, लेकिन 'assertRaises' द्वारा पकड़ा नहीं गया है), और यह जानना दिलचस्प होगा कि क्यों ... – naught101

+0

अधिक परेशान, यह कोड नहीं करता वास्तव में AssertionErrors के साथ काम नहीं करते हैं, क्योंकि उनके पास 'संदेश' संपत्ति नहीं है (कम से कम पायथन 3 में)। – naught101

17

unittest मॉड्यूल में एक (assertRaises के साथ) विशिष्ट अपवाद के लिए जब एक प्रतिदेय कहा जाता है परीक्षण कर सकते हैं, लेकिन स्पष्ट रूप से उस वर्ग के तरीकों पर लागू होंगे। कन्स्ट्रक्टर के लिए ऐसे परीक्षण को चलाने का सही तरीका क्या है?

निर्माता अपने आप में एक प्रतिदेय है:

self.assertRaises(AssertionError, MyClass, arg1, arg2) 

कहा जा रहा है, मैं nosklo की और तर्क का प्रकार की जाँच करने के बारे में S.Lott की चिंताओं को प्रतिध्वनित करने के लिए चाहते हैं। इसके अलावा, आपको फ़ंक्शन तर्कों की जांच करने के लिए दावे का उपयोग नहीं करना चाहिए: दावा संवेदना जांच के रूप में सबसे उपयोगी हैं जो आपके कोड के साथ आंतरिक रूप से गलत होने तक ट्रिगर नहीं होंगे।साथ ही, जब पाइथन "अनुकूलित" -O मोड में चलाया जाता है, तो जोरदार कथन संकलित किए जाते हैं। अगर किसी फ़ंक्शन को अपने तर्कों की जांच करने की आवश्यकता होती है, तो उसे उचित अपवाद उठाना चाहिए।

+1

-1: तर्क जांचने का एक शानदार तरीका है। बहुत छोटा कोड: जोर दें <

+0

मुझे लगता है कि राय की बात है, तो। – Miles

0

S.Lott के उत्तर गलत है: self.fail() ही एक अपवाद है, जो तब निम्न पंक्ति में अपवाद की वजह से हो जाएगा को जन्म देती है:

class NetworkConfigTest1(unittest.TestCase): 
    def runTest(self): 
     try: 
      NetworkConfig("192.168.256.0/24") 
      self.fail("Exception expected but not thrown") 
     except Exception, error: 
      printf("Exception caught: %s" % str(error) 
      pass 

उत्पादन था "अपवाद की उम्मीद है, लेकिन नहीं फेंका", लेकिन इकाई परीक्षण को विफलता के रूप में चिह्नित नहीं किया गया था, भले ही कोड का परीक्षण नहीं किया गया था! यदि एक विधि को जन्म देती है एक अपवाद उपयोग करने के लिए किया जाएगा

एक अधिक मान्य तरीका जाँच करने के लिए:

self.failUnlessRaises([error], [callable], [arguments to callable]) 

मेरे मामले में, वर्ग मैं परीक्षण NetworkConfig कहा जाता है, और निर्माता एक अपवाद है, तो फेंक चाहिए नेटवर्क डिस्क्रिप्टर अमान्य है। और क्या काम किया गया है:

class NetworkConfigTest1(unittest.TestCase): 
    def runTest(self): 
     self.failUnlessRaises(Exception, NetworkConfig, "192.168.256.0/24") 

यह वांछित काम करता है और सही परीक्षण करता है।

2

पता नहीं है इस में मदद करता है, लेकिन एक समस्या मैं हो रही थी इस प्रकार है:

self.assertRaises(Exception, MyFunction()) 

समस्या मैं सिर्फ MyFunction गुजर रहा था नहीं, लेकिन यह रूप में अच्छी तरह बुला, एक असफल और अपवाद है, जिसके परिणामस्वरूप है उठाया जा रहा है। Myfunction एक बहस की उम्मीद है, और मैं कुछ भी नहीं में पारित हो जाता है, तो इसे विफल करना चाहते हैं मुझे थोड़ी देर के लिए हताश होकर जब तक मैं यह पता लगा:।

self.assertRaises(Exception, MyFunction) 

वर्क्स अपेक्षा के अनुरूप।

संबंधित मुद्दे