एक वैज्ञानिक कंप्यूटिंग पुस्तकालय के लिए इकाई परीक्षण


15

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

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

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

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

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

जवाबों:


19

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

आप कुछ तत्वों को नाम देते हैं जो परेशानी का कारण बन सकते हैं; यहाँ उनके बारे में क्या करना है:

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

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

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

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