एक निष्पादन योग्य में सभी इकाई परीक्षण, या उन्हें विभाजित?


12

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

कारण मैं पूछ रहा हूँ क्योंकि मैं वर्तमान में काम कर रहा हूँ एक पुस्तकालय का परीक्षण करने के लिए CUnit का उपयोग कर रहा हूँ। परीक्षणों को अलग-अलग सुइट्स में विभाजित किया जाता है जो विफलताओं के लिए मुद्रित आउटपुट के साथ एक निष्पादन योग्य में संकलित किए जाते हैं। अब, उस लाइब्रेरी के लिए बिल्ड सिस्टम CMake है (जो कि उसके नाम के बावजूद, CUnit के साथ बहुत कम संबंध रखता है), जो कि अपने स्वयं के परीक्षण ढांचे, CTest के साथ आता है । CTest मुझे परीक्षण के रूप में कार्य करने वाले निष्पादन योग्य की एक सूची को पंजीकृत करने की अनुमति देता है।

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

मुझे लगता है कि यह एक सवाल है कि किस उपकरण का उपयोग किया जाए और उनकी हैंडलिंग और परंपराएं, लेकिन इसके अलावा, क्या कोई अन्य कारण हैं जो अलग-अलग लोगों पर एक एकल परीक्षण निष्पादन योग्य पसंद करते हैं? या ठीक इसके विपरीत?


उन्हें कक्षा द्वारा अलग-अलग निष्पादनयोग्य में अलग करें। प्रत्येक कक्षा का अपना इकाई परीक्षण होना चाहिए, जब तक कि कक्षा इकाई परीक्षण योग्य न हो और इस प्रकार परोक्ष रूप से अन्य कक्षाओं द्वारा परीक्षण किया जाना चाहिए।
ब्रायन

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

यह इतना बड़ा नहीं है। 20 से कम मॉड्यूल। मैं उन सभी को एक ही झंडे के साथ संकलित करने में सक्षम हूं, इसलिए सीएमके मेरी ओर से बहुत काम किए बिना मेकफाइल्स उत्पन्न कर सकता है।
बेंजामिन क्लॉस्टर

जवाबों:


5

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

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


भाषा अज्ञेय तर्क एक बहुत अच्छा बिंदु है, क्योंकि मैं सड़क के नीचे पुस्तकालय के लिए अजगर बाइंडिंग को लागू करने की योजना बना रहा हूं। धन्यवाद!
बेंजामिन क्लोस्टर

@ निर्माता: कोई विशेष परीक्षण ढांचा?
JBRWilkinson

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

2

मेरे पास एक अनुप्रयोग के इकाई परीक्षणों के लिए (या आमतौर पर साझा किए जाने वाले पुस्तकालयों के पैकेज के लिए एक पुस्तकालय है)। उस पुस्तकालय के भीतर, मैं परीक्षण जुड़नार के लिए परीक्षण के तहत वस्तुओं के नाम स्थान को दोहराने या अनुमानित करने की कोशिश करता हूं (मैं ज्यादातर NUnit का उपयोग करता हूं)। यह संकलन को सरल बनाता है, क्योंकि .NET में प्रत्येक बाइनरी के निर्माण में एक ओवरहेड निहित है, जो एक ही LOC के साथ 10-प्रोजेक्ट समाधान पर 20-प्रोजेक्ट समाधान के बिल्ड समय को बढ़ाएगा। टेस्ट बायनेरिज़ वैसे भी वितरित नहीं किए जाते हैं, इसलिए बायनेरिज़ में परीक्षणों का कोई भी संगठन आपकी अपनी सुविधा के लिए है, और मुझे आमतौर पर लगता है कि YAGNI यहां कहीं भी लागू होता है।

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


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