क्या इकाई परीक्षण के लिए यह सुनिश्चित करना संभव है कि कोई विधि sys.exit कहे ()


98

मेरे पास एक अजगर 2.7 विधि है जो कभी-कभी कॉल करती है

sys.exit(1) 

क्या एक इकाई परीक्षण करना संभव है जो सही परिस्थितियों को पूरा करने पर कोड की इस लाइन को सत्यापित करता है?


जवाबों:


155

हाँ। sys.exitउठाता है SystemExit, तो आप इसे देख सकते हैं assertRaises:

with self.assertRaises(SystemExit):
    your_method()

ऐसे उदाहरणों की SystemExitविशेषता है codeजो प्रस्तावित निकास स्थिति के लिए सेट है, और संदर्भ प्रबंधक द्वारा लौटाए assertRaisesगए अपवाद उदाहरण के रूप में पकड़े गए हैं exception, इसलिए निकास स्थिति की जांच करना आसान है:

with self.assertRaises(SystemExit) as cm:
    your_method()

self.assertEqual(cm.exception.code, 1)

 

sys.exit प्रलेखन :

पायथन से बाहर निकलें। यह SystemExitअपवाद को बढ़ाकर लागू किया गया है ... बाहरी स्तर पर बाहर निकलने के प्रयास को रोकना संभव है।


3
+1, सिवाय इसके कि अगर वह यह सत्यापित करना चाहता है कि यह कॉल करता है sys.exit(1)(जैसा कि विरोध किया जाता है, कहते हैं, sys.exit(0)) आपको वास्तव में इसकी पुष्टि करने की आवश्यकता codeहै 1. मुझे लगता है कि आप ऐसा कर सकते हैं assertRaisesRegexp(SystemExit, '1')?
अबार्नेट

मुझे यकीन था कि एक ऐसी unittestविधि थी जो आपको अपवाद या इसके पुर्जों पर चलने के लिए एक अपवाद योग्य प्रस्ताव पारित करने की अनुमति देती है , बजाय इसके पहले arg के स्ट्रिंग प्रतिनिधित्व पर चलाने के लिए एक रेगेक्स पैटर्न के बजाय ... लेकिन मुझे नहीं लगता। क्या मैं कुछ अन्य परीक्षण मॉड्यूल के बारे में सोच रहा हूं?
अबार्नेट

1
+1, त्रुटि कोड की जाँच के लिए यह अभी तक बहुत आसान है: self.assertRaisesRegex( SystemExit, '^2$', testMethod ) कम कोड, पर्याप्त पठनीय।
मारेक लेवांडोव्स्की

1
@MarekLewandowski - टाइपो। होना चाहिएself.assertRaisesRegexp

12

यहाँ एक पूर्ण कार्य उदाहरण है। पावेल के शानदार जवाब के बावजूद मुझे यह पता लगाने में थोड़ा समय लगा, इसलिए मैं इसे इस उम्मीद में यहां शामिल कर रहा हूं कि यह मददगार होगा।

import unittest
from glf.logtype.grinder.mapping_reader import MapReader

INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"

class TestMapReader(unittest.TestCase):

    def test_get_tx_names_incomplete_mapping_file(self):
        map_reader = MapReader()
        with self.assertRaises(SystemExit) as cm:
            tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
        self.assertEqual(cm.exception.code, 1)

3

मैंने पायथन यूनिट टेस्टिंग डॉक्यूमेंटेशन सर्च में आपके प्रश्न का उत्तर "अपवादों के लिए परीक्षण" के लिए पाया। अपने उदाहरण का उपयोग करते हुए, यूनिट परीक्षण निम्नलिखित की तरह दिखाई देगा:

self.assertRaises(SystemExit, your_function, argument 1, argument 2)

अपने फ़ंक्शन का परीक्षण करने के लिए आवश्यक सभी तर्क शामिल करना याद रखें।


1

पावेल के उत्कृष्ट उत्तर के लिए एक अतिरिक्त नोट के रूप में आप विशिष्ट स्थितियों की जांच कर सकते हैं यदि वे आपके द्वारा परीक्षण किए जा रहे फ़ंक्शन में प्रदान किए गए हैं। उदाहरण के लिए यदि your_method()निम्नलिखित में निहित है तो sys.exit("Error")"त्रुटि" के लिए विशेष रूप से परीक्षण करना संभव होगा:

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.