क्या मुझे अपने उपवर्गों या मेरे अमूर्त अभिभावक वर्ग का परीक्षण करना चाहिए?


12

मेरे पास एक कंकाल कार्यान्वयन है, जैसा कि प्रभावी जावा से आइटम 18 में (विस्तारित चर्चा यहां )। यह एक अमूर्त वर्ग है जो 2 सार्वजनिक विधियों मेथड () और मेथडब () प्रदान करता है जो उपवर्गों को "अंतराल को भरने" के लिए कॉल करता है जिसे मैं सार तरीके से परिभाषित नहीं कर सकता।

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

समय बीतता गया और अब मेरे पास 4 उपवर्ग हैं, जिनमें से प्रत्येक में 3 छोटे संरक्षित तरीके हैं जो उनके ठोस कार्यान्वयन के लिए बहुत विशिष्ट हैं, जबकि कंकाल का कार्यान्वयन सभी सामान्य कार्य करता है।

मेरी समस्या यह है कि जब मैं एक नया कार्यान्वयन बनाता हूं, मैं सभी परीक्षणों को फिर से लिखता हूं:

  • क्या उपवर्ग किसी दिए गए आवश्यक तरीके को कहता है?
  • क्या किसी दिए गए तरीके में एक एनोटेशन है?
  • क्या मुझे विधि A से अपेक्षित परिणाम मिलेंगे?
  • क्या मुझे विधि B से अपेक्षित परिणाम प्राप्त होंगे?

इस दृष्टिकोण के साथ लाभ देखें:

  • यह परीक्षणों के माध्यम से उपवर्ग आवश्यकताओं का दस्तावेज बनाता है
  • समस्या निवारण के मामले में यह तेजी से विफल हो सकता है
  • उपवर्ग को एक पूरे के रूप में और उनके सार्वजनिक एपीआई के माध्यम से परीक्षण करें ("मेथोडा () काम करता है?" और "संरक्षित पद्धति से काम नहीं करता है?")

मेरे पास समस्या यह है कि एक नए उपवर्ग के लिए परीक्षण मूल रूप से एक नो-ब्रेनर हैं: - परीक्षण सभी उपवर्गों में सभी समान हैं, वे सिर्फ रिटर्न प्रकार के तरीकों को बदलते हैं (कंकाल कार्यान्वयन सामान्य है) और गुण I परीक्षण के मुखर भाग पर जाँच करें। - आमतौर पर उपवर्गों के पास कोई परीक्षण नहीं है जो उनके लिए विशिष्ट हैं

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

वर्ग पदानुक्रम का परीक्षण करते समय क्या यह समस्या आम है? मैं इससे कैसे बच सकता हूं?

ps: मैंने कंकाल वर्ग के परीक्षण के बारे में सोचा था, लेकिन यह भी अजीब लगता है कि यह परीक्षण करने में सक्षम होने के लिए एक अमूर्त वर्ग का नकली बनाना। और मुझे लगता है कि उपवर्ग द्वारा अपेक्षित व्यवहार को बदलने वाले अमूर्त वर्ग पर किसी भी रिफैक्टिंग को उतनी तेजी से नहीं देखा जाएगा। मेरी हिम्मत मुझे बताती है कि उपवर्ग का परीक्षण "एक पूरे के रूप में" यहां पसंदीदा तरीका है, लेकिन कृपया मुझे यह बताने के लिए स्वतंत्र महसूस करें कि मैं बहुत अच्छा हूं :)

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

ps3: मुझे यह कहते हुए कुछ उत्तर मिले हैं कि "यह स्वीकार्य है" सार वर्ग का परीक्षण करने के लिए। मैं मानता हूं कि यह स्वीकार्य है, लेकिन मैं जानना चाहूंगा कि इस मामले में पसंदीदा तरीका क्या है (मैं अभी भी यूनिट परीक्षणों के साथ शुरू कर रहा हूं)


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

मैंने कहीं पढ़ा है कि किसी को परीक्षण पर वंशानुक्रम का उपयोग नहीं करना चाहिए, मैं इसे ध्यान से पढ़ने के लिए स्रोत की तलाश कर रहा हूं
JSBach

4
क्या आप इस सलाह के बारे में निश्चित हैं? यह भंगुर इकाई परीक्षणों के लिए एक नुस्खा की तरह लगता है, डिजाइन परिवर्तनों के लिए अत्यधिक संवेदनशील है और इसलिए बहुत बनाए रखने योग्य नहीं है।
कोनराड मोरावस्की

जवाबों:


5

मैं नहीं देख सकता कि आप एक सार आधार वर्ग के लिए परीक्षण कैसे लिखेंगे ; आप इसे तुरंत नहीं कर सकते, इसलिए आपके पास परीक्षण के लिए इसका उदाहरण नहीं हो सकता । आप इसे परीक्षण के प्रयोजनों के लिए एक "डमी", ठोस उपवर्ग बना सकते हैं - यह सुनिश्चित नहीं है कि इसका कितना उपयोग होगा। YMMV।

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


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

4

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

इस पद्धति के फायदे यह है कि क्योंकि आपने इंटरफ़ेस का परीक्षण किया है, आप अब इंटरफ़ेस के नीचे रिफ्लेक्टर कर सकते हैं। आप पा सकते हैं कि एक बच्चे की कक्षा में कोड माता-पिता में होना चाहिए, या इसके विपरीत। अब आपके परीक्षण साबित कर देंगे कि आपने उस कोड को स्थानांतरित करते समय व्यवहार को नहीं तोड़ा था।

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

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