2009-08-04 10 views
5

मुझे कोड मिला है जहां assertRaises विफल होने पर assertRaises अपवाद फेंकता है। मैंने सोचा कि अगर assertRaises विफल रहता है तो परीक्षण विफल हो जाएगा और मुझे अंत में एक रिपोर्ट मिल जाएगी जो कहती है कि परीक्षण विफल रहा। मैं अपवाद को फेंकने की उम्मीद नहीं कर रहा था। नीचे मेरा कोड है। क्या मैं कुछ गलत कर रहा हूँ? मैं पायथन 2.6.2 का उपयोग कर रहा हूँ।पायथन unittest assertRaises अपवाद फेंकता है जब assertRaises विफल रहता है

import unittest 

class myClass: 

    def getName(self): 

     raise myExcOne, "my exception one" 
     #raise myExcTwo, "my exception two" 
     #return "a" 

class myExcOne(Exception): 
    "exception one" 

class myExcTwo(Exception): 
    "exception two" 


class test_myClass(unittest.TestCase): 

    def setUp(self): 

     self.myClass = myClass() 

    def testgetNameEmpty(self): 
     #self.assertRaises(myExcOne,self.myClass.getName) 
     #self.assertRaises(myExcTwo,self.myClass.getName) 

     try: 
      self.assertRaises(myExcTwo,self.myClass.getName) 
     except Exception as e: 
      pass 

if __name__ == "__main__": 

    #unittest.main() 

    suite = unittest.TestLoader().loadTestsFromTestCase(test_myClass) 
    unittest.TextTestRunner(verbosity=2).run(suite) 
+0

'असफल विफलताओं' से आपका विशेष अर्थ क्या है? क्या आप एक स्टैकट्रैक या त्रुटि संदेश पोस्ट कर सकते हैं? –

+0

मैं दस्तावेज़ को फिर से पढ़ता हूं और अपवाद फेंकता हूं जब assertRaises विफल रहता है अपेक्षित व्यवहार है। मैं गलत समझता हूं कि उपकरण कैसे काम करता है। मैं पिछले पोस्ट में इसका उल्लेख करना भूल गया था। अगर मैं अपवाद पकड़ता हूं, तो रिपोर्ट मुझे बताती है कि परीक्षा उत्तीर्ण होने के बावजूद पारित हुई। मैंने –

उत्तर

6

पोस्ट किया गया कोड गलत है। शुरुआत के लिए, class myClass(): shoudl class myClass: हो। इसके अलावा if name == "main": होना चाहिए: इन समस्याओं से

if __name__ == "__main__": 
    unittest.main() 

अलावा, इस विफल रहता है क्योंकि getName() अपवाद myExcOne बढ़ा रहा है और अपने परीक्षण अपवाद myExcTwo की उम्मीद है।

यहां कुछ कोड है जो काम करता है। कृपया अपने प्रश्न में कोड संपादित करें ताकि यह आसान है हमें कटौती और यह एक अजगर सत्र में पेस्ट करने के लिए: एक class बयान में classname के बाद

import unittest 

class myExcOne(Exception): "exception one" 

class myExcTwo(Exception): "exception two" 

class myClass: 
    def getName(self): 
     raise myExcTwo 

class test_myClass(unittest.TestCase): 
    def setUp(self): 
     self.myClass = myClass() 
    def testgetNameEmpty(self): 
     #self.assertRaises(myExcOne,self.myClass.getName) 
     self.assertRaises(myExcTwo,self.myClass.getName) 

if __name__ == "__main__": 
    unittest.main() 
+0

पर मेरा कोड अपडेट किया है हाय mhawke, __main__ कॉपी और पेस्ट प्रक्रिया में गड़बड़ हो गया। MyClass() के लिए, मूल वर्ग विरासत में मिला, इसलिए जब मैंने छोटा टेस्टकेस बनाया तो मैं() को हटाना भूल गया। परीक्षण विफल होना चाहिए। मैं समझने की कोशिश कर रहा हूं कि एक assert विफल होने पर उपकरण कैसे व्यवहार करता है। मेरी मूल पोस्ट के लिए, मुझे गलत समझा जाता है कि अगर कोई असफल असफल हो जाता है तो टूल को अपवाद फेंकना चाहिए। मैंने अपवाद को पकड़ने के लिए कोड अपडेट किया है और इसके साथ कुछ भी नहीं किया है। भले ही जोर विफल हो जाए, रिपोर्ट कहती है कि यह पारित हो गया। ब्रायन –

5

एक अलग रूप से शुरू होने वाले () आधुनिक में पूरी तरह से सही है पायथन - बिल्कुल कोई त्रुटि नहीं।

मुद्दे के मांस पर, assertRaises(MyException, foo)foo() जिसका प्रकार MyException का एक उपवर्ग नहीं है बुला द्वारा उठाए गए अपवाद का प्रचार करने से प्रलेखित है - यह केवल MyException और उपवर्गों उसके फैल जाती है। चूंकि आपका कोड एक प्रकार का अपवाद उठाता है और आपका परीक्षण एक अलग असंबद्ध प्रकार में से एक की अपेक्षा करता है, तो unittest मॉड्यूल,के दस्तावेज़ों के अनुसार, उठाया अपवाद प्रचारित होगा, और मैं उद्धृत करता हूं: "अपवाद उठाए जाने पर परीक्षा उत्तीर्ण होती है, अगर कोई अपवाद उठाया जाता है तो कोई त्रुटि होती है, या कोई अपवाद नहीं उठाया जाता है, तो विफल रहता है "- और" एक त्रुटि है "मतलब" अन्य अपवाद का प्रचार करता है "।

जैसे ही आप अपने प्रयास/ब्लॉक को छोड़कर अपवाद को पकड़ते हैं, तो आप त्रुटि को रद्द कर देते हैं, और निदान के लिए सबसे कम से कम कुछ भी नहीं बचा है। यदि आपका उद्देश्य इस त्रुटि को विफलता (एक बहस योग्य रणनीति ...) में बदलना है, तो आपके except ब्लॉक को self.fail पर कॉल करना चाहिए।

+0

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

+0

सभी testmethods सामान्य इकाई-परीक्षण धावक (unittest.main) के साथ सभी परीक्षण विधि चलाते हैं और त्रुटि त्रुटियों (ई) और विफलताओं (एफ) [जो विशेष अपवादों द्वारा निदान किए जाते हैं) रिपोर्ट करते हैं - मुझे यह हैरान है कि TextTestRunner व्यवहार करता है आपके लिए अलग-अलग, क्योंकि यह वही है जो unittest.main उपयोग करता है (unittest.TestProgram क्लास के माध्यम से), स्रोतों की जांच करें ... आपको अपेक्षित परिणाम w/unittest.main मिलते हैं, है ना? –

+0

यदि मैं ब्लॉक/असम्बद्धता तो यह मेरा डीबगर है जो निष्पादन को रोक रहा है। मैंने एक कमांड लाइन से प्रोग्राम चलाया, यह सभी परीक्षणों में भाग गया और मुझे अपेक्षित परिणाम दिए। यह वही है जिसे मैं देख रहा था। लेकिन अगर मैं कोड को चलाता हूं क्योंकि यह ऊपर सूचीबद्ध है, तो यह मुझे बताता है कि यह असफल होने के बावजूद गुजरता है। मैं इसके बारे में चिंतित नहीं हूं क्योंकि कमांड लाइन से इकाई परीक्षण चलाने से मुझे वह चाहिए जो मैं चाहता हूं। आपकी मदद के लिए पुनः शुक्रिया। –

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