2012-03-02 14 views
16

मेरे पास एक परीक्षण केस है जहां मैं एक इकाई जोड़ता हूं, इसे अद्यतन करता हूं और इसे हटा देता हूं। इसलिए, निष्पादन का आदेश यहां महत्वपूर्ण है। मैं इसे होना चाहते हैं:जुनीट परीक्षण मामले में निष्पादन का आदेश निर्दिष्ट करना

  1. बनाएं
  2. अद्यतन
  3. हटाएँ

बात यह सिर्फ एक परीक्षण का मामला (15 में से) के लिए, JUnit निम्न क्रम में वह निष्पादित:

  1. अद्यतन
  2. बनाएँ।

मैं जुनीट को एक विशिष्ट क्रम में निष्पादित करने के लिए कैसे कहूं? अन्य मामलों में, जुनीट पूरी तरह से ठीक काम करता है (क्रमशः निष्पादित)। और इस मामले में जुनीट अजीब तरीके से क्यों व्यवहार करता है?

प्रासंगिक कोड नीचे टुकड़ा:

private static Date date; 
    private static int entity; 
    static Parking p; 
    public ParkingTests(String name) { 
     super(name); 
    } 
    public void testAdd() throws Exception { 
      //Add code here 
    } 
    public void testUpdate() throws Exception { 
      //update code here 
    } 
    public void testDelete() throws Exception { 
      //delete code here 
    } 
    } 

यह weirder हो जाता है। मैं एक सूट के हिस्से के रूप में कई परीक्षण मामलों चलाता हूं। अगर मैं केवल पार्किंग मामले चलाता हूं, तो आदेश बनाए रखा जाता है। अगर मैं इसे दूसरों के साथ चलाता हूं, तो कभी-कभी इसे बनाए रखा जाता है, कभी-कभी नहीं!

+1

क्या आप इस कक्षा का स्रोत कोड दिखा सकते हैं? –

+1

एक टेस्ट क्लास टेस्ट क्लास में विधियों में से एक होगा। अपने परीक्षणों को एक निश्चित निष्पादन आदेश पर निर्भर करते हुए एक अच्छा अभ्यास नहीं है, जैसा कि यहां विस्तारित किया गया है: http://stackoverflow.com/q/3693626/422353 – madth3

+0

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

उत्तर

17

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

public void testAdd() throws Exception { 
     // wipe database 
     // add something 
     // assert that it was added 
} 
public void testUpdate() throws Exception { 
     // wipe database 
     // add something 
     // update it 
     // assert that it was updated 
} 
public void testDelete() throws Exception { 
     // wipe database 
     // add something 
     // delete it 
     // assert that it was deleted 
} 

विकल्प कई का दावा है के साथ एक परीक्षण में सब कुछ रहना है, लेकिन इस बात को समझ और बनाए रखने के लिए कठिन है, और जब एक परीक्षण में विफल रहता है थोड़ा कम जानकारी देता है:

public void testCRUD() throws Exception { 
     // wipe database 
     // add something 
     // assert that it was added 
     // update it 
     // assert that it was updated 
     // delete it 
     // assert that it was deleted 
} 

परीक्षण डेटाबेस के साथ या संग्रह या किसी भी प्रकार का भंडारण मुश्किल है क्योंकि एक परीक्षण डेटाबेस/संग्रह में पीछे जंक छोड़कर अन्य परीक्षणों को हमेशा प्रभावित कर सकता है। यहां तक ​​कि यदि आपके परीक्षण एक-दूसरे पर स्पष्ट रूप से भरोसा नहीं करते हैं, तो भी वे एक दूसरे के साथ हस्तक्षेप कर सकते हैं, खासकर अगर उनमें से एक विफल हो जाता है।

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

अद्यतन: आमतौर पर परीक्षण की शुरुआत में डेटा मिटा देना बेहतर होता है, इसलिए एक विफल परीक्षण रन अगले रन को प्रभावित नहीं करता है।

+0

मैं आपके दूसरे सुझाव का उपयोग कर सकता हूं और उन सभी को एक परीक्षण में लिख सकता हूं, लेकिन जैसा कि आपने कहा, बनाए रखना मुश्किल है। इसके अलावा मेरे अधिकांश परीक्षण इस तरह से लिखे गए हैं (1 फिर 2 फिर 3) और केवल यह समस्याएं दे रहा है! (और हाँ, मैं हर बार एक स्वच्छ डीबी का उपयोग करता हूं। ऐसी कोई समस्या नहीं) – crazyaboutliv

+0

@crazyaboutliv: मैं कहूंगा कि आप जिस तरह से कर रहे हैं, उसे निष्पादित किए जा रहे परीक्षणों पर भरोसा न करें। चूंकि जूनिट डॉक्टर स्वयं कहता है कि परीक्षण विधि निष्पादन आदेश की गारंटी नहीं है। इसके अलावा मैंने उन मामलों को देखा है जहां आईडीई से चलने पर जूनिट परीक्षण पास होते हैं लेकिन निर्माण के हिस्से के रूप में चलाने में असफल होते हैं। और कोई भी इस तरह की स्थितियों में नहीं जाना चाहता। –

+0

@DNA आपका उत्तर एक ही तालिका के लिए अच्छा है जहां सीआरयूडी से पहले मानों को सम्मिलित करना सेटअप() में जोड़ा जा सकता है, लेकिन क्या होगा यदि मेरे पास परीक्षण करने के लिए 1 से अधिक तालिकाएं हों? मेरे पास सेट अप() और tearDown() में जाने वाली सभी तालिकाओं के लिए सामान्य कार्य नहीं हो सकते हैं। – Prudhvi

19

आम तौर पर जूनिट परीक्षण (परीक्षण विधियों) एक दूसरे पर निर्भर नहीं होना चाहिए। निम्नलिखित प्रत्येक परीक्षा अन्य परीक्षणों द्वारा किए गए परिवर्तन से परीक्षण को अलग करने के लिए अपने स्वयं के परीक्षण स्थिरता में चलाता से junit FAQ

लिया जाता है। यही है, परीक्षण परीक्षण स्थिरता में वस्तुओं की स्थिति साझा नहीं करते हैं। चूंकि परीक्षण अलग-अलग होते हैं, वे किसी भी क्रम में चलाए जा सकते हैं ...... परीक्षण-विधि आमंत्रण का क्रम गारंटी नहीं है।

तो फिर तुम कर सकते हो अगर तुम कुछ सामान्य प्रारंभ सामान करना चाहता हूँ कि विधि @Before और @After साथ एनोटेट विधि में सफाई के साथ एनोटेट में। अन्यथा यदि आपकी परीक्षा कक्षा में सभी परीक्षण विधियों के लिए प्रारंभिकरण की आवश्यकता नहीं है तो आप इसे निजी तरीकों से डाल सकते हैं और उन्हें अपने परीक्षणों से उचित रूप से कॉल कर सकते हैं।

एक तरफ ध्यान दें, यदि आप अभी भी परीक्षणों का ऑर्डर करना चाहते हैं तो आप TestNG पर एक नज़र डाल सकते हैं। लेकिन ध्यान रखें कि दोहराव से ज्यादातर setUp और tearDown (@Before में बाहर निकाला जा सकता है -

0

आप क्या कर सकते हैं:

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

आप क्रम में "बस के रूप में वे अपने स्रोत कोड में पेश" JUnit परीक्षण चलाने के लिए चाहते हैं, मेरी टिप्पणी इस बारे में यहाँ देखें:

How to run junit tests in order as they present in your source code

लेकिन यह वास्तव में एक अच्छा नहीं है विचार, परीक्षण स्वतंत्र होना चाहिए।

+0

या आप सिर्फ एक टेस्ट सूट परिभाषित कर सकते हैं .. जो बहुत आसान और आसान है। –

+0

@ थॉमस डब्ल्यू आपके पास पहले से 5000+ परीक्षण होने पर आसान नहीं है ... – kornero

5

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

तो अगर हम इस किया था:

@Test 
public void first(){...} 

@Test 
public void second() {...} 

@Test 
public void third() {...} 

हम क्या क्रम में वे में चलेंगे हम उम्मीद कर रहे हैं क्योंकि वे क्रम में चलते पता नहीं है, और हम शायद दूसरे या तीसरे, तो उनका प्रदर्शन परेशान नहीं करना चाहिए। पिछले एक (रों) में विफल रहा है कि हम इस के बजाय कर सकते हैं,:,

@Test 
public void firstThree(){ 
    first(); 
    second(); 
    third(); 
} 

public void first(){...} 
public void second() {...} 
public void third() {...} 

ध्यान दें कि इस समय हम केवल @Test एक है और यह आदेश देने की गारंटी देता है।

11

यदि आप निर्धारित हैं कि आप अपने परीक्षणों के लिए निष्पादन का आदेश चाहते हैं, तो जुनीट 4.11 अब एनोटेशन के माध्यम से इसका समर्थन करता है। अधिक चर्चा के लिए this thread देखें - मूल रूप से, आप कुछ परीक्षण आदेश इस तरह की गारंटी करने के

@FixMethodOrder 

का प्रयोग करेंगे। हालांकि यह निराश है।

6

यदि आप जावा 7 का उपयोग कर रहे हैं तो आपको पता होना चाहिए कि जूनिट को java.lang.Class से "विधि [] getDeclaredMethods()" का उपयोग करके सभी परीक्षणों की सूची मिलती है। आप इस विधि के जवाडोक से या जूनिट डॉक्स से पढ़ सकते हैं कि: "लौटाए गए सरणी में तत्व सॉर्ट नहीं किए गए हैं और किसी भी विशेष क्रम में नहीं हैं।", लेकिन पिछले जेवीएम कार्यान्वयन विधियों की सूची में वे आदेश दिए गए थे सोर्स कोड।

यह blog से लिया गया था और वह एक कार्य प्रदान करता है।

+0

नोट: ब्लॉग जिसे आप संदर्भित कर रहे हैं वह किसी ऐसे व्यक्ति द्वारा लिखा गया था [पहले से ही आपके द्वारा उत्तर दिया गया था] (http://stackoverflow.com/a/ 13265376/365237) – eis

+0

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

संबंधित मुद्दे