मुझे 65.000.000.000 परीक्षणों के एक सूट को चलाने के तरीके के बारे में पूछा गया था और मुझे आश्चर्य है कि इतनी बड़ी मात्रा में परीक्षणों के साथ एक परियोजना होना सामान्य है।
क्या आपने इस विशेषता के साथ परियोजनाओं में काम किया है?
मुझे 65.000.000.000 परीक्षणों के एक सूट को चलाने के तरीके के बारे में पूछा गया था और मुझे आश्चर्य है कि इतनी बड़ी मात्रा में परीक्षणों के साथ एक परियोजना होना सामान्य है।
क्या आपने इस विशेषता के साथ परियोजनाओं में काम किया है?
जवाबों:
65 बिलियन परीक्षणों के साथ, ऐसा लगता है कि आपको सभी संभावित इनपुट का परीक्षण करने के लिए कहा जा रहा है। यह उपयोगी नहीं है - आप अनिवार्य रूप से परीक्षण करेंगे कि आपका प्रोसेसर सही ढंग से कार्य करता है, न कि यह कि आपका कोड सही है।
आपको इसके बजाय समकक्ष कक्षाओं का परीक्षण करना चाहिए । यह आपके परीक्षण इनपुट की सीमा को काफी कम कर देगा।
यह भी विचार करें कि क्या आप अपने सिस्टम को छोटे टुकड़ों में तोड़ सकते हैं। प्रत्येक टुकड़े को अलगाव में परीक्षण करना आसान होगा, और फिर आप कुछ एकीकरण परीक्षण कर सकते हैं जो सभी टुकड़ों को एक साथ लाते हैं।
यदि आप अभी भी उस आश्वासन को चाहते हैं कि उनमें से कुछ इनपुट संयोजन काम करते हैं, तो शायद आप फ़ज़ल परीक्षण की कोशिश कर सकते हैं । आपको बहुत से विभिन्न इनपुटों के परीक्षण के कुछ लाभ मिलेंगे, लेकिन उनमें से सभी 65 बिलियन को चलाने के बिना।
यदि यह एक वास्तविक परीक्षण सूट है, तो आप इस पर काम करने के लिए कहीं भी नहीं जाना चाहते हैं।
एक परीक्षक की पूरी नौकरी पूरी तरह से परीक्षण के बीच एक संतुलन बनाने के लिए होती है ताकि आप आश्वस्त हो सकें कि आपको "सही" परिणाम मिले हैं और कुछ पर्याप्त परीक्षण लिख रहे हैं कि उन्हें उचित समय में चलाया जा सकता है।
कई परीक्षणों को "समतुल्यता वर्गों" में समाहित किया जा सकता है, जिसका अर्थ है कि 3 बिलियन परीक्षण चलाने के बजाय, आप 1 चलाते हैं जो आपको एक उचित स्तर का विश्वास दिलाता है कि उस समतुल्यता वर्ग के अन्य सभी परीक्षण सफलतापूर्वक चलेंगे, यदि आपने बर्बाद करने का फैसला किया है समय चल रहा है उन्हें।
आपको यह बताना चाहिए कि जो कोई भी 65 बिलियन परीक्षणों को चलाने के बारे में सोच रहा है, उन्हें समतुल्य कक्षाओं में एक बेहतर जॉब अमूर्त परीक्षण करने की आवश्यकता है।
संभावना से अधिक, आप परीक्षण के तहत सिस्टम में इनपुट के सभी संभावित संयोजनों की गणना करके या साइक्लोमैटिक जटिलता की गणना करके और इन अद्वितीय निष्पादन पथों में से प्रत्येक के लिए एक परीक्षण लिखा होना चाहिए, 65 बिलियन परीक्षणों के आपके आंकड़े पर पहुंचे।
ऐसा नहीं है कि वास्तविक परीक्षण कैसे लिखे जाते हैं, क्योंकि जैसा कि अन्य पोस्टरों और टिप्पणीकारों ने संकेत दिया है, 65 अरब को निष्पादित करने के लिए आवश्यक तकनीकी शक्तिपरीक्षण चौंका देने वाला है। यह एक परीक्षण लिखने जैसा होगा जो दो 32-बिट मानों के हर संभावित क्रम में प्लग इन करके और परिणाम की जांच करके दो पूर्णांकों को जोड़ने की विधि का अभ्यास करता है। यह पूरी तरह पागलपन है। आपको लाइन खींचनी होगी और सभी संभावित परीक्षण मामलों के एक सबसेट की पहचान करनी होगी, जो उनके बीच यह सुनिश्चित करेगा कि सिस्टम इनपुट की पूरी सीमा में अपेक्षित व्यवहार करेगा। उदाहरण के लिए। आप कुछ "साधारण" संख्याओं को जोड़कर परीक्षण करते हैं, आप कुछ नकारात्मक-संख्या परिदृश्यों का परीक्षण करते हैं, आप तकनीकी सीमाओं जैसे अतिप्रवाह परिदृश्यों का परीक्षण करते हैं, और आप किसी भी परिदृश्य का परीक्षण करते हैं, जिसके परिणामस्वरूप त्रुटि होनी चाहिए। जैसा कि उल्लेख किया गया था, ये विभिन्न प्रकार के परीक्षण "समतुल्यता वर्ग" का प्रयोग करते हैं; वे आपको किसी भी ज्ञात "आउटलेर" के साथ संभावित इनपुट का प्रतिनिधि नमूना लेने की अनुमति देते हैं:
मूल कोड कटाओं में से एक पर विचार करें, रोमन अंक जेनरेटर। टाडीडी तकनीकों का उपयोग "डोजो" शैली में किया जाने वाला कार्य, एक फ़ंक्शन लिखना है जो किसी भी संख्या को 1 से 3000 तक स्वीकार कर सकता है और उस संख्या मान के लिए सही रोमन अंक का उत्पादन कर सकता है।
आप एक बार में 3000 यूनिट परीक्षण, एक बार लिखकर, और उन्हें पास करके इस समस्या को हल नहीं करते हैं। वह लंपट है; व्यायाम आम तौर पर एक और दो घंटे के बीच होता है, और आप प्रत्येक व्यक्तिगत मूल्य का परीक्षण करने वाले दिनों के लिए होंगे। इसके बजाय, आप स्मार्ट हो जाओ। आप सबसे सरल आधार मामले (1 == "मैं") से शुरू करते हैं, "न्यूनतम-कोड" रणनीति ( return "I";
) का उपयोग करके कार्यान्वित करते हैं , और फिर यह देखते हैं कि आपके पास जो कोड है वह किसी अन्य अपेक्षित परिदृश्य में गलत व्यवहार करेगा (2 ==) द्वितीय ")। धोये और दोहराएं; संभावना से अधिक, आपने अपने प्रारंभिक कार्यान्वयन को किसी ऐसे चीज़ से बदल दिया जो "I" वर्ण को जितनी बार आवश्यक हो (जैसे return new String('I',number);
) दोहराता है । यह स्पष्ट रूप से III के लिए एक परीक्षा उत्तीर्ण करेगा, ताकि आप परेशान न हों; इसके बजाय, आप 4 == "IV" के लिए परीक्षण लिखते हैं, जिसे आप जानते हैं कि वर्तमान कार्यान्वयन जीता है '
या, अधिक विश्लेषणात्मक शैली में, आप प्रत्येक सशर्त निर्णय की जांच करते हैं जो कोड द्वारा किया जाता है (या होना चाहिए), और प्रत्येक निर्णय के प्रत्येक संभावित परिणाम के लिए कोड दर्ज करने के लिए डिज़ाइन किया गया परीक्षण लिखें। यदि आपके पास 5 हैं यदि कथन (प्रत्येक के पास एक सच्ची और झूठी शाखा है), उनमें से प्रत्येक पूरी तरह से दूसरे से स्वतंत्र है, तो आप 10 परीक्षणों को कोड करते हैं, 32 को नहीं। प्रत्येक परीक्षण को किसी विशेष संभावित निर्णय के बारे में दो बातों का दावा करने के लिए डिज़ाइन किया जाएगा; पहले कि सही निर्णय किया गया है, और फिर उस स्थिति को देखते हुए दर्ज किया गया कोड सही है। आप स्वतंत्र निर्णयों के प्रत्येक संभावित क्रमांकन के लिए एक परीक्षण को कोड नहीं करते हैं । यदि निर्णय निर्भर हैं, तो आपको संयोजन में उनमें से अधिक का परीक्षण करना होगा, लेकिन ऐसे संयोजन बहुत कम हैं क्योंकि कुछ निर्णय केवल तब किए जाते हैं जब किसी अन्य निर्णय का एक विशेष परिणाम होता है।
क्या यह "सामान्य" है ?, नहीं। जहां "सामान्य" को औसत या विशिष्ट अनुभव के रूप में परिभाषित किया गया है। कह सकते हैं कि मुझे कभी इस तरह की परियोजना पर काम नहीं करना पड़ा, लेकिन मैं एक ऐसी परियोजना पर रहा हूं जहां हर कुछ मिलियन बिट्स में से एक फ़्लिप हो जाएगा। परीक्षण है कि एक था ... एक चुनौती है।
क्या यह संभावित रूप से आवश्यक है? खैर, यह परियोजना की गारंटी और बारीकियों पर निर्भर करता है। यह पहली बार में समझने के लिए थोड़ा अविश्वसनीय है, लेकिन आपका सवाल बारीक है।
जैसा कि अन्य (माइकलटी) ने बताया है, धारावाहिक परीक्षण के साथ इस कार्य को पूरा करने का समय इसे अव्यवहारिक बनाता है। तो समानांतर करना आपका पहला विचार बन जाता है। आप इस समस्या पर कितने परीक्षण सिस्टम फेंक सकते हैं और उन कई प्रणालियों के परिणामों को टालने के लिए आपके पास क्या समर्थन है?
आपको क्या गारंटी है कि आपके द्वारा परीक्षण किया जा रहा डिवाइस या एल्गोरिथ्म मज़बूती से दोहराया जा रहा है? सॉफ़्टवेयर प्रतिकृति में बहुत विश्वसनीय है, लेकिन हार्डवेयर डिवाइस (विशेष रूप से पहली पीढ़ी) में विनिर्माण मुद्दे हो सकते हैं। उस मामले में एक गलत परीक्षण विफलता या तो एक खराब एल्गोरिदम का संकेत दे सकती है या डिवाइस सही तरीके से इकट्ठा नहीं हुई है। क्या आपको उन दो मामलों के बीच अंतर करने की आवश्यकता है?
आपको यह भी विचार करना होगा कि आप परीक्षण प्रणालियों को स्वयं कैसे सत्यापित करने जा रहे हैं। कई परीक्षण मामलों के लिए एक वैध कारण मानते हुए, आपको बहुत अधिक स्वचालन की आवश्यकता होगी। यह सुनिश्चित करने के लिए कि आपके परीक्षण मामलों को उत्पन्न करने में कोई गलती न हो, उस स्वचालन का निरीक्षण किया जाना चाहिए। त्रुटियों के लिए स्पॉट चेक सही मायने में घास का मैदान में सुई खोजने के बराबर होगा।
यह अर्स्टेक्निका लिंक आपके परीक्षण के विचारों पर कुछ अंतर्दृष्टि नहीं बहा सकता है या नहीं। GPU क्लस्टर आमतौर पर ब्रूट-फोर्स क्रैकिंग पासवर्ड के लिए उपयोग किया जाता है। एक लेख में उद्धृत किया जा सकता है can cycle through as many as 350 billion guesses per second
, इस तरह से यह आपके 65B परीक्षणों को परिप्रेक्ष्य में रखता है। यह एक अलग डोमेन होने की संभावना है, लेकिन यह दिखाता है कि अलग-अलग कोणों से कैसे काम करना एक व्यवहार्य समाधान पैदा कर सकता है।
मुझे नहीं लगता कि 6.5e + 10 को बनाए रखना संभव है, यह पहली जगह है, इसलिए इन्हें चलाना मूट हो सकता है। यहां तक कि सबसे बड़ी परियोजनाएं, जैसे डेबियन अपने सभी पैकेजों के साथ, केवल कई सौ मिलियन एसएलओसी हैं।
लेकिन अगर आपको किसी भी तरह की बड़ी संख्या में परीक्षण चलाना है, तो कुछ रणनीतियां हैं।
उन सब को मत चलाना। सबसे शायद हर परीक्षण हर कोड पथ पर निर्भर नहीं करता है। उप-प्रणालियों और उनके परीक्षणों के बीच और परीक्षण सूट के बीच निर्भरता को परिभाषित करें, और आप केवल एक विशेष परिवर्तन के लिए प्रासंगिक इकाई परीक्षण चला पाएंगे, इन इकाई परीक्षणों के आधार पर केवल एकीकरण परीक्षण।
उन्हें समानांतर में चलाएं। कोड बेस के साथ जो विशाल है, आपके पास संभवतः एक विशाल बिल्ड फार्म है (जेटब्रेन्स पर वापस, अपेक्षाकृत छोटा ऑपरेशन, हमारे पास आईडीईए निरंतर बिल्ड / इंटीग्रेशन फार्म पर चलने वाले 40-50 बिल्ड एजेंट होते थे)। चूंकि यूनिट परीक्षण स्वतंत्र हैं, और एकीकरण परीक्षण पहले से निर्मित कोड का पुन: उपयोग कर सकते हैं, इसलिए परीक्षण समानांतर रूप से आसान होते हैं।
जल्दी चलना बंद करो। यदि आप जानते हैं कि एक विशेष परीक्षण सूट किसी अन्य परीक्षण सूट की शुद्धता पर उचित कार्य के लिए निर्भर करता है, तो आप एक बार लिंक को विफल होने पर पूरी श्रृंखला काट सकते हैं।
अस्वीकरण: मैं एक पेशेवर परीक्षण इंजीनियर नहीं हूँ। नमक के एक दाने के साथ ऊपर ले लो।
यद्यपि यहां कई अच्छे सुझाव दिए गए हैं कि कैसे कम परीक्षणों के साथ चुपके से प्रयास करने के लिए, मुझे गंभीरता से संदेह है कि आपके सिस्टम में केवल 65 बिलियन इनपुट संयोजन हैं। यह 36 बिट से कम इनपुट है। मान लेते हैं कि आपने ऊपर दी गई सभी सलाह पहले ही ले ली थी।
यदि प्रत्येक परीक्षण को चलाने के लिए एक मिलीसेकंड के बारे में लगता है और आप केवल 10 प्रोसेसर (एक सामान्य पीसी) में परीक्षण वितरित करते हैं, तो परीक्षण 69 दिनों में थोड़ा चलेगा। यह एक समय है, लेकिन पूरी तरह से अनुचित नहीं है। 100 प्रोसेसर (एक दर्जन सामान्य पीसी या एक उचित सर्वर पीसी) में वितरित करें और परीक्षण 7 दिनों के भीतर पूरा हो जाएगा। आप इन्हें हर हफ्ते चला सकते हैं।