2011-06-06 13 views
20

मैं उस समय को कम करना चाहता हूं जो हमारे निर्माण (चींटी का उपयोग करके) परीक्षण चलाने के लिए लेता है। वर्तमान में मैं डिफ़ॉल्ट forkMode का उपयोग कर रहा हूं, जो प्रत्येक टेस्ट क्लास (perTest) पर एक नया वीएम फोर्क करता है।जूनिट: फोर्कमोड = "एक बार" परीक्षण शुद्धता पर

मैं के बारे में forkMode="once" करने के लिए स्विच करने के लिए सोच रहा हूँ, लेकिन मैं को लेकर अनिश्चित हूं कि अगर यह इच्छा जोड़ी परीक्षण किसी भी तरह और शायद मेरी परीक्षण चलाने के बाद मुझे झूठी सकारात्मक और/या मिथ्या नकारात्मक परिणाम देती है।

सवाल:

  1. प्रत्येक परीक्षण का मामला इतना है कि पिछले रन से सभी स्थिर संदर्भ अब और सुलभ/दिखाई नहीं देते हैं एक नया classloader हो जाएगा?

  2. वहाँ अन्य बातों के परीक्षण तरीकों जो व्यवहार बदल सकते हैं (देशी पुस्तकालय लोड हो रहा है बगल में जो मैं उपयोग नहीं कर रहा)

  3. क्या कचरा संग्रहण/अंतिम रूप दिए जाने के बारे में, वे कर रहे हैं की निर्भरता/युग्मन का परीक्षण करने के लिए नेतृत्व जो कर रहे हैं प्रत्येक परीक्षण के बाद भागो? (मैं उन पर भरोसा नहीं है, लेकिन मैं सिर्फ एक पूरी तस्वीर प्राप्त करना चाहते हैं)


अद्यतन

वर्तमान जवाब के अनुसार ऐसा लगता है कि JUnit हमेशा के बीच एक भी classloader साझा कर रहा है फोर्कमोड का उपयोग करते समय प्रति vm/कांटा के सभी परीक्षण मामले।

यह कई फायदे हैं (तेज परीक्षण और परीक्षण स्थिर युग्मन के कारण विफल हो सकता है), लेकिन यह भी कुछ नुकसान (स्थिर युग्मन जो केवल काम करेगा (forkMode तो = "एक बार" वास्तव में वहाँ सभी परीक्षणों के लिए एक classloader का मतलब) यदि एक साझा classloader प्रयोग किया जाता है -> झूठी सकारात्मक)

+0

अद्यतन एक नए प्रश्न की तरह लगता है और मौजूदा उत्तरों को – oers

+0

अच्छा विचार से बाहर लगता है। नए प्रश्न यहां पाए जा सकते हैं: http://stackoverflow.com/questions/6321473/junit-how-to-avoid-false-positives-when-using-forkmode-once – MRalwasser

+0

आपका अपडेट थोड़ा भ्रामक है। JUnit 'forkMode = "का उपयोग करते समय सभी परीक्षण मामलों के बीच एक क्लासलोडर साझा कर रहा है, लेकिन अन्य फोर्क मोडेस नहीं, क्योंकि आप चल रहे वीएम –

उत्तर

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

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

+1

मैं ज्यादातर आपके कथन से सहमत हूं, हालांकि साझा स्थिर डेटा के परिणामस्वरूप झूठे सकारात्मक परिणाम हो सकते हैं जो भ्रम पैदा करता है कि सब कुछ ठीक है (स्थिर युग्मन के कारण जो इस मामले में नहीं मिलेगा) – MRalwasser

+0

यह सच है - मैं अक्सर खोज को समाप्त करता हूं जब अलगाव में भागते समय परीक्षण विफल रहता है। मुझे लगता है कि परीक्षण के आदेश यादृच्छिक करने के लिए एक मामला है। –

0

Stefan's blog entry इस बारे में को देखते हुए मुझे लगता है कि करने के लिए उद्यम होगा:

  1. आप केवल forkMode के लिए एक एकल वर्ग लोडर मिल जाएगा = "एक बार"
  2. आप चींटी enviro तक पहुंच नहीं होगी nment अब
  3. जीसी स्पॉन्टेड जीसी (यदि बलमोड = "एक बार") के अंदर किया जाएगा और इसका मतलब यह है कि प्रत्येक परीक्षण चलाने के बाद यह नहीं होता है।
+0

1. प्रविष्टि के किस भाग से आप निष्कर्ष निकालते हैं कि _all_ परीक्षणों के लिए केवल _one_ classloader साझा किया गया है? 2. चींटी पर्यावरण गुंजाइश से बाहर है (perTest भी फोर्क किया गया है)। 3. System.gc() को तत्काल लागू किया जा सकता है ... – MRalwasser

4

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

+0

डिफ़ॉल्ट फोर्कमोड के बारे में आपका कथन http://ant.apache.org/manual/Tasks/junit.html – MRalwasser

+1

के अनुसार सत्य नहीं है वास्तव में यह पृष्ठ ' "perTest" प्रत्येक टेस्टकेस क्लास के लिए एक नया वीएम बनाता है। ' जो मेरे अनुभव के साथ समझौता करता है। हालांकि, यह 'टेस्ट केस' का अर्थ है 'टेस्ट केस' कहीं और। ऐसा लगता है कि जुनीट डेवलपर्स हमेशा अपनी शब्दावली में लगातार नहीं रहे हैं। – Ben

+0

आह, मैं देखता हूं, इसे इंगित करने के लिए धन्यवाद, मैं सवाल अपडेट करूंगा। – MRalwasser

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