एक परीक्षण को दूसरे परीक्षण के परिणामों पर कैसे निर्भर किया जाए?


13

मान लीजिए कि एक उपयोगिता वर्ग है जो आपके कोड में कई अन्य वर्गों द्वारा हर जगह उपयोग किए जाने वाले कुछ सामान्य स्थिर तरीके प्रदान करता है ।

आप यूटिलिटी के उपभोक्ताओं के लिए अपने यूनिट परीक्षणों को कैसे डिजाइन करेंगे ताकि उपयोगिता परीक्षणों में से कोई भी पास न होने पर उनके परीक्षण विफल हो जाएं? क्या आप इसे कर सकते हैं या क्या आपको इसे स्वयं जांचना होगा कि क्या उपयोगिता वर्ग परीक्षण सभी हरे हैं?

उदाहरण के लिए मेरे पास एक संदेश-फाड़नेवाला उपयोगिता है जो संदेश-पार्सर द्वारा उपयोग की जाती है (या इसके आउटपुट)। मैं यह सुनिश्चित करना चाहता हूं कि संदेश-पार्सर परीक्षण से पहले संदेश-फाड़नेवाला सही ढंग से काम करता है।

मैंने उन दोनों के लिए परीक्षण लिखा है, लेकिन क्या उन्हें लिंक करने और एक परीक्षण को किसी अन्य परीक्षण के परिणाम पर निर्भर करने का एक तरीका है?

मुझे इसके लिए एक उपयुक्त टैग नहीं मिला, लेकिन मैं विजुअल स्टूडियो के यूनिट टेस्ट इंजन का उपयोग कर रहा हूं।


1
मैं समझता हूं कि उपयोगिता विफल होने पर पार्सर सही ढंग से काम नहीं करता है। लेकिन अगर आप अपने परीक्षण चलाते हैं तो आप देखेंगे कि उपयोगिता परीक्षण विफल हो जाते हैं। आप अन्य परीक्षणों को भी विफल क्यों करना चाहते हैं?
यूजेन मार्टिनोव

1
मैंने पहले कभी किसी को इस बारे में नहीं सुना। आप क्या हासिल करने की कोशिश कर रहे हैं?
एसेन स्कोव पेडरसन


मैं पार्सर परीक्षणों के लिए डेटा तैयार करने के लिए उपयोगिता कार्यों में से कुछ का उपयोग करता हूं, इसलिए मैं पूरी तरह से सुनिश्चित होना चाहूंगा कि मैं कुछ और परीक्षण करने से पहले उपयोगिता सही ढंग से काम करता हूं।
t3chb0t

3
@ t3chb0t यदि आप अपनी उपयोगिता सुनिश्चित करना चाहते हैं तो आपको अपनी उपयोगिता को सत्यापित करने के लिए इकाई परीक्षण लिखने की आवश्यकता है। यूनिट परीक्षण परमाणु होना चाहिए। आप केवल उन्हें एक घटक का परीक्षण करना चाहते हैं।
maple_shaft

जवाबों:


11

यह सुनिश्चित करने का कोई मतलब नहीं है कि आपके सिस्टम में प्रत्येक दोष बिल्कुल एक परीक्षण का दौरा करता है

एक परीक्षण सूट में एक काम है: यह सत्यापित करना कि कोई ज्ञात दोष नहीं हैं। यदि कोई दोष है, तो यह मायने नहीं रखता है कि एक परीक्षण विफल हो जाता है या 10. यदि आपको अपने टेस्ट सूट में असफल होने की आदत है, यदि आप यह पता लगाने की कोशिश करते हैं कि आपका प्रोग्राम कितना खराब है , तो असफल परीक्षाओं की गणना करके, आप नहीं हैं प्रतिगमन परीक्षण का सही तरीके से उपयोग करना। टेस्ट सूट को कोड प्रकाशित करने से पहले आपको सभी परीक्षणों को पास करना चाहिए ।

लंघन परीक्षणों के लिए एकमात्र वैध कारण यह है कि यदि वे अपूर्ण कार्यक्षमता का परीक्षण करते हैं और समय की एक विषम राशि लेते हैं जिसे आप उस चीज को लागू करने के लिए बेहतर उपयोग में ला सकते हैं जिसे वे परीक्षण करना चाहते हैं। (यह केवल एक मुद्दा है अगर आप सख्त परीक्षण-संचालित विकास का अभ्यास नहीं करते हैं, लेकिन यह एक वैध विकल्प है, आखिरकार।)

अन्यथा, अपने टेस्ट सूट को एक संकेतक बनाने की कोशिश करने से परेशान न हों जो आपको बताए कि वास्तव में क्या गलत है। यह कभी भी सटीक नहीं होगा, और यह होने वाला नहीं है। यह आपको दो बार एक ही गलती करने से बचाने वाला है, बस।


8

यह आपके टूलींग पर निर्भर करता है, लेकिन आप शायद ऐसा नहीं कर सकते (और नहीं करना चाहिए)

कुछ यूनिट-टेस्टिंग फ्रेमवर्क ( उदाहरण के लिए PHPUnit लेते हैं ) आपको 'चेन' परीक्षणों की अनुमति देते हैं ताकि एक स्तर पर असफल परीक्षण अन्य परीक्षणों को निष्पादित न करें। हालांकि, मुझे संदेह है कि यह इस स्थिति के लिए आपकी समस्या को ठीक करेगा।

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

आप इन उपयोगिता-विधियों को एक अलग समाधान या परीक्षण-श्रेणी में रख सकते हैं। सुनिश्चित करें कि वे आपके परीक्षण धावक में नेत्रहीन 'बाहर खड़े' हों, या यह कि यह श्रेणी पहले चलती है और इस श्रेणी में परीक्षण विफल होने पर कोई अन्य परीक्षण नहीं चलाते हैं। जब इन परीक्षणों में से एक असफलता विफल हो जाती है, तो शायद सभी परीक्षणों के बीच कास्केड हो जाएगा और आपको यह सुनिश्चित करने में मदद करनी चाहिए कि जो कोई भी परीक्षण चलाता है, वह इन असफल परीक्षणों को पहले ठीक करके शुरू करना जानता है। वही यूनिट टेस्ट और इंटीग्रेशन टेस्ट के लिए जाता है। यदि एक यूनीटेस्ट विफल हो जाता है, तो यह कैस्केड करेगा और एकीकरण परीक्षणों में सभी प्रकार के तबाही का कारण होगा। हर कोई जानता है कि जब यूनिट और एकीकरण परीक्षण विफल होते हैं, तो आप यूनीटैस्ट की जांच करके शुरू करते हैं ...

* एक स्वचालित निर्माण या परीक्षण स्क्रिप्ट के साथ आप पहले इस श्रेणी को चला सकते हैं, परिणाम की जांच कर सकते हैं और केवल अन्य परीक्षण चला सकते हैं यदि परीक्षणों का यह पहला बैच पास हो।


5

अपनी इकाई परीक्षण को परमाणु रखने की कोशिश करें। याद रखें कि स्वचालित परीक्षण कोड आपके कोड आधार का भी हिस्सा है, लेकिन स्वयं परीक्षण के अधीन नहीं है, इसलिए इसे यथासंभव सरल और स्पष्ट रखें।

आपके प्रश्न का अधिक सीधे उत्तर देने के लिए, परीक्षणों के निष्पादन के आदेश की कोई गारंटी नहीं है, इसलिए यह गारंटी देने का भी कोई तरीका नहीं है कि आपकी उपयोगिता परीक्षण आपके अन्य परीक्षणों के चलने से पहले सफल हो। इसलिए आपके सभी परीक्षणों के लिए एकल टेस्ट सूट होने के दौरान आप जो चाहते हैं, उसे प्राप्त करने का कोई गारंटी तरीका नहीं है।

आप उपयोगिताओं को उनके स्वयं के समाधान में स्थानांतरित कर सकते हैं और अपने वर्तमान प्रोजेक्ट में इसके परिणामस्वरूप dll का संदर्भ जोड़ सकते हैं।


4

एक सारांश में आप उन चीज़ों के अलावा औजारों / तकनीकों का उपयोग नहीं करना चाहते हैं जो उनके लिए हैं।

आप एक सीआई (निरंतर एकीकरण) अभ्यास के साथ आसानी से हल किया जा सकता है कि एक चिंता की तरह लगता है क्या करने की कोशिश कर रहे हैं।

इस तरह आप पहले से ही सुझाए गए अपने परीक्षणों को परमाणु रख सकते हैं और सीआई को आपके परीक्षणों को सत्यापित करने का ध्यान रखने दें।

यदि कोई परीक्षण विफल हो जाता है तो आप इसे सेट कर सकते हैं ताकि यह आपके कोड को प्रकाशित न होने दे।


4

मुझे हमेशा फ्रेमवर्क स्तर कोड से एप्लिकेशन स्तर कोड को अलग करने की कोशिश करने की आदत है, इसलिए मुझे उस समस्या का सामना करना पड़ा है जो आप अक्सर वर्णन कर रहे हैं: आप आमतौर पर चाहते हैं कि किसी भी एप्लिकेशन स्तर कोड का परीक्षण शुरू होने से पहले सभी फ्रेमवर्क स्तर का परीक्षण किया जाए। । इसके अलावा, फ्रेमवर्क स्तर कोड के भीतर भी, कुछ मूलभूत ढांचा मॉड्यूल होते हैं, जो अन्य सभी ढांचे के मॉड्यूल द्वारा उपयोग किए जाते हैं, और अगर कुछ बुनियादी बातों में विफल रहता है, तो वास्तव में कुछ और परीक्षण करने का कोई मतलब नहीं है।

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

इसलिए, मेरी राय में, परीक्षण निर्भरता के लिए एक भयानक बात होगी, और इसके बदले में, उस क्रम को निर्दिष्ट करने की क्षमता जिसमें परीक्षणों का निष्पादन किया जाएगा, अगली सबसे अच्छी बात होगी।

आदेश परीक्षण के मुद्दे को संबोधित करने का एकमात्र तरीका सावधानीपूर्वक नामकरण है, ताकि वर्णमाला के क्रम में परीक्षणों को निष्पादित करने के लिए परीक्षण रूपरेखाओं की प्रवृत्ति का दोहन किया जा सके।

मुझे नहीं पता कि यह विजुअल स्टूडियो में कैसे काम करता है, क्योंकि मुझे अभी तक C # के साथ व्यापक परीक्षण से संबंधित कुछ भी नहीं करना है, लेकिन दुनिया के जावा पक्ष में यह निम्नानुसार काम करता है: एक प्रोजेक्ट के स्रोत फ़ोल्डर के तहत हमारे पास आमतौर पर दो सबफ़ोल्डर होते हैं, एक को "मुख्य" कहा जाता है, जिसमें उत्पादन कोड होता है, और एक को "परीक्षण" कहा जाता है, जिसमें परीक्षण कोड होता है। "मुख्य" के तहत हमारे पास एक फ़ोल्डर पदानुक्रम है जो वास्तव में हमारे स्रोत कोड के पैकेज पदानुक्रम से मेल खाता है। जावा पैकेज लगभग # सी नामस्थानों के अनुरूप है। C # को आपको नाम पदानुक्रम में फ़ोल्डर पदानुक्रम से मिलान करने की आवश्यकता नहीं है, लेकिन ऐसा करना उचित है।

अब, जावा दुनिया में आमतौर पर लोग जो करते हैं, वह यह है कि "परीक्षण" फ़ोल्डर के तहत वे "मुख्य" फ़ोल्डर के तहत पाए जाने वाले फ़ोल्डर पदानुक्रम को दर्पण करते हैं, ताकि प्रत्येक परीक्षण उस कक्षा के समान सटीक पैकेज में रहता है जिसका वह परीक्षण करता है। इसके पीछे तर्क यह है कि अक्सर परीक्षण वर्ग को परीक्षण के तहत कक्षा के पैकेज-निजी सदस्यों तक पहुंचने की आवश्यकता होती है, इसलिए परीक्षण वर्ग को परीक्षण के तहत कक्षा के समान पैकेज में होना चाहिए। दुनिया के C # पक्ष में नाम स्थान-स्थानीय दृश्यता जैसी कोई चीज़ नहीं है, इसलिए फ़ोल्डर पदानुक्रम को मिरर करने का कोई कारण नहीं है, लेकिन मुझे लगता है कि C # प्रोग्रामर अपने फ़ोल्डरों को संरचित करने में समान अनुशासन का पालन करते हैं।

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

इसलिए, मैं क्या करता हूं कि मैं अपने परीक्षणों के फ़ोल्डरों (अर्थ, संकुल) का नाम इस प्रकार देता हूं:

t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...

यह गारंटी देता है कि "SomeStherSubsystem" के लिए सभी परीक्षणों से पहले "SomeSubsystem" को निष्पादित किया जाएगा, जो बदले में "AndYetAnotherSubsystem" के लिए सभी परीक्षणों से पहले निष्पादित किया जाएगा, और इसी तरह आगे भी।

एक फ़ोल्डर के भीतर, व्यक्तिगत परीक्षण फ़ाइलों को इस प्रकार नामित किया गया है:

T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java

बेशक, यह बहुत मदद करता है कि आधुनिक आईडीई में शक्तिशाली रीफैक्टरिंग क्षमताएं हैं जो आपको केवल एक-दो क्लिक और कीस्ट्रोक्स के साथ पूरे पैकेज (और सभी उप-पैकेजों और उन्हें संदर्भित करने वाले सभी कोड) का नाम बदलने की अनुमति देती हैं।


2
I don't know about everyone else, but I would prefer to have the freedom to try to do something in an odd way, and see for myself whether the results are better or worse++ दोस्त। मुझे नहीं पता है कि मुझे समाधान पसंद है, लेकिन मुझे आपके द्वारा वहां प्रदर्शित रवैया पसंद है।
रबरडक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.