शिपिंग परीक्षण कोड। क्यों नहीं करेंगे?


17

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

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

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

मैं तर्क के दोनों पक्षों के लिए साक्ष्य या उपाख्यानों का समर्थन करना चाहूंगा। मैंने अपना सर्वश्रेष्ठ अनुमान लगाया है कि कौन सी स्टैक एक्सचेंज साइट सबसे उपयुक्त होगी, लेकिन कृपया मुझे बताएं कि क्या यह जगह से बाहर है।


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


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

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

2
@JonChesterfield मेरे पास उन कारणों में से अधिकांश पर एक यूनिट टेस्ट में विफल होने का एक कठिन समय है। एकीकरण परीक्षण एक और मामला है, हालांकि - मैं उन्हें शिपिंग में योग्यता देख सकता हूं अगर यह बहुत अधिक अतिरिक्त सामान के बिना किया जा सकता है।
लोरेन Pechtel

जवाबों:


19

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

एक और नोट पर, परीक्षण कोड शायद ही कभी उत्पादन कोड मानकों के लिए आयोजित किया जाता है: कोड समीक्षा आवश्यक रूप से नहीं की जाती हैं; कोडिंग मानकों को लागू नहीं किया गया है, आदि .. यह दुर्भाग्यपूर्ण है, फिर भी सामान्य है, और जरूरी नहीं कि परीक्षण टीम पर खराब प्रतिबिंबित करें यदि उनके पास उस समय यह लक्ष्य नहीं था, जब ये परीक्षण विकसित किए गए थे।

दूसरी ओर, कई परीक्षण बस शर्मनाक रूप से खराब होते हैं, और यह भी परीक्षण नहीं करते हैं कि कुछ सोच क्या परीक्षण है। यह अलग मुद्दा है ...

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


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

हाँ, इस तथ्य के बाद करना मुश्किल है। मुझे लगता है कि आपके पास शिपिंग परीक्षण विकसित करने के लिए समर्पित प्रयास के साथ अधिक भाग्य होगा।
एरिक इद्दत

@ErikEidt: मैंने "ओपन सोर्स के रूप में" को हटाने के लिए एक सुझाव देने की आज़ादी ली, क्योंकि ओपी के दिमाग में शायद ऐसा नहीं था - मुझे लगता है कि वह परीक्षण को बंद स्रोत के रूप में शिप करना चाहते हैं।
डॉक ब्राउन

@DocBrown, मैं आपकी बात लेता हूं। संभवतः व्याख्या का विषय है क्योंकि ओपी ने पोस्ट में कहीं "ओपन सोर्स" का उल्लेख किया है। किसी भी स्थिति में आपका संपादन इस बिंदु को सामान्य रूप से सामान्यीकृत करता है।
एरिक इद्दत

18

शिपिंग परीक्षण? हाँ। शिपिंग यूनिट परीक्षण? नहीं।

जैसा कि आप टिप्पणी में कहते हैं, क्लाइंट कंप्यूटर पर उत्पाद चलाते समय समस्या का सामना करना पड़ सकता है, जिसमें गलत dll के साथ लिंक करने जैसी समस्याएं शामिल होंगी, आम तौर पर यह कुछ ऐसा नहीं है जिसे इकाई परीक्षण पकड़ लेगा (जिसमें कोई संदेह नहीं होगा कि dll को बाहर निकाल दिया जाएगा। कोड का परीक्षण करने के लिए)।

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

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


2

मैं इस चिंता को उन क्षेत्रों में दृढ़ता से समझ सकता हूं जहां आप हार्डवेयर के हर एक इंच को कवर कर रहे हैं, जैसे कि मल्टीथ्रेडेड-जीन-एएए गेम इंजन जो क्रॉस-प्लेटफॉर्म वितरित करते समय हर एक सीपीयू कोर, सिमडी इंट्रिंसिक्स, जीपीयू, जीपीजीपीयू आदि का उपयोग करता है। उत्पाद।

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

विशेष रूप से यदि आप GPU शेड्स लिखते हैं, तो आप एक रिवर्स लॉटरी खेल सकते हैं, जहाँ आप जो कोड लिखते हैं उसका आधा हिस्सा अपरिभाषित व्यवहार को लागू करेगा, क्योंकि इसमें सभी GPU मॉडल / ड्राइवरों द्वारा लागू कुछ पोर्टेबल मानक गारंटी हैं। जबकि यह इन दिनों माइंसवेपर की तरह कम और कम हो रहा है, इससे लोगों को कुछ विचार देना चाहिए: http://theorangeduck.com/page/writing-portable-opengl । 90 के दशक के अंत और 2000 की शुरुआत में यह कोशिश करना वास्तव में भयानक था, और यह सभी तरह से माइनस्वीपर था।

इस प्रकार के मामलों के लिए, आपको अक्सर 10,000+ परीक्षकों की टीम की आवश्यकता होती है, जो वास्तव में उत्पाद को स्थिर करने के लिए हार्डवेयर और ऑपरेटिंग सिस्टम की एक विस्तृत श्रृंखला के साथ एक स्थिर रिलीज से पहले इसके बारे में आश्वस्त महसूस करते हैं। सभी कंपनियां इस तरह के एक व्यापक परीक्षण आधार को वहन नहीं कर सकती हैं, और सभी के पास इसे सही करने के लिए अनुशासन नहीं है (सभी व्यापक रूप से ध्यान देने योग्य मुद्दों को कुछ आंतरिक प्री-अल्फा / अल्फा चरण में इतने सारे परीक्षक होने से पहले तय किया जाना चाहिए) अनावश्यक रिपोर्टों की बाढ़ डेवलपर्स को एक पैच-एंड-प्रेयर आतंक में फेंक सकती है)।

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

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

लेकिन एक और बात मैं सुझाता हूँ:

लॉगिंग

यदि आप ऊपर वर्णित परिदृश्य की तरह किसी भी चीज़ के साथ काम कर रहे हैं, तो अक्सर आप संभवतः इन चीजों के लिए परीक्षण नहीं कर सकते हैं जो सबसे अधिक समस्याग्रस्त होते हैं (सबसे खराब संभव गोश्त जो सबसे खराब समय पर दिखाई देते हैं और संभवतः यहां तक ​​कि नहीं दिखा सकते हैं यह एक बहुत ही विशिष्ट हार्डवेयर / OS कॉम्बो के लिए विवश मुद्दा है, क्योंकि अधिकांश संपूर्ण परीक्षण सूट।

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

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

आमतौर पर, सबसे अच्छी बात जो हम कर सकते हैं वह है समस्या का जल्द से जल्द पता लगाना, जहां यह यथासंभव विस्तृत हो (हमारे संदिग्धों की सूची को कम करने के लिए), और रिपोर्ट होने के बाद इस मुद्दे को एएसएपी तय किया है।

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

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

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

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

लॉगिंग वह चीज थी जिसने हमारे चूतड़ को वहां बचाया था, हमें अक्सर उस मुद्दे पर 10,001 वीं अस्पष्ट प्रोटोटाइप मशीन को देखने की सुविधा मिलती है, जिसमें हमने कभी भी ऑनबोर्ड जीपीयू के बारे में नहीं सुना, कोड की अंतिम पंक्ति के साथ तुरंत हमें ठीक उसी स्थान पर जाने दिया जहां विफलता 2 पर थी। या संदिग्ध के रूप में कोड की 3 पंक्तियाँ, उदाहरण के लिए, यदि यह एक विस्तृत shader के अंदर है, तो हम SOL की तरह हैं क्योंकि हम GPU shader के अंदर लॉगिंग नहीं कर सकते हैं, लेकिन हम कम से कम लॉगिंग का उपयोग यह देखने के लिए कर सकते हैं कि किस shader में अभी समस्या थी जांच शुरू करना।


2
संस्मरण लॉगिंग कोड चतुर है। हम वर्तमान में लॉग का उत्पादन नहीं करते हैं - मोटे तौर पर प्रदर्शन की चिंताओं के कारण - इसलिए डिबगिंग में एक कोर डंप शामिल है। इंस्टॉलर के साथ नैदानिक ​​परीक्षणों को एम्बेड करना एक अच्छा विचार है। विस्तृत उत्तर के लिए धन्यवाद।
जॉन चेस्टरफील्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.