आपके सवालों के जवाब
क्या बहुत सी इकाई परीक्षण होने जैसी कोई बात है?
बेशक ... आप उदाहरण के लिए, कई परीक्षण कर सकते हैं जो पहली नज़र में अलग-अलग प्रतीत होते हैं, लेकिन वास्तव में एक ही चीज़ का परीक्षण करते हैं (तार्किक रूप से परीक्षण के तहत "दिलचस्प" एप्लिकेशन कोड की समान लाइनों पर निर्भर करते हैं)।
या आप अपने कोड के इनरल्स का परीक्षण कर सकते हैं जो कभी भी सतह से बाहर की तरफ नहीं होते (यानी, किसी भी तरह के इंटरफ़ेस कॉन्ट्रैक्ट का हिस्सा नहीं हैं), जहां कोई इस बारे में बहस कर सकता है कि क्या समझ में आता है। उदाहरण के लिए आंतरिक लॉग संदेशों का सटीक शब्द या जो भी हो।
मुझे मौजूदा एप्लिकेशन के लिए यूनिट टेस्ट लिखने का काम सौंपा गया है। अपनी पहली फ़ाइल खत्म करने के बाद, मेरे पास मूल कोड की 419 लाइनों के लिए परीक्षण कोड की 717 लाइनें हैं।
यह मुझे काफी सामान्य मानता है। आपके परीक्षण वास्तविक परीक्षण के शीर्ष पर सेटअप और आंसू पर बहुत सारी लाइनें-ऑफ-कोड खर्च करते हैं। अनुपात में सुधार हो सकता है, या नहीं भी हो सकता है। मैं स्वयं काफी भारी परीक्षण कर रहा हूं, और अक्सर वास्तविक कोड की तुलना में परीक्षणों पर अधिक स्थान और समय का निवेश करता हूं।
क्या यह अनुपात हमारे कोड कवरेज को बढ़ाने के साथ असहनीय हो रहा है?
अनुपात इतने में कारक नहीं है। परीक्षणों के अन्य गुण हैं जो उन्हें असहनीय बनाते हैं। यदि आपको नियमित रूप से अपने कोड में सरल बदलाव करते समय परीक्षणों की एक पूरी गुच्छा को रिफ्लेक्टर करना है, तो आपको कारणों पर एक अच्छा विचार करना चाहिए। और वे नहीं हैं कि आपके पास कितनी लाइनें हैं, लेकिन आप परीक्षणों के कोडिंग के लिए कैसे दृष्टिकोण करते हैं।
इकाई परीक्षण की मेरी समझ यह सुनिश्चित करने के लिए कक्षा में प्रत्येक विधि का परीक्षण करना था कि हर विधि अपेक्षित रूप से काम करती है।
यह सख्त अर्थों में "यूनिट" परीक्षणों के लिए सही है। यहाँ, "यूनिट" एक विधि या वर्ग की तरह कुछ है। "यूनिट" परीक्षण का बिंदु केवल कोड की एक विशिष्ट इकाई का परीक्षण करना है, न कि पूरे सिस्टम का। आदर्श रूप से आप पूरे सिस्टम को हटा देंगे (डबल्स या व्हाट्सएप का उपयोग करके)।
हालाँकि, पुल अनुरोध में मेरी टेक लीड ने कहा कि मुझे उच्च स्तर के परीक्षण पर ध्यान देना चाहिए।
तब आप लोगों को यह मानने के चक्कर में पड़ गए कि यूनिट टेस्ट कहने पर लोगों को वास्तव में यूनिट टेस्ट का मतलब है । मैं कई प्रोग्रामर्स से मिला हूं जो कहते हैं कि "यूनिट टेस्ट" लेकिन इसका मतलब कुछ अलग है।
उन्होंने 4-5 उपयोग के मामलों का परीक्षण करने का सुझाव दिया, जो कि प्रत्येक फ़ंक्शन का परीक्षण करने के बजाय सामान्य रूप से प्रश्न में कक्षा के साथ सबसे अधिक उपयोग किया जाता है।
ज़रूर, बस 80% महत्वपूर्ण कोड पर ध्यान केंद्रित करने से लोड कम हो जाता है ... मैं सराहना करता हूं कि आप अपने बॉस के बारे में बहुत सोचते हैं, लेकिन यह मुझे सबसे ज्यादा पसंद नहीं है।
मेरे लिए, 100% यूनिट टेस्ट कवरेज एक बुलंद लक्ष्य है, लेकिन अगर हम केवल 50% तक पहुंच गए, तो हमें पता चलेगा कि उस 50% में से 100% कवर किया गया था।
मुझे नहीं पता कि "यूनिट टेस्ट कवरेज" क्या है। मेरा मानना है कि "कोड कवरेज" का मतलब है कि परीक्षण सूट चलाने के बाद, कोड की प्रत्येक पंक्ति (= 100%) को कम से कम एक बार निष्पादित किया गया है।
यह एक अच्छा बॉलपार्क मीट्रिक है, लेकिन अभी तक सबसे अच्छे मानक के लिए कोई भी गोली नहीं चला सकता है। बस कोड लाइनों को निष्पादित करना पूरी तस्वीर नहीं है; यह उदाहरण के लिए, जटिल, नेस्टेड शाखाओं के माध्यम से विभिन्न रास्तों के लिए जिम्मेदार नहीं है। यह एक मीट्रिक से अधिक है जो कोड के टुकड़ों पर अपनी उंगली को इंगित करता है जो बहुत कम परीक्षण किए जाते हैं (जाहिर है, यदि एक वर्ग 10% या 5% कोड कवरेज के रूप में है, तो कुछ गलत है); दूसरी ओर 100% कवरेज आपको यह नहीं बताएगा कि आपने पर्याप्त परीक्षण किया है या यदि आपने सही परीक्षण किया है या नहीं।
एकीकरण जांच
यह मुझे काफी हद तक परेशान करता है जब लोग डिफ़ॉल्ट रूप से आज यूनिट परीक्षण के बारे में बात कर रहे हैं । मेरी राय (और अनुभव) में, यूनिट परीक्षण पुस्तकालयों / एपीआई के लिए बहुत अच्छा है; अधिक व्यवसाय उन्मुख क्षेत्रों में (जहां हम हाथ में सवाल जैसे मामलों का उपयोग करने के बारे में बात करते हैं), वे जरूरी सर्वश्रेष्ठ विकल्प नहीं हैं।
सामान्य एप्लिकेशन कोड के लिए और औसत व्यवसाय में (जहां पैसा कमाना, डेडलाइन मारना और ग्राहकों की संतुष्टि को पूरा करना महत्वपूर्ण है, और आप मुख्य रूप से उन बगों से बचना चाहते हैं जो या तो सीधे उपयोगकर्ता के चेहरे पर हैं, या जो वास्तविक आपदाओं को जन्म दे सकते हैं - हम नहीं हैं बात करते हुए नासा रॉकेट यहां लॉन्च किया गया), एकीकरण या सुविधा परीक्षण बहुत अधिक उपयोगी हैं।
जो व्यवहार कुशल विकास या सुविधा प्रेरित विकास के साथ काम करते हैं; वे परिभाषा के अनुसार (सख्त) इकाई परीक्षणों के साथ काम नहीं करते हैं।
इसे (ईश) छोटा रखने के लिए, एक एकीकरण / सुविधा परीक्षण पूरे एप्लिकेशन स्टैक का अभ्यास करता है। एक वेब आधारित अनुप्रयोग में, यह एक ब्राउज़र आवेदन के माध्यम से क्लिक करने (और कोई, स्पष्ट रूप से यह नहीं है की तरह काम करते हैं है की जाँच - कि साधारण होने के लिए, वहाँ बहुत शक्तिशाली चौखटे कि ऐसा करने के लिए कर रहे हैं // ककड़ी: http। io एक उदाहरण के लिए)।
ओह, अपने अंतिम प्रश्नों का उत्तर देने के लिए: आप अपनी पूरी टीम को यह सुनिश्चित करने के लिए एक उच्च परीक्षण कवरेज देते हैं कि एक नई सुविधा केवल उसके फीचर परीक्षण के लागू होने और विफल होने के बाद प्रोग्राम की गई है। और हां, इसका मतलब है कि हर सुविधा। यह आपको 100% (सकारात्मक) फ़ीचर कवरेज की गारंटी देता है । यह परिभाषा के आधार पर गारंटी देता है कि आपके आवेदन की एक विशेषता कभी भी "चली नहीं जाएगी"। यह 100% कोड कवरेज की गारंटी नहीं देता है (उदाहरण के लिए, जब तक आप नकारात्मक सुविधाओं को सक्रिय रूप से प्रोग्राम नहीं करते हैं, तब तक आप अपनी त्रुटि को संभालने / लागू करने के अभ्यास नहीं करेंगे)।
यह आपको बग-मुक्त एप्लिकेशन की गारंटी नहीं देता है; निश्चित रूप से आप स्पष्ट या बहुत खतरनाक छोटी परिस्थितियों, गलत उपयोगकर्ता इनपुट, हैकिंग (उदाहरण के लिए, सत्र प्रबंधन, सुरक्षा और इस तरह) आदि के लिए फीचर टेस्ट लिखना चाहते हैं; लेकिन यहां तक कि केवल सकारात्मक परीक्षणों को प्रोग्रामिंग करने का एक जबरदस्त लाभ है और आधुनिक, शक्तिशाली रूपरेखाओं के साथ काफी संभव है।
फ़ीचर / एकीकरण परीक्षणों में स्पष्ट रूप से कीड़े की अपनी इच्छा हो सकती है (उदाहरण के लिए, प्रदर्शन, 3 पार्टी फ्रेमवर्क का निरर्थक परीक्षण; चूंकि आप आमतौर पर डबल्स का उपयोग नहीं करते हैं, वे भी मेरे अनुभव में, ...) लिखने के लिए कठिन हो जाते हैं। d किसी भी दिन 100% कोड-कवरेज-यूनिट-परीक्षण किए गए एप्लिकेशन (लाइब्रेरी नहीं!) पर 100% सकारात्मक-फ़ीचर-परीक्षणित एप्लिकेशन लें।