2012-02-08 18 views
15

मैं पाइथन की unittest लाइब्रेरी का उपयोग कर रहा हूं और सभी परीक्षण सफल होते हैं, लेकिन मुझे अभी भी एक ट्रेसबैक मिल रहा है और मैं समझ नहीं पा रहा हूं कि मैं समस्या को कैसे ठीक कर सकता हूं।टेस्ट सफल होते हैं, फिर भी ट्रेसबैक

........ 
---------------------------------------------------------------------- 
Ran 8 tests in 0.020s 

OK 

Traceback (most recent call last): 
    File "C:\Users\Paul\Desktop\bloomfilter\test_bloomfilter.py", line 85, in <module> 
    unittest.main() 
    File "C:\Programming\PythonX86\Python27\lib\unittest\main.py", line 95, in __init__ 
    self.runTests() 
    File "C:\Programming\PythonX86\Python27\lib\unittest\main.py", line 231, in runTests 
    sys.exit(not self.result.wasSuccessful()) 
SystemExit: False 
>>> 
+1

क्या [यह] (http://stackoverflow.com/questions/79754/unittest-causing-sys-exit) किसी की सहायता करता है? [उदाहरण के लिए, बाहर निकलना = मुख्य पर गलत।) – DSM

उत्तर

13

ऐसा प्रतीत होता है कि आप पाइथन शेल में चल रहे हैं, जो आपके लिए अपवाद पकड़ता है ताकि आप डिबगिंग जारी रख सकें। आप कमांड लाइन, लाइन

sys.exit(not self.result.wasSuccessful()) 

0 की एक निकास कोड के साथ अपने कार्यक्रम से बाहर निकल गया होता है, जो सफलता को इंगित करता है से चल रहा था, तो (इस counterintuitive हो सकता है अगर आप से परिचित नहीं हैं कैसे कार्यक्रमों के साथ बातचीत शेल)। चूंकि आप दुभाषिया में चल रहे हैं, हालांकि, अपवाद पकड़ा गया है।

मैं सुझाव दूंगा कि आपके प्रोग्राम या आपके परीक्षणों में कुछ भी गलत नहीं है। Unittests ढांचे शायद इंटरैक्टिव चलाने की उम्मीद नहीं थी!

1

जो भी आप इन परीक्षणों को चलाने के लिए उपयोग कर रहे हैं, यह SystemExit अपवाद को पकड़ रहा है और ट्रेसबैक प्रिंट कर रहा है। जब आप अपवाद को पकड़ने वाले कोड को लिखते हैं, तो आपको उन अपवादों को पकड़ने के लिए सावधानी बरतनी चाहिए जिन्हें आप वास्तव में पकड़ना नहीं चाहते हैं, जैसे SystemExit (प्रोग्राम को समाप्त करने के लिए sys.exit() द्वारा उठाया गया) और आमतौर पर KeyboardInterrupt (नियंत्रण-सी द्वारा उठाया गया)

6

अंत के साथ अपने unittest फ़ाइल:

if __name__ == '__main__': 
    unittest.main(exit=False) 
+0

आपको 'सत्य' की जांच नहीं करनी चाहिए - केवल उस भाग को हटा देना चाहिए। इसके अलावा, हालांकि, आपको इसके बजाय 'exit = गलत' प्रदान करना चाहिए ... –

6

निष्पादन tracback के अंत से बचने के लिए हमेशा __name__, "__main__" होगा - लेकिन जब मैं वहां खोज के माध्यम से अपने unittests भाग गया, मैंने पाया कि वे exe होगा काटा लेकिन एक अलग __name__ - "package.__main__" के साथ।

if __name__ == '__main__': 
    main(exit=False) 
से कॉल करने की

if __name__ == '__main__': 
    main() 

बजाय सिर्फ

main() 

हैं mainunittest.main है की,:

इसलिए मैं सिर्फ सरल पाइथन स्क्रिप्ट में की तरह मेरे __main__.py में निम्नलिखित की जरूरत किया

यदि आप प्रोसेस चाहते हैं रों इंटरैक्टिव मोड में चारों ओर रहना अगर आप

python -im package_name 

आप उपयोग कर रहे हैं कॉल कर रहे हैं:

python -m unittest discover 

तो मुझे नहीं लगता कि exit=False बात करना चाहिए।

1

sys.exit(not self.result.wasSuccessful())

मैं जब मैं अपने अजगर पैकेज में मेरी __main__.py ग्रहण इस में भाग:

if __name__=='__main__': 
    try: 
     unittest.main() 
    except SystemExit as inst: 
     if inst.args[0] is True: # raised by sys.exit(True) when tests failed 
      raise 
+0

यहां सबसे पूरा और उपयोगी उत्तर है। मैन मुझे नफरत है कि कितने देर से जवाब इतना कच्चा सौदा मिलता है। – CandiedOrange

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