2015-11-03 6 views
7

पायथन परीक्षण में, हम क्यों लिखना चाहिए:इन दिनों परीक्षणों में पाइथन के जोरदार कथन का उपयोग क्यों नहीं करते?

self.assertEqual(response.status_code, 200) 
self.assertIn('key', my_dict) 
self.assertIsNotNone(thing) 

के रूप में प्राकृतिक करने का विरोध किया:

assert response.status_code == 200 
assert 'key' in my_dict 
assert thing is not None 

कई मामलों के लिए, विफलता अभिकथन सहायक विधियों से उत्पन्न संदेशों किसी भी अधिक पढ़ने योग्य नहीं हैं (तर्कसंगत रूप से ऊंट की ऊंट की शैली कम पठनीय है)। अपने प्रोजेक्ट के

पृष्ठभूमि:

  • हम हमेशा इस तरह के नाक या py.test के रूप में आधुनिक परीक्षण धावक का उपयोग कर रहे हैं, और हम वास्तव में नहीं है unittest धावक के बारे में परवाह। टेस्ट डिस्कवरी इस बात पर भी ध्यान नहीं देती है कि वर्ग को अंततः unittest.TestCase प्राप्त होता है, या आप उस मामले के लिए कक्षा में काम करते हैं या नहीं।
  • हम ओआर स्विच के साथ स्वचालित परीक्षण कभी भी निष्पादित नहीं करेंगे।
  • जब हम एक और अधिक पठनीय संदेश चाहते हैं, तो एकजुट से डिफ़ॉल्ट एक आम तौर पर पर्याप्त नहीं है - उदा। वहां एक मूल्य भिन्न है, जो कहीं भी जेसन डेटा में घिरा हुआ है, और हम एक प्रासंगिक diff देखना चाहते हैं।

कोर लाइब्रेरी और सीपीथन परीक्षण आम तौर पर एकजुट शैली में लिखे जाते हैं, और वे आम तौर पर एक अच्छे कारण के लिए सबकुछ करते हैं। तो मेरा सवाल यह है कि, क्या यह अनजान की शैली के बाहर काम करना ठीक है, या क्या कुछ नुकसान हैं जो मुझे याद आ रही है - क्यों न केवल अपने परीक्षणों में ज़ोर देना? कोर देव अभी तक एकदम से दूर क्यों नहीं गए हैं?


परिशिष्ट:

इन विधियों ज़ोर बयान के स्थान पर प्रयोग किया जाता है ताकि परीक्षण धावक सभी परीक्षण के परिणाम जमा होते हैं और एक रिपोर्ट

उत्पादन कर सकते हैं: docs एक कारण का उल्लेख करना हालांकि यह औचित्य फर्जी प्रतीत होता है, परीक्षण धावक सामान्य रूप से परिणामों और रिपोर्ट जमा कर सकता है भले ही आप जोरदार बयानों का उपयोग करते हों। related post में unutbu ने दिखाया है कि unittest AssertionError को जोरदार कथन के समान ही बढ़ाएगा, और यह 7 साल पहले था, इसलिए यह एक चमकदार नई सुविधा नहीं है।

+2

मैं अब तक 'unittest' से बाहर काम करता हूं कि मैं 'assert' के बजाय' प्रिंट()' का उपयोग करता हूं। मुझे लगता है कि यह सब आपकी परियोजना की जटिलता और पैमाने पर निर्भर करता है। – TigerhawkT3

+1

यह ज्यादातर राय का विषय लगता है। यदि आपको लगता है कि 'जोर' बेहतर है तो ऐसा कुछ भी नहीं है जो आपके द्वारा उपयोग किए जाने से रोकता है (इसके अलावा आपके सहयोगी असहमत हो)। हालांकि यह ज्ञात होना चाहिए कि आप 'टेस्टकेस' कक्षा में विधियों को ओवरराइड कर सकते हैं और व्यवहार को कस्टमाइज़ कर सकते हैं - 'assert' कथन में यह लचीलापन नहीं है। इसके अलावा 'TestCase.failureException' को बदला जा सकता है जो आपके बिंदु को अमान्य अपवाद के रूप में फेंक दिया गया है) (यदि आप विफलता के बजाय' त्रुटि 'पर विचार करना चाहते हैं तो इसका उपयोग किया जा सकता है)। – skyking

+0

बस सादा 'जोर' बहुत अधिक पठनीय है। तो यदि आपके परीक्षण विफल हो जाते हैं तो हमेशा 'pytest' का उपयोग करें। – o11c

उत्तर

-1

आपको मिले दस्तावेज़ों का लिंक सही उत्तर है। आप परीक्षण लेखन की इस शैली पसंद नहीं है मैं अत्यधिक pytest उपयोग करने का सुझाव होगा:

http://pytest.org/latest/

pytest काम का एक समूह है कि आप ज़ोर बयान मनचाहे तरीके से उपयोग करने के लिए अनुमति देता है किया है। इसमें अन्य फिक्स्चर जैसी अन्य वाकई अच्छी सुविधाएं भी हैं।

+3

मैं सवाल में वर्णित, जैसा कि pytest का उपयोग करते हैं। दस्तावेज़ों में दावा सही कैसे माना जा सकता है, जब परीक्षण धावक खुशी से सभी परीक्षण परिणामों को जमा करता है और इस पर ध्यान दिए बिना कि आप जोरदार बयान या सहायक कार्यों का उपयोग करते हैं या नहीं? – wim

3

assert कीवर्ड या समर्पित विधियों का उपयोग करने के बीच महत्वपूर्ण अंतर आउटपुट रिपोर्ट है। ध्यान दें कि assert के बाद का बयान हमेशा True या False है और इसमें कोई अतिरिक्त जानकारी नहीं हो सकती है।

assert 3 == 4 

रिपोर्ट में केवल AssertionError दिखाएगा। हालांकि,

self.assertTrue(3 == 4) 

कुछ अतिरिक्त जानकारी देता है: AssertionError: False is not true। नहीं बहुत उपयोगी है, लेकिन पर विचार करें:

self.assertEqual(3, 4) 

यह के रूप में यह आपको बताता है कि AssertionError: 3 != 4 ज्यादा बेहतर है। आप रिपोर्ट पढ़ते हैं और आप जानते हैं कि यह किस प्रकार का दावा था (समानता परीक्षण) और मूल्य शामिल थे।

मान लीजिए कि आपके पास कुछ फ़ंक्शन है, और यह मान देता है कि वह मूल्य लौटाता है। आप दो तरह से यह कर सकते हैं:

# assert statement 
assert your_function_to_test() == expected_result 

# unittest style 
self.assertEqual(your_function_to_test(), expected_result) 

त्रुटि के मामले में, पहले एक आप जोर त्रुटि के अलावा कोई जानकारी देता है, दूसरा एक बताता है कि दावा (समानता परीक्षण) और क्या के प्रकार है मूल्य शामिल हैं (मूल्य लौटाया और अपेक्षित)।

छोटी परियोजनाओं के लिए मैं कभी भी टाइप करने के लिए लंबे समय तक शैली से परेशान नहीं हूं, लेकिन बड़ी परियोजनाओं में आप त्रुटि के बारे में और जानना चाहेंगे।

+0

उठाए गए 'AssertionError' में शामिल होने के लिए, आप एक दावे के लिए एक मनमाने ढंग से स्ट्रिंग जोड़ सकते हैं:' assert 3 == 4, "3! = 4" '। – chepner

+1

अधिक महत्वपूर्ण बात यह है कि परीक्षण धावक/परीक्षण ढांचा स्वचालित रूप से संदर्भ उत्पन्न करने में सक्षम है। – wim

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