क्या हम सॉफ़्टवेयर का परीक्षण करते समय यह मान सकते हैं कि उपयोगकर्ता सॉफ़्टवेयर पर ऐसी मूर्खतापूर्ण कार्रवाई नहीं करेगा?


71

उदाहरण के लिए: वेब एप्लिकेशन में किसी फॉर्म का कार्यात्मक परीक्षण करते समय, हम विभिन्न प्रकार के यादृच्छिक इनपुट मानों को दर्ज करके खेतों का परीक्षण करेंगे।

सामान्य तौर पर, हम वेब एप्लिकेशन के उपयोगकर्ता वास्तव में खेतों में यादृच्छिक मूल्यों को दर्ज नहीं करते हैं।

तो उन सभी वृषणों को शामिल करने का क्या उपयोग है जो बग को जन्म दे सकते हैं / नहीं कर सकते हैं, जब उत्पादन में इस तरह के मुद्दों के प्रकट होने की संभावना कम है?

नोट: उपरोक्त उदाहरण केवल एक नमूना मामला है; इस तरह के मुद्दे किसी भी तरह के फीचर / मॉड्यूल में हो सकते हैं।

मैं यह सवाल केवल यह जानने के लिए कर रहा हूं कि क्या कोई मानक व्यवहार का पालन करना है या यह पूरी तरह से उत्पाद, डोमेन और अन्य सभी कारकों पर निर्भर करता है।


4
शायद प्रासंगिक: बंदर परीक्षण , पेशेवरों और विपक्ष के साथ
क्राइस्टोपे

जवाबों:


190

आप वेब एप्लिकेशन के क्षेत्रों में यादृच्छिक मान दर्ज नहीं कर सकते हैं, लेकिन निश्चित रूप से वहां के लोग हैं जो ऐसा करते हैं।

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

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


16
और फिर ऐसी चीजें हैं जो ऐसा करने वाले लोग नहीं हैं । 👽
कोजिरो

110
या वे अपने वास्तविक कानूनी नाम, जैसे "ओ'माली", "be" या "रॉबर्ट ') में प्रवेश करने की कोशिश कर रहे हों ; ड्रॉप टेबल छात्र; - ”
l0b0

90
या हो सकता है वास्तविक कंपनी के नाम, ; DROP टेबल "कंपनियाँ"; - लि
बेन

25
मुझे लगता है कि अंतिम पैराग्राफ को मजबूत करके यह सुनिश्चित किया जा सकता है कि यदि कोई प्रोग्राम कीबोर्ड पर चलने वाली बिल्ली के यादृच्छिक इनपुट के साथ क्रैश हो जाता है, तो यह दुर्भावनापूर्ण इनपुट के साथ लगभग निश्चित रूप से क्रैश (और बदतर) होगा ।
फ़िहग

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

102

कभी भी कुछ न मानें

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

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

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

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

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

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

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


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

10
हमारे पास एक कहावत है: "बेवकूफ-प्रूफ सॉफ़्टवेयर लिखना बहुत मुश्किल है क्योंकि बेवकूफ ऐसे चतुर लोग हैं"। तो, "बकवास" इनपुट के लिए परीक्षण करें!
राल्फ क्लेरहॉफ

For example, a user may enter a malicious input which wipes the entire database - if you haven't explicitly protected against and tested for this scenario, then there's no way you can be sure whether or not this can happen.इस XKCD कॉमिक से छोटे बॉबी टेबल्स की तरह ? ;)
निक

12
"कभी कुछ मत मानो।" मुझे लगता है कि यह अच्छी सलाह है।
कैंडिड_ऑरेंज

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

60

खाते में लेने के कई कारक हैं। उन बिंदुओं को स्पष्ट करने के लिए, मैं एक ऐसे क्षेत्र का एक उदाहरण का उपयोग करूंगा, जहां उपयोगकर्ता को किसी विशिष्ट कार्य के लिए निर्धारित कोटा के संदर्भ में प्रतिशत दर्ज करना चाहिए जो कार्य का उपयोग कर सकता है। 0% का मतलब है कि कार्य डिस्क पर कुछ भी लिखने में सक्षम नहीं होगा; 100% का मतलब है कि कार्य सभी डिस्क स्थान को भर सकता है। बीच में मान का मतलब है कि वे क्या मतलब है।

एक डेवलपर के रूप में, आप शायद यह मान रहे हैं कि स्वीकार्य मूल्य [0, 1, 2, 3,, 99, 100] हैं, और बाकी सब कुछ मूर्खतापूर्ण है। आइए देखें कि उपयोगकर्ता अभी भी उन "मूर्खतापूर्ण" मूल्यों में क्यों प्रवेश कर सकते हैं।

लेखन त्रुटियां

%^

उपयोगकर्ता 56 मान दर्ज कर रहा था, लेकिन गलती से Shiftउन्हें दर्ज करते समय दबाया गया था (उदाहरण के लिए क्योंकि फ्रांसीसी कीबोर्ड पर, आपको Shiftअंकों को दर्ज करने के लिए दबाया जाता है, और उपयोगकर्ता लगातार एक फ्रेंच कीबोर्ड और QWERTY के बीच स्विच कर रहा था)।

उसी तरह, आप एक नंबर प्राप्त कर सकते हैं, इसके साथ या उससे पहले या बीच में कुछ:

56q

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

गलतफहमी और गलतफहमी

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

56.5

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

none

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

150

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

[____] % of disk space (2 TB)

जब उपयोगकर्ता टाइप करना शुरू कर देता है, तो यह मक्खी पर पाठ को बदल देगा।

[5___] % of disk space (102.4 GB of 2 TB)

अभ्यावेदन

फ्लोटिंग पॉइंट के साथ बड़ी संख्या या संख्या को अलग तरीके से दर्शाया जा सकता है। उदाहरण के लिए, एक संख्या 1234.56 इस तरह लिखी जा सकती है 1,234.56:। संस्कृति के आधार पर, समान संख्या का पाठ प्रतिनिधित्व अलग होगा। फ्रेंच में, एक ही नंबर इस तरह लिखा जाएगा: 1 234,56। देखें, एक अल्पविराम जहां आप एक और एक स्थान की उम्मीद नहीं करेंगे।

हमेशा एक विशिष्ट लोकेल का उपयोग करके एक विशिष्ट प्रारूप की अपेक्षा करना आपको जल्दी या बाद में परेशानी में डाल देगा, क्योंकि विभिन्न देशों के उपयोगकर्ताओं को संख्या, दिनांक और समय आदि लिखने की अलग-अलग आदतें होंगी।

इंसान बनाम कंप्यूटर

Twenty-four

साधारण मनुष्य कंप्यूटर के समान नहीं सोचते हैं। "चौबीस" है एक वास्तविक संख्या, स्वतंत्र रूप से क्या एक पीसी आपको बता जाएगा।

हालाँकि (1) अधिकांश प्रणालियाँ इस प्रकार के इनपुट को संभालती नहीं हैं और (2) लगभग हर उपयोगकर्ता पूर्ण अक्षरों में लिखे नंबर में प्रवेश करने की कल्पना नहीं करता है, लेकिन इसका मतलब यह नहीं है कि ऐसा इनपुट मूर्खतापूर्ण है। में चेहरा 3 के बारे में , एलन कूपर एक मुद्दा यह है कि इस तरह के निवेशों से निपटने नहीं मनुष्य के लिए अनुकूल करने के लिए, और आदर्श रूप में, इंटरफ़ेस सही ढंग से उन आदानों संभाल करने में सक्षम होना चाहिए कंप्यूटर की अक्षमता का संकेत है बनाता है।

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

यूनिकोड

5𝟨

यूनिकोड अपने स्वयं के आश्चर्य को आरक्षित करता है: जो अक्षर समान दिख सकते हैं, वे समान नहीं हैं। आश्वस्त नहीं? "5𝟨" === "56"अपने ब्राउज़र के डेवलपर टूल पर कॉपी-पेस्ट करें और दबाएँ Enter

वे तार समान नहीं होने का कारण यह है कि यूनिकोड वर्ण वर्ण 𝟨के समान नहीं है 6। यह एक ऐसी स्थिति पैदा करेगा जहां एक नाराज ग्राहक कॉल करेगा, यह बताएगा कि आपका ऐप काम नहीं कर रहा है, एक इनपुट का स्क्रीनशॉट प्रदान करता है जो वैध दिखता है, और आपका ऐप यह दावा करता है कि इनपुट अमान्य है।

कोई भी यूनिकोड वर्ण में क्यों प्रवेश करेगा जो अंक की तरह दिखता है, आप पूछेंगे? जब मैं किसी उपयोगकर्ता से अनजाने में प्रवेश करने की उम्मीद नहीं करता हूं, तो एक अलग स्रोत से कॉपी-पेस्ट का कारण बन सकता है, और मेरे पास एक ऐसा मामला था जहां उपयोगकर्ता वास्तव में एक स्ट्रिंग का ऐसा कॉपी-पेस्ट करता था जिसमें एक यूनिकोड चरित्र होता था जो नहीं होता था स्क्रीन पर दिखाई देते हैं।

निष्कर्ष

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

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


9
आह, यू + 1 डी 7 ई 8: मैथमैटिकल एसआईएस-सेरिफ़ डीआईजीआईटी सिक्स।
एंड्रियास रिब्रब्रांड

23
अन्य यूनिकोड चरित्र को फिर से लिखें: जापानी कीबोर्ड पर सामान्य अंकों से पूर्ण-चौड़ाई के अंकों पर स्विच करना बहुत आम है जहां एक अंक कांजी जितना चौड़ा होता है। तो एक जापानी उपयोगकर्ता के पास जापानी इनपुट हो सकता है (अंग्रेजी के बजाय) और गलती से पूर्ण-चौड़ाई अंक इनपुट हो सकता है।
जनवरी

3
समान सजातीय मुद्दे के बारे में आपके 5ph खंड को देखने से पहले, मैं वास्तव में एक 1 234,56स्ट्रिंग की उम्मीद कर रहा था (U + 00A0 NO-BREAK SPACE की बजाय U + 0020 SPACE का उपयोग करके), जो कि उन संख्या मार्करों को कोड करने का उचित तरीका है (या U + 202F के साथ) नरोव न-ब्रेक स्पेस, पेरोहैप्स)। किसी भी एप्लिकेशन से मूल्य को कॉपी करना जो उपयोगकर्ता को प्रस्तुत करने से पहले लोकेल के अनुसार संख्याओं को प्रारूपित करता है, बहुत आसानी से वह उत्पादन करेगा।
एंजेल

4
कॉपी-पेस्ट करना बहुत बड़ी मुसीबत है। कॉमन पेस्ट स्पेस, लाइन ब्रेक, अदृश्य पात्रों की नकल करना है ...
सुल्तान

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

12

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

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

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

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

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


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

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

2
@ ब्रेंडन: केवल एक संदेश की आवश्यकता है: "यह 1 और 100 के बीच की संख्या होनी चाहिए।" उपयोगकर्ता नहीं जानते (और जानने की आवश्यकता नहीं है) एक स्ट्रिंग क्या है, या "असमर्थित वर्ण" का क्या अर्थ है। वे प्रोग्रामर इंप्रेशन हैं, उपयोगकर्ता मदद नहीं।
रॉबर्ट हार्वे

@RobertHarvey मैं शायद उस बयान पर "अंकों से बना" की तर्ज पर कुछ जोड़ूंगा। क्योंकि इनपुट "सेवेंटी-नाइन" 1 और 100 के बीच की संख्या है, लेकिन ऐसा इनपुट नहीं है जिसके साथ अधिकांश प्रोग्राम काम कर सकें।
Delioth

1
@ डेलियोथ: आप बेवकूफ को ठीक नहीं कर सकते।
रॉबर्ट हार्वे

11

आमतौर पर 'यादृच्छिक' मान यादृच्छिक नहीं होते हैं। आप किनारे के मामलों को पकड़ने की कोशिश कर रहे हैं, "अज्ञात अज्ञात"।

उदाहरण के लिए कहो # चरित्र आप app दुर्घटना होगी। आप इसे पहले से नहीं जानते हैं और हर संभव इनपुट के लिए परीक्षण मामलों को लिखना असंभव होगा। लेकिन हम इसके लिए एक परीक्षण लिख सकते हैं "¬!"£$%^&*()_+-=[]{};'#:@~,./<>?|\"और देख सकते हैं कि क्या यह टूट जाता है


2
+1 यह आश्चर्यजनक रूप से पहली नज़र में है कि कितनी बार उन यादृच्छिक वर्णों को बग मिलेगा। उपयोगकर्ता इनपुट से डेटा कई घटकों / सेवा के माध्यम से बहुत सारी यात्रा कर सकता है। यह श्रृंखला में केवल एक घटक लेता है जो सिस्टम के बग को ठीक करने के लिए इसे संसाधित नहीं करता है।
Lan

4
esp। अब उस मोबाइल कीबोर्ड में सभी इमोटिकॉन्स हैं
इवान

.Net डेवलपर्स के लिए IntelliTest टूल (जिसे पहले Pex कहा जाता था) एज के मामलों को खोजने के लिए कोड रास्तों का उपयोग करने का वास्तव में अच्छा तरीका है, यह विशेष रूप से इनपुट सत्यापन में और अच्छे कोड कवरेज प्राप्त करने के लिए उपयोगी है।
जेम्स स्नेल

7

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

उसके बाद मैं एक दृष्टिकोण का पालन करता हूं: if "a very specific use case" do, else show error

यदि मेरे पास कई उपयोग के मामले हैं, तो मैं उन्हें सख्ती से परिभाषित करता हूं और उपरोक्त श्रृंखला करता हूं।


1
हालांकि, उन विशिष्ट उपयोग के मामले बहुत अच्छी तरह से विशिष्ट हो सकते हैं। हम हमेशा मान्य इनपुट के स्थान को कम आंकते हैं। (ओ'हारा, स्थानीय रूप से स्वरूपित दशमलव आदि)। नकारात्मक ब्याज दरों को संभालने के लिए कितने वित्तीय रूटीन तैयार किए गए थे?
गुरन

6

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

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

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

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

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


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

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


और वहाँ त्वरित जाँच परीक्षण उपकरण है जो इसी तरह की चीजें करते हैं
icc97

4

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

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

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

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


2
test every possible type of input that a user will be physically able to submit.- वह समस्या स्थान अनिवार्य रूप से अनंत है, और आप यह सब परखने की कोशिश करके अपना समय बर्बाद कर रहे हैं। नकारात्मक इनपुट के लिए जाँच करना एक एकल द्विभाजन है; यह न केवल समझदार है, बल्कि सक्षम डेवलपर्स से भी अपेक्षित है। आपको यह प्रमाणित करने के लिए प्रत्येक नकारात्मक संख्या की जाँच करने की आवश्यकता नहीं है कि इस तरह का सत्यापन कार्य करता है।
रॉबर्ट हार्वे

13
इसलिए मैंने हर प्रकार के इनपुट के बारे में कहा , न कि हर संभव इनपुट पर। और मैं अपनी बात दोहराऊंगा: यदि आप हर प्रकार के इनपुट का परीक्षण नहीं करते हैं, तो उपयोगकर्ता अंततः करेंगे।
अरकानोन

1

उदाहरण के लिए: वेब एप्लिकेशन में किसी फॉर्म का कार्यात्मक परीक्षण करते समय, हम विभिन्न प्रकार के यादृच्छिक इनपुट मानों को दर्ज करके खेतों का परीक्षण करेंगे।

हाँ। यह एक तरह का परीक्षण है लेकिन यह एक कार्यात्मक परीक्षण नहीं है । इसे ही तनाव परीक्षण कहा जाता है । यह एक प्रणाली पर दबाव लागू करने का कार्य है यह देखने के लिए कि क्या यह इसे संभाल सकता है।

तो उन सभी वृषणों को शामिल करने का क्या उपयोग है जो बग को जन्म दे सकते हैं / नहीं कर सकते हैं, जब उत्पादन में इस तरह के मुद्दों के प्रकट होने की संभावना कम है?

जब आप तनाव परीक्षण सॉफ़्टवेयर होते हैं तो आप उस सीमा की खोज करने की कोशिश कर रहे हैं जो सॉफ़्टवेयर की सीमाएँ हैं।

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

आप अपने सभी कार्यात्मक परीक्षण पास कर सकते हैं, लेकिन फिर भी तनाव परीक्षण विफल हो सकता है।

मैं यह सवाल केवल यह जानने के लिए कर रहा हूं कि क्या कोई मानक व्यवहार का पालन करना है या यह पूरी तरह से उत्पाद, डोमेन और अन्य सभी कारकों पर निर्भर करता है।

हां, यह एक मानक अभ्यास है।

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

तनाव परीक्षण स्पष्ट विशिष्ट पास या असफल संकेतक प्रदान नहीं करता है। परिणाम अधिक जानकारीपूर्ण हैं। यह बताता है कि आपका सिस्टम क्या संभाल सकता है और आप उस जानकारी से निर्णय ले सकते हैं।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.