2012-09-25 27 views
8

मैं TestCase सबक्लास में एक कस्टम जोर विधि जोड़ना चाहता हूं। मैंने unittest मॉड्यूल से अपने कार्यान्वयन की प्रतिलिपि बनाने की कोशिश की ताकि यह नियमित रूप से TestCase के व्यवहार को जितना संभव हो सके मिल सके। (मैं सिर्फ self.assertEqual() पर प्रतिनिधि होना पसंद करूंगा लेकिन इससे नीचे और भी पीछे का शोर होता है, नीचे देखें।) unittest मॉड्यूल विफल होने पर रिपोर्टिंग के दौरान अपने कार्यान्वयन के कुछ आंतरिक विवरण स्वचालित रूप से छिपाने लगता है।टेस्टकेस सबक्लास में मैं अपने स्टैक फ्रेम को कैसे छिपा सकता हूं?

import unittest 

class MyTestCase(unittest.TestCase): 
    def assertLengthIsOne(self, sequence, msg=None): 
     if len(sequence) != 1: 
      msg = self._formatMessage(msg, "length is not one") 
      raise self.failureException(msg) 

class TestFoo(MyTestCase): 
    seq = (1, 2, 3, 4, 5) 

    def test_stock_unittest_assertion(self): 
     self.assertEqual(len(self.seq), 1) 

    def test_custom_assertion(self): 
     self.assertLengthIsOne(self.seq) 


unittest.main() 

इस के उत्पादन में इस तरह के रूप में है:

[email protected] $ python unittest-demo.py 
FF 
====================================================================== 
FAIL: test_custom_assertion (__main__.TestFoo) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "unittest-demo.py", line 16, in test_custom_assertion 
    self.assertLengthIsOne(self.seq) 
    File "unittest-demo.py", line 7, in assertLengthIsOne 
    raise self.failureException(msg) 
AssertionError: length is not one 

====================================================================== 
FAIL: test_stock_unittest_assertion (__main__.TestFoo) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "unittest-demo.py", line 13, in test_stock_unittest_assertion 
    self.assertEqual(len(self.seq), 1) 
AssertionError: 5 != 1 

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

FAILED (failures=2) 

ध्यान दें कि कस्टम ज़ोर विधि दो फ्रेम, विधि के अंदर ही एक साथ एक स्टैक ट्रेस का कारण बनता है, जबकि शेयर unittest विधि केवल एक ही है फ्रेम, उपयोगकर्ता के कोड में प्रासंगिक रेखा। मैं इस फ्रेम-छिपाने वाले व्यवहार को अपनी विधि में कैसे लागू कर सकता हूं?

उत्तर

14

इस प्रश्न का उत्तर by Peter Otten on comp.lang.python था।

MyTestCase को एक अलग मॉड्यूल में ले जाएं और वैश्विक चर __unittest = True परिभाषित करें।

$ cat mytestcase.py 
import unittest 

__unittest = True 

class MyTestCase(unittest.TestCase): 
    def assertLengthIsOne(self, sequence, msg=None): 
     if len(sequence) != 1: 
      msg = self._formatMessage(msg, "length is not one") 
      raise self.failureException(msg) 

$ cat mytestcase_demo.py 
import unittest 
from mytestcase import MyTestCase 

class TestFoo(MyTestCase): 
    seq = (1, 2, 3, 4, 5) 

    def test_stock_unittest_assertion(self): 
     self.assertEqual(len(self.seq), 1) 

    def test_custom_assertion(self): 
     self.assertLengthIsOne(self.seq) 

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

$ python mytestcase_demo.py 
FF 
====================================================================== 
FAIL: test_custom_assertion (__main__.TestFoo) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "mytestcase_demo.py", line 11, in test_custom_assertion 
    self.assertLengthIsOne(self.seq) 
AssertionError: length is not one 

====================================================================== 
FAIL: test_stock_unittest_assertion (__main__.TestFoo) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "mytestcase_demo.py", line 8, in test_stock_unittest_assertion 
    self.assertEqual(len(self.seq), 1) 
AssertionError: 5 != 1 

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

FAILED (failures=2) 
$ 
+0

मुझे विश्वास नहीं है कि इस प्रश्न/उत्तर को अधिक वोट प्राप्त नहीं हुए हैं! महान जानकारी और वास्तव में मैं क्यों <3 SO। – dbn

+0

यह समाधान इतना उपयोगी है! –

+0

यह सुनिश्चित नहीं है कि python.org पर पाइपमेल बदल गया है लेकिन पीटर के समाधान का सही लिंक https://mail.python.org/pipermail/python-list/2012- ऑक्टेट/632386.html है। इसके अलावा पॉइंटर के लिए आपको बहुत बहुत धन्यवाद, वास्तव में मेरी मदद की। –