क्या यूनिट परीक्षणों ने इस महंगी गलती से बचने के लिए सिटीग्रुप की मदद की होगी?


86

मैं इस स्नफू के बारे में पढ़ता हूं: 15 साल के परीक्षण डेटा के लिए गलत लेनदेन के बाद बग की लागत सिटीग्रुप $ 7m प्रोग्रामिंग करता है

1990 के दशक के मध्य में जब इस प्रणाली को पेश किया गया था, तो प्रोग्राम कोड ने किसी भी लेन-देन को फ़िल्टर कर दिया था, जिसे 089 से 100 तक तीन-अंकीय शाखा कोड दिए गए थे और उन उपसर्गों को परीक्षण प्रयोजनों के लिए उपयोग किया था।

लेकिन 1998 में, कंपनी ने अल्फ़ान्यूमेरिक शाखा कोड का उपयोग करना शुरू कर दिया क्योंकि इसने अपने व्यवसाय का विस्तार किया। इनमें कोड 10 बी, 10 सी और इसी तरह के थे, जिन्हें सिस्टम को बाहर रखी गई सीमा के भीतर माना जाता था, और इसलिए उनके लेनदेन को एसईसी को भेजे गए किसी भी रिपोर्ट से हटा दिया गया था।

(मुझे लगता है कि यह स्पष्ट है कि एक गैर-स्पष्ट डेटा संकेतक का उपयोग करना ... उप-इष्टतम है। यह एक बहुत स्पष्ट रूप से स्पष्ट Branch.IsLiveसंपत्ति को आबाद करने और उपयोग करने के लिए बेहतर होगा ।)

एक तरफ, मेरी पहली प्रतिक्रिया "यूनिट परीक्षणों ने यहां मदद की होगी" ... लेकिन क्या वे करेंगे?

मैंने हाल ही में पढ़ा है कि ब्याज के साथ सबसे अधिक इकाई परीक्षण क्यों बेकार है , और इसलिए मेरा सवाल है: अल्फ़ान्यूमेरिक शाखा कोड की शुरूआत पर विफल रही इकाई परीक्षण क्या दिखेंगे?



17
ऐसा लगता है कि वे एक एकीकरण परीक्षण से भी चूक गए, जिसने एसईसी को निर्यात किए गए लेनदेन की मात्रा की जांच की। यदि आप एक निर्यात सुविधा का निर्माण करते हैं जो एक उचित जाँच होगी।
ल्यूक फ्रेंकेन

31
लेख के लेखक को इकाई परीक्षण समझ में नहीं आता है। कुछ दावे सिर्फ सादा हास्यास्पद हैं ( "इकाई परीक्षण किसी दिए गए तरीके की कार्यक्षमता के एक ट्रिलियन से अधिक परीक्षण करने की संभावना नहीं है" ), अन्य लोग प्रतिगमन प्राप्त करने की संभावना को नष्ट कर देंगे ( "उन परीक्षणों को देखें जो एक वर्ष में कभी असफल नहीं हुए हैं" उन्हें फेंकने पर विचार करें " )। या "अभिकर्मकों में इकाई परीक्षणों को चालू करें" जैसे सुझाव , जिन्हें रनटाइम अपवादों के लिए विफल परीक्षणों को बदलने के लिए माना जाता है?
ग्रू

25
@gnat मैंने बाहरी लिंक नहीं पढ़ा, और मुझे अभी भी यह सवाल सार्थक लगा
Jeutnarg

23
इसके लायक क्या है, मैं "क्यों अधिकांश यूनिट परीक्षण अपशिष्ट है" में सब कुछ से बहुत असहमत हूं। मैं एक खंडन लिखूंगा, लेकिन यह मार्जिन इसमें शामिल करने के लिए बहुत छोटा है।
रॉबर्ट हार्वे

जवाबों:


19

क्या आप वास्तव में पूछ रहे हैं, "क्या यूनिट परीक्षणों ने यहां मदद की है?", या क्या आप पूछ रहे हैं, "क्या किसी भी तरह के परीक्षण संभवत: यहां मदद कर सकते हैं?"।

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

यह तब किसी तरह के एकीकरण परीक्षण में विफल हो सकता था, और जैसे ही नए अल्फा-न्यूमेरिक शाखा आईडी पेश किए जाते हैं, तब जोरदार प्रहार होता है। लेकिन यह एक इकाई परीक्षण नहीं है।

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

मैं इसमें शामिल इंटरफेस की कोई परिभाषा या दस्तावेज नहीं देख सकता हूं, लेकिन यह हो सकता है कि इकाई परीक्षणों ने संभवतः त्रुटि का पता नहीं लगाया होगा क्योंकि इकाई दोषपूर्ण नहीं थी । यदि इकाई को यह मानने की अनुमति है कि शाखा पहचानकर्ता में केवल अंक होते हैं, और डेवलपर्स ने कभी भी यह निर्णय नहीं लिया कि कोड को क्या करना चाहिए, तो उसे नहीं करना चाहिएगैर-अंकीय पहचानकर्ताओं के मामले में विशेष व्यवहार को लागू करने के लिए एक इकाई परीक्षण लिखें क्योंकि परीक्षण उस इकाई के काल्पनिक वैध कार्यान्वयन को अस्वीकार कर देगा जिसने अल्फ़ान्यूमेरिक शाखा पहचानकर्ताओं को सही ढंग से संभाला था, और आप आमतौर पर मान्य इकाई परीक्षण लिखना नहीं चाहते हैं भविष्य के कार्यान्वयन और विस्तार। या हो सकता है कि 40 साल पहले लिखे गए एक दस्तावेज़ को स्पष्ट रूप से परिभाषित किया गया हो (कच्चे ईबीसीडीआईसी में कुछ लक्सिकोग्राफिक रेंज के बजाय, एक अधिक मानव-अनुकूल टकराव नियम) कि 10 बी एक परीक्षण पहचानकर्ता है क्योंकि यह 089 और 100 के बीच वास्तव में गिरावट की ओर इशारा करता है। लेकिन तब 15 साल पहले किसी ने इसे एक वास्तविक पहचानकर्ता के रूप में उपयोग करने का फैसला किया, इसलिए "गलती" उस इकाई में झूठ नहीं बोलती है जो मूल प्रकार को ठीक से लागू करती है: यह उस प्रक्रिया में निहित है जो यह नोटिस करने में विफल रही कि 10 बी को एक परीक्षण पहचानकर्ता के रूप में परिभाषित किया गया है और इसलिए इसे एक शाखा को नहीं सौंपा जाना चाहिए। एएससीआईआई में ऐसा ही होगा यदि आपने 089 - 100 को एक परीक्षण सीमा के रूप में परिभाषित किया है और फिर एक पहचानकर्ता 10 डॉलर या 1.0 पेश किया है। ऐसा होता है कि EBCDIC में अंक अक्षरों के बाद आते हैं।

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

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

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

यह सोचने में थोड़ा परेशान है कि यह काफी हद तक बर्बाद हो चुका प्रयास है

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


दावे अच्छे हैं!

3
@nocomprende: जैसा कि रीगन के पास था, "विश्वास करो, लेकिन सत्यापित करो"।
स्टीव जेसोप

1
मैं यह भी कहने जा रहा था कि "यूनिट परीक्षण खराब है!" लेकिन मुझे लगा कि ज्यादातर लोग एनिमल फ़ार्म के संदर्भ को याद करेंगे और वास्तव में मेरे बारे में सोचने के बजाय मेरी आलोचना करना शुरू कर देंगे कि मैं क्या कह रहा था (घुटने में झटका प्रतिक्रियाएं अप्रभावी हैं) लेकिन मैंने ऐसा नहीं कहा। हो सकता है कि एक व्यक्ति जो अधिक होशियार हो और जिसके पास अधिक क्षरण हो, वह बात बना सकता है।

2
"सभी परीक्षण गुजर रहे हैं, लेकिन कुछ परीक्षण दूसरों की तुलना में अधिक गुजर रहे हैं!"
ग्राहम

1
परीक्षण एक लाल हेरिंग है। इन लोगों को अभी पता नहीं था कि "शाखा कोड" कैसे परिभाषित किया गया था। यह यूएस पोस्ट ऑफिस की तरह होगा न कि यह जानकर कि यह ज़िप कोड की परिभाषा को बदल रहा था जब उसने 4 अंक जोड़े थे।
राडोबोब

120

इकाई परीक्षण यह पकड़ सकता है कि शाखा कोड 10B और 10C को "परीक्षण शाखाओं" के रूप में गलत तरीके से वर्गीकृत किया गया था, लेकिन मुझे यह संभावना नहीं लगती कि उस त्रुटि को पकड़ने के लिए उस शाखा वर्गीकरण के परीक्षण पर्याप्त व्यापक होंगे।

दूसरी ओर, उत्पन्न रिपोर्ट के स्पॉट चेक से पता चल सकता है कि 10B और 10C की शाखाएं लगातार 15 साल की तुलना में रिपोर्टों से लगातार गायब थीं कि बग को अब मौजूद रहने की अनुमति दी गई थी।

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


80
+1 यूनिट परीक्षण कभी भी खराब डिज़ाइन निर्णयों (जैसे मिक्सिंग टेस्ट और वास्तविक डेटा) की भरपाई नहीं कर सकते हैं
Jeutnarg

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

4
@ मुझे लगता है कि एक मौन धारणा है कि जहां वास्तविक, तैनात उत्पादन प्रणाली का परीक्षण सार्थक या आवश्यक माना जाता है, वहां जटिलता या विश्वसनीयता की आवश्यकता का स्तर मौजूद है। (विचार करें कि एक गलत कॉन्फ़िगरेशन चर के कारण कितना गलत हो सकता है।) मैं इसे एक बड़े वित्तीय संस्थान के मामले में देख सकता था।
jpmc26

4
@Voo मैं परीक्षण के बारे में बात नहीं कर रहा हूँ। मैं सिस्टम के सत्यापन के बारे में बात कर रहा हूं। एक वास्तविक उत्पादन प्रणाली में, ऐसे कई तरीके हैं जो विफल हो सकते हैं जिनका कोड से कोई लेना-देना नहीं है। यदि आप उत्पादन में एक नई बैंकिंग प्रणाली डाल रहे हैं, तो आपके पास डीबी या नेटवर्क आदि में कुछ समस्या हो सकती है जो लेनदेन को खातों पर लागू होने से रोक रही है। मैंने कभी बैंक में काम नहीं किया है, लेकिन मुझे पूरा यकीन है कि यह वास्तविक खातों को फॉनी लेनदेन के साथ संशोधित करना शुरू कर दिया है। ताकि आप नकली खाते स्थापित करने के साथ या प्रतीक्षा करें और प्रार्थना करें।
जिमीजम्स

12
@JimmyJames स्वास्थ्य सेवा में समय-समय पर उत्पादन डेटाबेस को परीक्षण वातावरण में कॉपी करना आम है जो संभव के रूप में वास्तविक के करीब डेटा पर परीक्षण करने के लिए; मुझे लगता है कि एक बैंक भी ऐसा कर सकता है।
dj18

75

सॉफ्टवेयर को कुछ व्यावसायिक नियमों को संभालना था। यदि यूनिट परीक्षण होते हैं, तो यूनिट परीक्षणों ने जाँच की होगी कि सॉफ्टवेयर ने व्यावसायिक नियमों को सही तरीके से संभाला है।

व्यावसायिक नियम बदल गए।

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

तो नहीं, यूनिट परीक्षणों ने ऐसा नहीं पकड़ा होगा।

अपवाद तब होगा जब इकाई परीक्षण और सॉफ्टवेयर स्वतंत्र टीमों द्वारा बनाए गए थे, और इकाई परीक्षण कर रही टीम ने नए व्यावसायिक नियमों को लागू करने के लिए परीक्षणों को बदल दिया। तब यूनिट परीक्षण विफल हो जाते थे, जो उम्मीद करते थे कि सॉफ्टवेयर में बदलाव होगा।

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


2
क्या अलग-अलग टीमों के लिए संभव है जहां कोई कोड और "यूनिट" परीक्षणों पर काम कर रहा है? यह कैसे भी संभव है? ... मैं हर समय अपने कोड को फिर से बना रहा हूं।
सर्जियो

2
@ सर्जियो एक दृष्टिकोण से, व्यवहार को संरक्षित करते हुए परिवर्तन को बरकरार रखता है - इसलिए यदि परीक्षण इस तरह से लिखा गया है कि आंतरिक पर भरोसा किए बिना व्यवहार का परीक्षण करता है, तो उसे अपडेट करने की आवश्यकता नहीं है।
डेनिथ

1
मैंने देखा है यह कई बार होता है। सॉफ़्टवेयर बिना किसी शिकायत के उत्पादन में है, फिर अचानक उपयोगकर्ता उन शिकायतों के साथ विस्फोट करते हैं जो अब काम नहीं करती हैं और वर्षों से धीरे-धीरे विफल हो रही हैं। ऐसा तब होता है जब आप मानक अधिसूचना प्रक्रिया का पालन किए बिना अपनी आंतरिक प्रक्रियाओं को जाने और बदलने का फैसला करते हैं ...
ब्रायन नोब्लुच

42
"व्यावसायिक नियम बदले गए" महत्वपूर्ण अवलोकन है। इकाई परीक्षण इस बात को मान्य करते हैं कि आपने अपने द्वारा लागू किए गए तर्क को लागू किया है , न कि यह कि आपका तर्क सही था ।
रयान कैवानुआग

5
अगर मैं इसके बारे में सही हूं, तो यह संभव नहीं है कि इसे पकड़ने के लिए यूनिट परीक्षण लिखा जाए। परीक्षण का चयन करने के लिए मूल सिद्धांत कुछ "अच्छे" मामलों, कुछ "खराब" मामलों का परीक्षण करना है, और किसी सीमा को पूरा करने वाले मामले हैं। इस स्थिति में, आप "099", "100" और "101" का परीक्षण करेंगे। चूंकि "10B" पुरानी प्रणाली के तहत "नॉन-नंबर्स" टेस्ट द्वारा कवर किया गया था, और 101 से अधिक है (और इसलिए परीक्षण द्वारा कवर किया गया है) नई प्रणाली के तहत, इसका परीक्षण करने का कोई कारण नहीं है - सिवाय इसके कि अंदर EBCDIC, "0B" और "100" के बीच "10B" प्रकार।
मार्क

29

नहीं। यह इकाई परीक्षण के साथ बड़ी समस्याओं में से एक है: वे आपको सुरक्षा की झूठी भावना में ढकेल देते हैं।

यदि आपके सभी परीक्षण पास हो जाते हैं, तो इसका मतलब यह नहीं है कि आपका सिस्टम सही काम कर रहा है; इसका मतलब है कि आपके सभी परीक्षण गुजर रहे हैं । इसका मतलब है कि आपके डिज़ाइन के उन हिस्सों के बारे में जो आपने सचेत रूप से सोचा था और लिखित परीक्षा के लिए काम कर रहे हैं जैसा कि आपने जानबूझकर सोचा था कि वे, जो वास्तव में वैसे भी बहुत बड़ी बात नहीं है: यह वह सामान था जिस पर आप वास्तव में ध्यान दे रहे थे। तो, यह बहुत संभावना है कि आप इसे वैसे भी सही है! लेकिन यह उन मामलों को पकड़ने के लिए कुछ भी नहीं करता है जिनके बारे में आपने कभी नहीं सोचा था, जैसे कि यह एक, क्योंकि आपने कभी भी उनके लिए एक परीक्षण लिखने के लिए नहीं सोचा था। (और यदि आपके पास था, तो आप जानते होंगे कि कोड परिवर्तन आवश्यक थे, और आपने उन्हें बदल दिया होगा।)


17
मेरे पिता मुझसे पूछते थे कि: आपने उस चीज़ के बारे में क्यों नहीं सोचा, जिसके बारे में आपने नहीं सोचा था? (केवल वह यह कहकर भ्रमित करता था कि "यदि आप नहीं जानते हैं, तो पूछें !") लेकिन मुझे कैसे पता चलेगा कि मुझे नहीं पता है?

7
"इसका मतलब है कि आपके डिज़ाइन के जिन हिस्सों के बारे में आपने सचेत रूप से सोचा था और उनके लिए परीक्षण लिखे थे, जैसे कि आप सचेत रूप से सोच रहे थे कि वे काम करेंगे।" बिल्कुल सही। यह जानकारी अमूल्य है यदि आप रिफैक्टरिंग कर रहे हैं, या यदि सिस्टम में कुछ और परिवर्तन होता है जो आपकी मान्यताओं को तोड़ता है। डेवलपर्स जो सुरक्षा के झूठे अर्थ में लाली जाते हैं, वे केवल इकाई परीक्षण की सीमाओं को नहीं समझते हैं, लेकिन यह इकाई परीक्षण को बेकार उपकरण नहीं प्रदान करता है।
रॉबर्ट हार्वे

12
@MasonWheeler: आप की तरह, लेखक को लगता है कि इकाई परीक्षण किसी भी तरह यह साबित करने के लिए माना जाता है कि आपका कार्यक्रम काम करता है। यह नहीं है मुझे यह दोहराने दें: इकाई परीक्षण यह साबित नहीं करता है कि आपका कार्यक्रम काम करता है। यूनिट परीक्षण साबित करता है कि आपके तरीके आपके परीक्षण अनुबंध को पूरा करते हैं, और यह सब ऐसा करता है। बाकी कागज नीचे गिर जाते हैं, क्योंकि यह उस एकल अमान्य आधार पर टिकी हुई है।
रॉबर्ट हार्वे

5
स्वाभाविक रूप से, डेवलपर्स जो कि गलत धारणा रखते हैं, जब इकाई परीक्षण उन्हें पूरी तरह से विफल कर देते हैं, तो वे निराश होने वाले हैं, लेकिन यह डेवलपर की गलती है, इकाई परीक्षण की नहीं, और यह इकाई मूल्य प्रदान करने वाले वास्तविक मूल्य को अमान्य नहीं करता है।
रॉबर्ट हार्वे

5
o_O @ आपका पहला वाक्य। यूनिट परीक्षण आपको सुरक्षा का एक गलत अर्थ देते हैं, जबकि स्टीयरिंग व्हील पर आपके हाथ होने की तरह कोडिंग आपको ड्राइविंग करते समय सुरक्षा की झूठी भावना देता है।
djechlin

10

नहीं, जरूरी नहीं।

मूल आवश्यकता संख्यात्मक शाखा कोड का उपयोग करना था, इसलिए एक घटक के लिए एक इकाई परीक्षण का उत्पादन किया गया होगा जिसने विभिन्न कोड स्वीकार किए और किसी भी 10B को अस्वीकार कर दिया। सिस्टम को काम करने के रूप में पारित किया जाएगा (जो कि यह था)।

फिर, आवश्यकता बदल गई होगी और कोड अपडेट हो गए होंगे, लेकिन इसका मतलब होगा कि खराब डेटा की आपूर्ति करने वाले यूनिट टेस्ट कोड (जो अब अच्छा डेटा है) को संशोधित करना होगा।

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

इकाई परीक्षण मूल विकास के लिए अच्छा है, लेकिन सिस्टम परीक्षण के लिए नहीं, विशेष रूप से आवश्यकताओं को लंबे समय तक भूल जाने के 15 साल बाद नहीं।

इस तरह की स्थिति में उन्हें जिस चीज की जरूरत होती है, वह एंड-टू-एंड इंटीग्रेशन टेस्ट है। एक जहां आप उस डेटा में पास हो सकते हैं जिसे आप काम करने की उम्मीद करते हैं और देखते हैं कि क्या यह होता है। किसी ने देखा होगा कि उनके नए इनपुट डेटा ने एक रिपोर्ट नहीं बनाई है और फिर आगे की जांच करेंगे।


सटीक। और यूनिट परीक्षणों के साथ मुख्य (केवल?) समस्या। मुझे अपना उत्तर बताने से बचते हुए, जैसा कि मैंने ठीक वैसा ही कहा है (लेकिन शायद इससे भी बुरा है!) :)
ऑर्बिट

8

प्रकार परीक्षण (बेतरतीब ढंग से उत्पन्न वैध डेटा का उपयोग कर परीक्षण करने की प्रक्रिया, जैसा कि हास्केल परीक्षण पुस्तकालय क्विकचेक द्वारा अनुकरणीय है और अन्य भाषाओं में इसके द्वारा प्रेरित विभिन्न बंदरगाहों / विकल्प) ने इस मुद्दे को अच्छी तरह से पकड़ लिया है, इकाई परीक्षण लगभग निश्चित रूप से नहीं किया होगा। ।

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

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

बेशक, क्विकचेक को पहली बार 1999 में विकसित किया गया था, इसलिए इस मुद्दे को पकड़ने में पहले ही बहुत देर हो चुकी थी।


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

5

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

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

आप इस समस्या का केवल यथोचित पता लगा सकते हैं:

  • एकीकरण परीक्षण - लेकिन आपको सिस्टम में कई इकाइयों के माध्यम से फीड करने के लिए विशेष रूप से नए कोड फॉर्मेट को जोड़ना होगा (यानी यदि मूल परीक्षण में अब मान्य शाखाएं शामिल हैं तो वे आपको केवल समस्या दिखाएंगे)
  • एंड-टू-एंड टेस्टिंग - व्यवसाय को एंड-टू-एंड टेस्ट चलाना चाहिए जिसमें पुराने और नए ब्रांच कोड फॉर्मेट शामिल होते हैं

पर्याप्त अंत-टू-एंड परीक्षण नहीं होना अधिक चिंताजनक है। आप सिस्टम परिवर्तन के लिए केवल या MAIN परीक्षण के रूप में इकाई परीक्षण पर भरोसा नहीं कर सकते। ऐसा लगता है कि केवल किसी को नए समर्थित शाखा कोड स्वरूपों पर रिपोर्ट चलाने के लिए आवश्यक है।


2

रन-टाइम में निर्मित एक जोर से मदद मिल सकती है; उदाहरण के लिए:

  1. एक फंक्शन बनाएं bool isTestOnly(string branchCode) { ... }
  2. इस फ़ंक्शन का उपयोग यह तय करने के लिए करें कि कौन सी रिपोर्ट फ़िल्टर करना है
  3. इस प्रकार के शाखा कोड का उपयोग करके बनाया गया (नहीं किया जा सकता) सत्यापित करने या सत्यापित करने के लिए कि शाखा-निर्माण कोड में, एक क्रिया में उस फ़ंक्शन का फिर से उपयोग करें in
  4. इस दावे को वास्तविक रन-टाइम में सक्षम किया गया है (और कोड के डिबग-ओनली डेवलपर संस्करण को छोड़कर "अनुकूलित नहीं") enabled

यह सभी देखें:


2

इसमें से टेकवे फेल फास्ट है

हमारे पास कोड नहीं है, और न ही हमारे पास उपसर्गों के कई उदाहरण हैं जो कोड के अनुसार शाखा उपसर्ग हैं या नहीं। हमारे पास यह है:

  • 089 - 100 => परीक्षण शाखा
  • 10 बी, 10 सी => परीक्षण शाखा
  • <088 => संभवतः वास्तविक शाखाएँ
  • > 100 => संभवतः वास्तविक शाखाएँ

तथ्य यह है कि कोड संख्याओं की अनुमति देता है और तार थोड़ा अजीब से अधिक है। बेशक, 10B और 10C को हेक्स संख्या माना जा सकता है, लेकिन अगर उपसर्गों को सभी हेक्स संख्याओं के रूप में माना जाता है, तो 10B और 10C परीक्षण सीमा से बाहर हो जाते हैं और उन्हें वास्तविक शाखाओं के रूप में माना जाएगा।

इस संभावना का मतलब है कि उपसर्ग को एक स्ट्रिंग के रूप में संग्रहीत किया जाता है लेकिन कुछ मामलों में संख्या के रूप में माना जाता है। यहाँ सबसे सरल कोड है जो मैं सोच सकता हूँ कि इस व्यवहार की नकल करता है (उदाहरण के लिए C # का उपयोग करके):

bool IsTest(string strPrefix) {
    int iPrefix;
    if(int.TryParse(strPrefix, out iPrefix))
        return iPrefix >= 89 && iPrefix <= 100;
    return true; //here is the problem
}

अंग्रेजी में, यदि स्ट्रिंग एक संख्या है और 89 और 100 के बीच है, तो यह एक परीक्षण है। यदि यह एक संख्या नहीं है, तो यह एक परीक्षण है। अन्यथा यह एक परीक्षण नहीं है।

यदि कोड इस पैटर्न का अनुसरण करता है, तो जिस समय कोड तैनात किया गया था, उस समय कोई इकाई परीक्षण ने इसे नहीं पकड़ा होगा। यहाँ कुछ उदाहरण इकाई परीक्षण हैं:

assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change

यूनिट टेस्ट से पता चलता है कि "10 बी" को एक परीक्षण शाखा के रूप में माना जाना चाहिए। उपर्युक्त उपयोगकर्ता @ gnasher729 का कहना है कि व्यवसाय के नियम बदल गए हैं और यही ऊपर के अंतिम दावे से पता चलता है। कुछ बिंदु पर जो मुखर होना चाहिए एक में बदल गया है isFalse, लेकिन ऐसा नहीं हुआ। इकाई परीक्षण विकास और निर्माण-समय पर चलते हैं, लेकिन बाद में बिना किसी बिंदु पर।


यहाँ क्या सबक है? कोड को यह संकेत देने के लिए किसी तरह की आवश्यकता है कि उसे अप्रत्याशित इनपुट मिले। इस कोड को लिखने का एक वैकल्पिक तरीका है जो इस बात पर जोर देता है कि यह उपसर्ग को एक संख्या होने की उम्मीद करता है:

// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
    int iPrefix;
    if(int.TryParse(strPrefix, out iPrefix)) {
        isTest = iPrefix >= 89 && iPrefix <= 100;
        return true;
    }
    isTest = true; //this is just some value that won't be read
    return false;
}

जो लोग सी # नहीं जानते हैं, उनके लिए रिटर्न वैल्यू इंगित करता है कि कोड दिए गए स्ट्रिंग से एक उपसर्ग पार्स करने में सक्षम था या नहीं। यदि रिटर्न वैल्यू सही है, तो कॉलिंग कोड का उपयोग कर सकते हैं कि क्या शाखा उपसर्ग एक परीक्षण उपसर्ग है, यह जांचने के लिए चर का उपयोग कर सकते हैं। यदि रिटर्न मान गलत है, तो कॉलिंग कोड को रिपोर्ट करना चाहिए कि दिए गए उपसर्ग अपेक्षित नहीं है, और सबसे बाहर का चर अर्थहीन है और इसे अनदेखा किया जाना चाहिए।

यदि आप अपवादों के साथ ठीक हैं, तो आप इसके बजाय ऐसा कर सकते हैं:

// Alternative B
bool IsTest(string strPrefix) {
    int iPrefix = int.Parse(strPrefix);
    return iPrefix >= 89 && iPrefix <= 100;
}

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


1

इतने सारे जवाब और एक भी नहीं दिक्जस्त्र की बोली:

परीक्षण उपस्थिति को दर्शाता है, बग की अनुपस्थिति को नहीं।

इसलिए, यह निर्भर करता है। यदि कोड ठीक से परीक्षण किया गया था, तो सबसे अधिक संभावना है कि यह बग मौजूद नहीं होगा।


-1

मुझे लगता है कि यहां एक इकाई परीक्षण ने यह सुनिश्चित किया है कि समस्या पहले स्थान पर मौजूद नहीं है।

गौर कीजिए, आपने bool IsTestData(string branchCode)फ़ंक्शन लिखा है ।

आपके द्वारा लिखा गया पहला यूनिट टेस्ट अशक्त और खाली स्ट्रिंग के लिए होना चाहिए। फिर गलत लंबाई के तार के लिए फिर गैर पूर्णांक तार के लिए।

उन सभी परीक्षणों को पास करने के लिए आपको फंक्शन में पैरामीटर जाँच को जोड़ना होगा।

यहां तक ​​कि अगर आप केवल 'अच्छे' डेटा के लिए परीक्षण करते हैं 001 -> 999 10 ए की संभावना के बारे में नहीं सोच रहा है तो पैरामीटर जाँच आपको फ़ंक्शन को फिर से लिखने के लिए मजबूर करेगी जब आप अपवादों से बचने के लिए अल्फ़ान्यूमेरिक्स का उपयोग करना शुरू करेंगे।


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

(या शायद मुझे कुछ याद आ रहा है, क्योंकि मुझे यकीन नहीं है कि "पैरामीटर जाँच" से आपका क्या मतलब है)
हल्क

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

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

1
यदि चेक IsValidCode में है, ताकि यह फ़ंक्शन बिना किसी स्पष्ट जांच के पास हो जाए, तो हाँ इसके छूटने की संभावना है, लेकिन फिर हमारे पास और भी अधिक परीक्षणों का एक अतिरिक्त सेट होगा, मॉक वैलिडेटर आदि विशिष्ट के लिए और भी अधिक संभावनाएं हैं "ये हैं" परीक्षण संख्या "
इवान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.