2010-06-02 11 views
24

में फायदे या अंतर क्या हैं मैं परीक्षण लिख रहा हूं और मैंने कुछ लोगों को assert False के बजाय self.assertFalse का उपयोग करने के लिए कहा है। यह क्यों है और क्या कोई फायदे हैं?"जोर दें झूठी" और "self.assertFalse"

उत्तर

20

assert False उपयोगी लॉगिंग जानकारी के बिना अपवाद फेंकता है। परीक्षण में एक त्रुटि थी।

self.assertFalse() किसी संदेश और परीक्षण नाम जैसी परीक्षण विफलता जानकारी के साथ परीक्षण विफलता अपवाद फेंकता है।

त्रुटि के बीच एक अंतर है - परीक्षण भी नहीं चला सका - और विफलता - परीक्षण कोड काम करता था लेकिन गलत जवाब उत्पन्न करता था।

त्रुटियां आपके कोड के साथ एक गंभीर समस्या है।

असफलताएं केवल विफलताओं हैं जिन्हें ठीक करने की आवश्यकता है।

+0

धन्यवाद, जो जानना उपयोगी बनाता है, मुझे 'जोरदार झूठी' रेखाओं को हटाने की आवश्यकता होगी। +1 – chrissygormley

+1

हाय, यह स्पष्ट रूप से गलत है। परीक्षण धावक को 'AssertionError' पकड़ना चाहिए (और करता है) और परीक्षण विफलताओं के रूप में उन्हें सही तरीके से रिपोर्ट करें। 'स्वयं का उपयोग करने के बजाय – wim

33

आप चलाने

import unittest 

class Test_Unittest(unittest.TestCase): 
    def test_assert(self): 
     assert False 
    def test_assertFalse(self): 
     self.assertFalse(True) 

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

आप एक ही प्रवेश जानकारी प्राप्त करते हैं, तो एक ही विफलता:

FF 
====================================================================== 
FAIL: test_assert (__main__.Test_Unittest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/unutbu/pybin/test.py", line 6, in test_assert 
    assert False 
AssertionError 

====================================================================== 
FAIL: test_assertFalse (__main__.Test_Unittest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/unutbu/pybin/test.py", line 8, in test_assertFalse 
    self.assertFalse(True) 
AssertionError 

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

FAILED (failures=2) 

कारण दोनों एक ही नियंत्रित किया जाता है क्योंकि unittest.TestCase को परिभाषित करता है

failureException = AssertionError 

है जब आप कहते हैं कि assert False एक AssertionError उठाया गया है।

जब आप self.assertFalse(True) कहते हैं, तो failureExeception उठाया जाता है।

चूंकि ये अपवाद समान हैं, इसमें कोई स्पष्ट अंतर नहीं है।

assert और self.assertFalse हालांकि पारंपरिक उपयोग में भिन्नता है।

assert का उपयोग यह घोषणा करने के लिए किया जाता है कि कोड में एक निश्चित बिंदु पर एक निश्चित स्थिति होनी चाहिए। इसका विकास के दौरान एक क्रैच के रूप में प्रयोग किया जाता है, लेकिन इसका उत्पादन उत्पादन कोड में उपयोग नहीं किया जाता है। यदि आप python -O my_unittest.py चलाते हैं, तो सभी जोर देने वाले बयानों को अनदेखा कर दिया जाता है। इससे assert के आपके इच्छित उपयोग को विचलित कर दिया जाएगा, संभवतः विफल होने पर भी आपके यूनिट परीक्षण पास हो जाएंगे।

भले ही (ओ-फ्लैग के बिना) परिणाम समान है, assert इकाई परीक्षण कोड में उपयोग करने के लिए नहीं है। इकाई परीक्षण लिखते समय self.assertTrue या self.assertFalse का उपयोग करें।

# test_this_and_that.py 
def test_frobber(): 
    assert frobber('x') == 'y' 
# EOF 

बिना:

+0

।assertFalse (True) 'आप (और शायद चाहिए)' self.fail() 'का उपयोग कर सकते हैं। – freaker

10

एक बात जवाब अब तक का उल्लेख विफल रहे हैं कई परीक्षण चौखटे (py.test जैसे और nose) कि उपयोग अजगर का आत्मनिरीक्षण जादू तुम इतनी तरह इकाई परीक्षण लिखने के लिए अनुमति देने के लिए देखते हैं कि है ऊपर देखे गए सबसे अजीब बॉयलरप्लेट की आवश्यकता है। तो कुछ मामलों में यह सिर्फ एक framwork/स्टाइलिस्ट मुद्दे के लिए उबाल सकता है।

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