2010-09-15 17 views
7

मैं कवरेज विश्लेषण के लिए एक्लेमा का उपयोग कर रहा हूं।EclEmma क्यों सिंक्रनाइज़ (MyClass.class) को कवर नहीं करता है?

मेरा जावा कोड एक सिंक्रनाइज़ (MyClass.class) {} ब्लॉक शामिल है।

ईक्लेमा का कहना है कि यह केवल आंशिक रूप से कवर किया गया है, हालांकि मुझे एक यूनिट परीक्षण मिला है जिसमें एक धागा का उपयोग हो जाता है और दूसरा धागा अवरुद्ध हो जाता है।

क्या एक्लेम्मा का उपयोग करके सिंक्रनाइज़ किए गए पूर्ण कवरेज को प्राप्त करना संभव है?

क्या मैं इस लाइन को पूर्ण कवरेज देने के लिए एक्लेमा को बताने के लिए कोड को एनोटेट कर सकता हूं?

तरह का संबंध रोजर

उत्तर

6

मैं इसे issue 2939804 रिपोर्ट के बाद से, एक पूर्ण कवरेज पाने के लिए संभव है यकीन नहीं है:

एम्मा हमेशा के निशान synchronized(..)के रूप में आंशिक रूप से कवर

उदाहरण:

synchronized (lock) // partially covered (yellow line in EclEmma) 
{ 
// ... 
} 
synchronized (this) // partially covered (yellow line in EclEmma) 
{ 
// ... 
} 

शायद एक अलग उपकरण (like Cobertura) एक अलग परिणाम देगा? (मैंने हाल ही में इसका परीक्षण नहीं किया है)।


अद्यतन दिसंबर 2012 (अधिक से अधिक 2 साल बाद):

Nathan D Ryanreports:

synchronized हरे रंग के जलाएगी अगर सिंक्रनाइज़ ब्लॉक कोड है कि एक वस्तु मॉनिटर पर इंतजार कर रहा है शामिल है, और एक परीक्षण प्रतीक्षा थ्रेड में बाधा डालता है।

थोड़ा प्रयोग करने के बाद, synchronized लाइन का पूरा कवरेज प्राप्त करने में सक्षम था अगर synchronized ब्लॉक सामान्य रूप से पूरा हो गया और अपवाद के कारण अचानक समाप्त हो गया।

+0

ऐसा लगता है कि आप सही हैं। मैंने कोशिश की: ऑब्जेक्ट सिंच = MyClass.class; सिंक्रनाइज़ (synch) {} लेकिन इससे मदद नहीं मिली, भले ही मेरे परीक्षण में एक थ्रेड प्रतीक्षा हो और दूसरा थ्रेड म्यूटेक्स प्राप्त कर रहा हो। –

+2

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

+1

थोड़ा प्रयोग करने के बाद, अगर सिंक्रनाइज़ किए गए ब्लॉक सामान्य रूप से पूर्ण हो गए * और * अपवाद के कारण अचानक समाप्त हो गया, तो मैं 'सिंक्रनाइज़' लाइन का पूरा कवरेज प्राप्त करने में सक्षम था। –

0

मेरा मानना ​​है कि समस्या MyClass.class जो जाहिरा तौर पर एक छिपा Class.forName के कारण

http://emma.sourceforge.net/faq.html#q.fractional.examples

अंतर्निहित शाखाओं का उपयोग कर कार्यान्वित किया जाता है है()। यह मामला बल्कि दुर्भाग्यपूर्ण है क्योंकि यह बहुत आम है और फिर भी प्रोग्रामर पर इसका कोई नियंत्रण नहीं है।

क्योंकि क्लास.forनाम() चेक अपवाद फेंक सकता है, संकलक एक कैच ब्लॉक उत्सर्जित करता है जो उन्हें अनचेक के रूप में पुनर्स्थापित करता है। यह कैच ब्लॉक अभ्यास में शायद ही कभी निष्पादित करता है, लेकिन यह आंशिक रूप से कवर के रूप में लाइन को चिह्नित करने में सफल होता है।

मुझे पहले पढ़ने-पढ़ने पर याद आया।

मैं पूर्ण कवरेज प्राप्त करने के लिए अपना कोड दोबारा लिखने की कोशिश करूंगा।

/रोजर

1

EclEmma कवरेज के विश्लेषण के लिए नीचे Jacoco उपयोग करता है।

के रूप में विस्तार से बताया Jacoco के (वर्तमान में गैर मौजूदा) JAVAC.SYNC filtering option, व्यवहार सिंक्रनाइज़ ब्लॉकों के लिए उत्पन्न बाइट कोड का परिणाम है:

एक जावा सिंक्रनाइज़ ब्लॉक दो बाईटकोड निर्देश में संकलित किया जाता है: पर MONITORENTER ब्लॉक के अंत में शुरुआत और मॉनिटरेटिट।

यह सुनिश्चित करने के लिए कि किसी भी मामले में मॉनिटर जारी किया गया है, एक अपवाद हैंडलर स्थापित है जो किसी अन्य मॉनिटरेट निर्देश को इंगित करता है। यह अपवाद हैंडलर ब्लॉक आमतौर पर आंशिक रेखा कवरेज का कारण बनता है जो स्रोत कोड बिंदु दृश्य से समझ में नहीं आता है।

इससे संबंधित एक Jacoco issue 245 बताते हैं कि कैसे कुछ अपवाद भी पूर्ण कवरेज तक पहुँचने के लिए इस, वांछित किया जाना चाहिए के रूप में भी @ नाथन-रयान द्वारा समझाया शुरू किया जा सकता:

  1. एक परीक्षण है कि सिंक्रनाइज़ ब्लॉक सामान्य रूप से कार्यान्वित
  2. एक दूसरा परीक्षण जो सिंक्रनाइज़ ब्लॉक के भीतर से एक अपवाद फेंकता है (और इसलिए अपेक्षा करता है)।
+1

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