python पायथन के सबसे बेरहमी से परीक्षण करने के लिए कि एक चेतावनी कैसे फेंक दी गई है?




unit-testing exception-handling (4)

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

def isZero(i):
    if i != 0:
        print "OK"
    else:
        warning = Warning("the input is 0!") 
        print warning
    return i

@ire_and_curses का answer काफी उपयोगी है और, मुझे लगता है, विहित। यहाँ एक ही काम करने का एक और तरीका है। इसके लिए माइकल फोम की उत्कृष्ट Mock लाइब्रेरी की आवश्यकता है

import unittest, warnings
from mock import patch_object

def isZero( i):
   if i != 0:
     print "OK"
   else:
     warnings.warn( "the input is 0!")
   return i

class Foo(unittest.TestCase):
    @patch_object(warnings, 'warn')
    def test_is_zero_raises_warning(self, mock_warn):
        isZero(0)
        self.assertTrue(mock_warn.called)

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

निफ्टी patch_object आपको warn विधि का मजाक patch_object देता है।


पायथन 3.2 के साथ शुरू, आप बस assertWarns() विधि का उपयोग कर सकते हैं।

with self.assertWarns(Warning):
    do_something()

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

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

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

class WarningTestMixin(object):
    'A test which checks if the specified warning was raised'

    def assertWarns(self, warning, callable, *args, **kwds):
        with warnings.catch_warnings(record=True) as warning_list:
            warnings.simplefilter('always')

            result = callable(*args, **kwds)

            self.assertTrue(any(item.category == warning for item in warning_list))

एक उपयोग उदाहरण:

class SomeTest(WarningTestMixin, TestCase):
    'Your testcase'

    def test_something(self):
        self.assertWarns(
            UserWarning,
            your_function_which_issues_a_warning,
            5, 10, 'john', # args
            foo='bar'      # kwargs
        )

यदि आपका कम से कम चेतावनियों का प्रकार UserWarning द्वारा जारी किया your_function है, तो परीक्षा पास हो जाएगी।







warnings