2012-12-23 27 views
6

वर्तमान में, मैं "कार्रवाई में जुनीट" पुस्तक पढ़ रहा हूं। इस पुस्तक में मैंने पाया नीचे पाठ:जुनीट: प्रत्येक @ टेस्ट विधि का आह्वान करने से पहले नया उदाहरण। क्या लाभ हैं?

JUnit प्रत्येक @Test विधि लागू करने से पहले परीक्षण वर्ग का एक नया उदाहरण बनाता है। यह परीक्षण विधियों और के बीच आजादी प्रदान करने में सहायता करता है परीक्षण कोड में अनजाने साइड इफेक्ट्स से बचाता है। चूंकि प्रत्येक टेस्ट विधि एक नए टेस्ट क्लास इंस्टेंस पर चलती है, इसलिए हम टेस्ट विधियों में उदाहरण परिवर्तनीय मानों का पुन: उपयोग नहीं कर सकते हैं।

अब मैं इस दृष्टिकोण में ज्यादा बात नहीं देख पा रहे हैं:

उदाहरण के लिए:

public class CalculatorTest { 
@Test 
public void testAdd_1() { 
Calculator calculator = new Calculator(); 
double result = calculator.add(1, 1); 
assertEquals(2, result, 0); 
} 
@Test 
public void testAdd_2() { 
Calculator calculator = new Calculator(); 
double result = calculator.add(2, 2); 
assertEquals(4, result, 0); 
} 

} 

परीक्षण वर्ग के लिए CalculatorTest वहाँ कोई लाभ नहीं है।

ठीक है, की सुविधा देता है एक और उदाहरण पर ध्यान देना जाना:

public class OneTest { 

    static byte count; 

    public OneTest() { 
     count++; 
    } 

    @Test 
    public void test1() { 
     System.out.println(count); 
    } 

    @Test 
    public void test2() { 
     System.out.println(count); 
    } 
} 

परीक्षण वर्ग के लिए OneTest मैं कई परीक्षण तरीकों के लिए एक ही चर गिनती उपयोग करने के लिए एक रास्ता मिल गया ...

तो

, कैसे पुस्तक में वर्णित दृष्टिकोण के वास्तविक लाभ देखने के लिए?

+1

यदि आप 'गिनती' फ़ील्ड के बारे में बात कर रहे हैं तो यह एक स्थिर क्षेत्र है। यह कक्षा की एक संपत्ति है और एक विशिष्ट उदाहरण नहीं है। यही कारण है कि आप इसके मूल्य में परिवर्तन देखते हैं। –

+0

@ बाबास्मिथ: आपको अपने उत्तर को अनावृत करना चाहिए (और शायद एक गैर स्थैतिक क्षेत्र के साथ एक उदाहरण दिखाकर थोड़ा और विस्तृत करें)। –

+0

पहला उदाहरण: हमारे पास परीक्षण विधियों के बीच कोई संबंध नहीं है। उस स्थिति में, प्रत्येक परीक्षण विधि को निष्पादित करने के लिए नया टेस्ट क्लास उदाहरण बनाना - कोई समझ नहीं। दूसरा उदाहरण: हम स्थैतिक चर के माध्यम से "अनजाने दुष्प्रभाव" प्राप्त कर सकते हैं। :)) लाभ कहां हैं? – user471011

उत्तर

14

पुस्तक में वर्णित दृष्टिकोण के वास्तविक लाभ कैसे देखें?

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

उदाहरण के लिए, वसंत लेनदेन प्रबंधन एक ही अनुबंध को बनाए रखने के लिए डिफ़ॉल्ट रूप से डेटाबेस द्वारा किए गए सभी परिवर्तनों को रोलबैक करना सुनिश्चित करता है।

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

2

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

आपके कैलक्यूलेटर उदाहरण में, ऐसा लगता है कि आपकी Calculator कक्षा अपरिवर्तनीय है और विधि कॉल के परिणाम केवल पैरामीटर पर निर्भर करते हैं। तो एक परीक्षण को प्रभावित करने वाले एक परीक्षण का जोखिम सिर्फ वहां नहीं है।

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

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

13

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

यह मुख्य कारणों में से एक था कि मैंने TestNG क्यों बनाया, जो प्रत्येक विधि के बीच एक नई कक्षा को तत्काल नहीं करता है, इसलिए आपको इस निर्णय को लागू करने के बजाय आपको विकल्प देता है।

टेस्टएनजी परीक्षणों, मल्टीथ्रेड परीक्षण की निर्भरताओं का भी समर्थन करता है, समूहों की धारणा है ("केवल सर्वलेट परीक्षण चलाएं") और कई और सुविधाएं।