संपादित करें: बेहतर उदाहरण के लिए स्विच किया गया, और स्पष्ट किया कि यह एक वास्तविक समस्या क्यों है।
मैं पायथन में इकाई परीक्षण लिखना चाहता हूं जो कि जब कोई दावा विफल हो जाता है तो निष्पादित करना जारी रखता है, ताकि मैं एक ही परीक्षण में कई विफलताओं को देख सकूं। उदाहरण के लिए:
class Car(object):
def __init__(self, make, model):
self.make = make
self.model = make # Copy and paste error: should be model.
self.has_seats = True
self.wheel_count = 3 # Typo: should be 4.
class CarTest(unittest.TestCase):
def test_init(self):
make = "Ford"
model = "Model T"
car = Car(make=make, model=model)
self.assertEqual(car.make, make)
self.assertEqual(car.model, model) # Failure!
self.assertTrue(car.has_seats)
self.assertEqual(car.wheel_count, 4) # Failure!
यहां, परीक्षण का उद्देश्य यह सुनिश्चित करना है कि कार __init__अपने क्षेत्रों को सही ढंग से सेट करे। मैं इसे चार विधियों में तोड़ सकता था (और यह अक्सर एक महान विचार है), लेकिन इस मामले में मुझे लगता है कि इसे एकल विधि के रूप में रखने के लिए अधिक पठनीय है जो एक एकल अवधारणा का परीक्षण करता है ("ऑब्जेक्ट को सही ढंग से प्रारंभ किया गया है")।
अगर हम यह मानते हैं कि विधि को न तोड़ना यहाँ सबसे अच्छा है, तो मुझे एक नई समस्या है: मैं सभी त्रुटियों को एक बार में नहीं देख सकता। जब मैं modelत्रुटि को ठीक करता हूं और परीक्षण को फिर से चलाता हूं , तो wheel_countत्रुटि दिखाई देती है। जब मैं पहली बार परीक्षा चलाता हूं, तो मुझे दोनों त्रुटियों को देखने के लिए समय की बचत होगी।
तुलना के लिए, Google का C ++ यूनिट परीक्षण ढांचा गैर-घातक दावे और घातक दावे के बीच अंतर करता है:EXPECT_*ASSERT_*
दावे जोड़े में आते हैं जो एक ही चीज़ का परीक्षण करते हैं लेकिन वर्तमान फ़ंक्शन पर अलग-अलग प्रभाव डालते हैं। ASSERT_ * संस्करण विफल होने पर घातक विफलता उत्पन्न करते हैं, और वर्तमान फ़ंक्शन को निरस्त करते हैं। EXPECT_ * संस्करण गैर-विफल विफलता उत्पन्न करते हैं, जो वर्तमान फ़ंक्शन को समाप्त नहीं करता है। आमतौर पर EXPECT_ * को प्राथमिकता दी जाती है, क्योंकि वे एक परीक्षण में एक से अधिक विफलताओं को रिपोर्ट करने की अनुमति देते हैं। हालाँकि, आपको ASSERT_ * का उपयोग करना चाहिए, अगर यह तब तक जारी रखने का कोई मतलब नहीं है जब प्रश्न में दावा विफल हो जाता है।
क्या EXPECT_*पायथन में समान व्यवहार प्राप्त करने का एक तरीका है unittest? यदि नहीं unittest, तो क्या एक और पायथन यूनिट टेस्ट फ्रेमवर्क है जो इस व्यवहार का समर्थन करता है?
संयोग से, मैं इस बारे में उत्सुक था कि कितने वास्तविक जीवन परीक्षण गैर-घातक दावे से लाभान्वित हो सकते हैं, इसलिए मैंने कुछ कोड उदाहरणों को देखा (Google कोड खोज, RIP के बजाय खोज कोड का उपयोग करने के लिए 2014-08-19 संपादित किया गया)। पहले पृष्ठ से 10 बेतरतीब ढंग से चयनित परिणामों में से, सभी में परीक्षण शामिल थे जो एक ही परीक्षण विधि में कई स्वतंत्र अभिकथन करते थे। सभी गैर-घातक दावे से लाभान्वित होंगे।