अन्य उत्तरों के विपरीत, यह ध्यान रखना महत्वपूर्ण है कि परीक्षण के कुछ तरीके नाजुक हो सकते हैं जब परीक्षण के तहत प्रणाली को वापस लाया जाता है, यदि परीक्षण व्हाइटबॉक्स है।
अगर मैं एक मॉकिंग फ्रेमवर्क का उपयोग कर रहा हूं, जो मोक्स पर कहे जाने वाले तरीकों के क्रम की पुष्टि करता है (जब ऑर्डर अप्रासंगिक होता है क्योंकि कॉल साइड-इफेक्ट मुक्त होते हैं); फिर यदि मेरा कोड एक अलग क्रम में उन विधि कॉलों के साथ क्लीनर है और मैं रिफ्लेक्टर करता हूं, तो मेरा परीक्षण टूट जाएगा। सामान्य तौर पर, नकली परीक्षण के लिए नाजुकता का परिचय दे सकते हैं।
अगर मैं अपने निजी या संरक्षित सदस्यों (हम "दोस्त" को विज़ुअल बेसिक में एक्सपोज़ करके अपने SUT की आंतरिक स्थिति की जाँच कर रहा हूँ, या एक्सेस लेवल "इंटरनल" को बढ़ा सकता है और c # में "internalsvanishto" का उपयोग कर सकता है;) कई OO भाषाओं में; c # एक " परीक्षण-विशिष्ट-उपवर्ग " का उपयोग किया जा सकता है) फिर अचानक कक्षा की आंतरिक स्थिति मायने रखेगी - आप कक्षा को एक ब्लैक बॉक्स के रूप में फिर से तैयार कर सकते हैं, लेकिन सफेद बॉक्स परीक्षण विफल हो जाएंगे। मान लीजिए कि किसी एकल फ़ील्ड का पुन: उपयोग किया जाता है, तो अलग-अलग चीजों का मतलब है (अच्छा अभ्यास नहीं!) जब SUT स्थिति बदलता है - अगर हम इसे दो क्षेत्रों में विभाजित करते हैं, तो हमें टूटे हुए परीक्षणों को फिर से लिखना पड़ सकता है।
परीक्षण-विशिष्ट-उपवर्गों का उपयोग संरक्षित तरीकों का परीक्षण करने के लिए भी किया जा सकता है - जिसका मतलब यह हो सकता है कि उत्पादन कोड के दृष्टिकोण से एक रिफैक्टर परीक्षण कोड के दृष्टिकोण से एक परिवर्तन है। संरक्षित विधि से कुछ पंक्तियों को अंदर या बाहर ले जाने से कोई उत्पादन दुष्प्रभाव नहीं हो सकता है, लेकिन एक परीक्षण को तोड़ सकता है।
यदि मैं " परीक्षण हुक " या किसी अन्य परीक्षण-विशिष्ट या सशर्त संकलन कोड का उपयोग करता हूं , तो यह सुनिश्चित करना कठिन हो सकता है कि आंतरिक तर्क पर नाजुक निर्भरता के कारण परीक्षण टूट न जाएं।
तो SUT के अंतरंग आंतरिक विवरण के परीक्षणों को युग्मित होने से रोकने के लिए इसे करने में मदद मिल सकती है:
- जहां संभव हो, मॉक के बजाय स्टब्स का इस्तेमाल करें। अधिक जानकारी के लिए टैबोलॉजिकल परीक्षणों पर फैबियो पेरिएरा के ब्लॉग , और टॉटोलॉजिकल परीक्षणों पर मेरे ब्लॉग को देखें ।
- यदि मोज़ेक का उपयोग किया जाता है, तो बुलाए गए तरीकों के क्रम को सत्यापित करने से बचें, जब तक कि यह महत्वपूर्ण न हो।
- अपने SUT की आंतरिक स्थिति की पुष्टि करने से बचने की कोशिश करें - यदि संभव हो तो इसके बाहरी एपीआई का उपयोग करें।
- उत्पादन कोड में परीक्षण-विशिष्ट तर्क से बचने की कोशिश करें
- परीक्षण-विशिष्ट उपवर्गों का उपयोग करने से बचने का प्रयास करें।
उपरोक्त सभी बिंदु परीक्षणों में उपयोग किए गए सफेद-बॉक्स युग्मन के उदाहरण हैं। तो पूरी तरह से टूटने वाले परीक्षण से बचने के लिए, SUT के ब्लैक-बॉक्स परीक्षण का उपयोग करें।
अस्वीकरण: यहां पर चर्चा करने के उद्देश्य से, मैं किसी भी दृश्य प्रभाव के बिना आंतरिक कार्यान्वयन में बदलाव को शामिल करने के लिए शब्द का थोड़ा अधिक उपयोग कर रहा हूं। कुछ शुद्धतावादी असहमत हो सकते हैं और विशेष रूप से मार्टिन फाउलर और केंट बेक की पुस्तक रिफैक्टरिंग का उल्लेख कर सकते हैं - जिसमें परमाणु रीफैक्टरिंग संचालन का वर्णन है।
व्यवहार में, हम वहां वर्णित परमाणु संचालन की तुलना में थोड़ा बड़ा गैर-तोड़ने वाले कदम उठाते हैं, और विशेष रूप से बदलाव जो उत्पादन कोड को बाहर से पहचानने वाले व्यवहार को छोड़ते हैं वे परीक्षणों को पारित नहीं कर सकते हैं। लेकिन मुझे लगता है कि रिफ्लेक्टर के रूप में "एक और एल्गोरिथ्म के लिए एक समान व्यवहार" वाले विकल्प को शामिल करना उचित है, और मुझे लगता है कि फाउलर सहमत हैं। मार्टिन फाउलर खुद कहते हैं कि रिफैक्टरिंग परीक्षण को तोड़ सकता है:
जब आप मॉकिस्ट टेस्ट लिखते हैं, तो आप SUT की आउटबाउंड कॉल का परीक्षण कर रहे हैं ताकि यह सुनिश्चित हो सके कि वह अपने आपूर्तिकर्ताओं से ठीक से बात कर रहा है। एक क्लासिक परीक्षण केवल अंतिम स्थिति की परवाह करता है - न कि कैसे उस राज्य को व्युत्पन्न किया गया था। इस प्रकार मॉकिस्ट परीक्षण एक विधि के कार्यान्वयन के लिए अधिक युग्मित हैं। सहयोगियों के लिए कॉल की प्रकृति को बदलने से आमतौर पर मॉकिस्ट टेस्ट टूट जाता है।
[...]
कार्यान्वयन के लिए युग्मन भी रिफैक्टिंग के साथ हस्तक्षेप करता है, क्योंकि कार्यान्वयन परिवर्तन क्लासिक परीक्षण की तुलना में परीक्षणों को तोड़ने की अधिक संभावना है।
फाउलर - मोक्स स्टब्स नहीं हैं