आप अपने जावा प्रोजेक्ट्स के लिए कौन से कोड विश्लेषण टूल का उपयोग करते हैं? [बन्द है]


117

आप अपने जावा प्रोजेक्ट्स पर किस कोड विश्लेषण उपकरण का उपयोग करते हैं?

मुझे हर तरह से दिलचस्पी है

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

यदि लागू हो, तो यह भी बताएं कि आप किस टूल का उपयोग करते हैं और ये टूल आपके IDEs और बिल्ड टूल्स दोनों के साथ कैसे एकीकृत होते हैं।

यदि कोई टूल केवल एक विशिष्ट तरीके से उपलब्ध है (IDE प्लगइन के रूप में, या, एक बिल्ड टूल प्लगइन), तो वह सूचना भी ध्यान देने योग्य है।


UCDetector पर एक नज़र डालें: ucdetector.org
Christophe Roussy

म्यूटेशन टेस्ट कवरेज के लिए चेकआउट पिटस्ट में जाना
मुचाहो

जवाबों:


70

स्थैतिक विश्लेषण उपकरणों के लिए मैं अक्सर सीपीडी, पीएमडी , फाइंडबग्स और चेकस्टाइल का उपयोग करता हूं ।

CPD PMD "कॉपी / पेस्ट डिटेक्टर" टूल है। पीएमडी वेब पेज पर "फाइंडिंग डुप्लिकेट कोड" लिंक पर ध्यान देने से पहले मैं थोड़ी देर के लिए पीएमडी का उपयोग कर रहा था ।

मैं यह बताना चाहता हूं कि इन उपकरणों को कभी-कभी उनके "आउट-ऑफ-द-बॉक्स" नियमों के सेट से आगे बढ़ाया जा सकता है। और सिर्फ इसलिए नहीं कि वे खुले स्रोत हैं ताकि आप उन्हें फिर से लिख सकें। इनमें से कुछ उपकरण अनुप्रयोगों या "हुक" के साथ आते हैं जो उन्हें विस्तारित करने की अनुमति देते हैं। उदाहरण के लिए, पीएमडी "डिजाइनर" टूल के साथ आता है जो आपको नए नियम बनाने की अनुमति देता है। इसके अलावा, चेकस्टाइल में DescendantToken चेक है जिसमें ऐसे गुण हैं जो पर्याप्त अनुकूलन के लिए अनुमति देते हैं।

मैं इन उपकरणों को एक चींटी-आधारित निर्माण के साथ एकीकृत करता हूं । आप मेरी टिप्पणी विन्यास देखने के लिए लिंक का अनुसरण कर सकते हैं।

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

पहले, चेतावनी रिपोर्टों के लिए, मैं आउटपुट को परिवर्तित करता हूं ताकि प्रत्येक चेतावनी का सरल प्रारूप हो:

/absolute-path/filename:line-number:column-number: warning(tool-name): message

इसे अक्सर "Emacs प्रारूप" कहा जाता है, लेकिन भले ही आप Emacs का उपयोग नहीं कर रहे हों, यह रिपोर्ट को समरूप बनाने के लिए एक उचित प्रारूप है। उदाहरण के लिए:

/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.

मेरा चेतावनी प्रारूप रूपांतरण चींटी फ़िल्टरचैन के साथ मेरी चींटी स्क्रिप्ट द्वारा किया जाता है ।

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

उदाहरण के लिए, पीएमडी का डिफ़ॉल्ट कॉन्फ़िगरेशन NOPMDएक टिप्पणी में स्ट्रिंग " " के साथ कोड की तर्ज पर चेतावनी उत्पादन को दबा देता है। इसके अलावा, पीएमडी जावा के @SuppressWarningsएनोटेशन का समर्थन करता है । मैं पीएमडी को कॉन्फ़िगर करता हूं ताकि टिप्पणियों का उपयोग SuppressWarning(PMD.किया जा सके, NOPMDताकि पीएमडी शमन एक जैसे दिखें। मैं उस विशेष नियम को भरता हूं जिसमें टिप्पणी शैली के दमन का उपयोग करते समय उल्लंघन किया जाता है:

// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained

केवल " SuppressWarnings(PMD." भाग एक टिप्पणी के लिए महत्वपूर्ण है, लेकिन यह @SuppressWarningएनोटेशन के लिए पीएमडी के समर्थन के अनुरूप है जो नाम से व्यक्तिगत नियम उल्लंघन को पहचानता है:

@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended

इसी तरह, चेकस्टाइल टिप्पणियों के जोड़े के बीच चेतावनी उत्पादन को दबा देता है (कोई एनोटेशन समर्थन प्रदान नहीं किया जाता है)। डिफ़ॉल्ट रूप से, चेकस्टाइल को बंद करने के लिए टिप्पणियां CHECKSTYLE:OFFऔर CHECKSTYLE:ONक्रमशः तार और होते हैं। इस कॉन्फ़िगरेशन को बदलना (चेकस्टाइल के "SuppressionCommentFilter") के साथ स्ट्रिंग्स का उपयोग करने के लिए " BEGIN SuppressWarnings(CheckStyle." और " END SuppressWarnings(CheckStyle." नियंत्रण को पीएमडी की तरह दिखता है:

// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)

Checkstyle टिप्पणियों के साथ, विशेष रूप से जांच उल्लंघन ( HiddenField) है महत्वपूर्ण है क्योंकि प्रत्येक चेक अपने स्वयं के "है BEGIN/END" टिप्पणी जोड़ी।

फाइंडबग्स एक @SuppressWarningsएनोटेशन के साथ चेतावनी पीढ़ी के दमन का भी समर्थन करता है , इसलिए अन्य उपकरणों के साथ एकरूपता के कुछ स्तर को प्राप्त करने के लिए और अधिक कॉन्फ़िगरेशन की आवश्यकता नहीं है। दुर्भाग्य से, फाइंडबग्स को एक कस्टम @SuppressWarningsएनोटेशन का समर्थन करना पड़ता है क्योंकि अंतर्निहित जावा @SuppressWarningsएनोटेशन में एक SOURCEअवधारण नीति होती है जो क्लास फाइल में एनोटेशन को बनाए रखने के लिए पर्याप्त मजबूत नहीं होती है जहां फाइंडबग्स को इसकी आवश्यकता होती है। मैं Java के @SuppressWarningsएनोटेशन के साथ टकराव से बचने के लिए FindBugs चेतावनियों को पूरी तरह से योग्य बनाता हूं :

@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")

ये तकनीक चीजों को औजारों के पार सुसंगत बनाती है। ध्यान दें कि प्रत्येक चेतावनी दमन में स्ट्रिंग होती है " SuppressWarnings" संपूर्ण कोड आधार पर सभी उपकरणों के सभी उदाहरणों को खोजने के लिए एक सरल खोज को चलाना आसान बनाता है।


वाह, साझा करने के लिए सुंदर विस्तृत जवाब। धन्यवाद। मैं अपनी प्रथाओं को मेरी कोडिंग प्रथाओं में अनुकरण करने जा रहा हूं।
वत्सला

16

मैं कॉबर्टुरा, चेकस्टाइल, (Ecl) एम्मा और फाइंडबग्स के संयोजन का उपयोग करता हूं।

EclEmma एक भयानक ग्रहण प्लगइन है जो संपादक ( स्क्रीनशॉट ) में जावा स्रोत को रंगीन करके कोड कवरेज दिखाता है - कवरेज एक JUnit परीक्षण चलाकर उत्पन्न होता है। यह वास्तव में उपयोगी है जब आप यह पता लगाने की कोशिश कर रहे हैं कि कौन सी लाइनें किसी विशेष वर्ग में कवर की गई हैं, या यदि आप यह देखना चाहते हैं कि कौन सी लाइनें एकल परीक्षण द्वारा कवर की गई हैं। रिपोर्ट तैयार करने और फिर रिपोर्ट देखने के माध्यम से यह पता चलता है कि किन कक्षाओं में कम कवरेज है।

चेकस्टाइल और फाइंडबग्स एक्लिप्स प्लगइन्स भी उपयोगी हैं, वे टाइप करते ही संपादक में चेतावनी उत्पन्न करते हैं।

Maven2 में रिपोर्ट प्लगइन्स हैं जो बिल्ड टूल्स पर रिपोर्ट बनाने के लिए उपरोक्त टूल के साथ काम करते हैं। हम समग्र परियोजना रिपोर्ट प्राप्त करने के लिए इसका उपयोग करते हैं, जो जब आप कुल संख्या चाहते हैं तो अधिक उपयोगी होते हैं। ये हमारे CI बिल्ड द्वारा जेनरेट किए जाते हैं, जो कॉन्टिनम का उपयोग करके चलते हैं ।


1
वाह @ एक्लेम्मा! मैं एम्मा के बारे में जानता था, लेकिन ग्रहण में सही एकीकृत था? वह नियम।
जोशुआ मैककिनोन

3
कॉन्टिनम बेकार, हडसन नियम।
केन लियू

11

निम्नलिखित हम सभी का उपयोग करते हैं और हमारे मावेन 2.x बिल्ड और ग्रहण / RAD 7 दोनों में ईज़ी को एकीकृत करते हैं:

  • परीक्षण - JUnit / TestNG
  • कोड विश्लेषण - फाइंडबग्स, पीएमडी
  • कोड कवरेज - तिपतिया घास

इसके अलावा, हमारे मावेन बिल्ड में हमारे पास:

  • JDepend
  • टैग चेकर (TODO, FIXME, आदि)

इसके अलावा, यदि आप मावेन 2.x का उपयोग कर रहे हैं, कोडहॉस के पास अपने मोजो प्रोजेक्ट में आसान मावेन प्लगइन्स का संग्रह है ।

नोट: क्लोवर का बांस CI सर्वर (चूंकि वे दोनों एटलसियन उत्पाद हैं) के साथ आउट-ऑफ-द-बॉक्स एकीकरण है। फाइंडबग्स, पीएमडी और चेकस्टाइल के लिए भी बांस प्लग हैं, लेकिन जैसा कि उल्लेख किया गया है, मुफ्त हडसन सीआई सर्वर के पास भी हैं।


9

मैं IntelliJ IDEA में निर्मित स्थिर विश्लेषण का उपयोग करता हूं। सही एकीकरण।

मैं Intellij IDEA (EMMA पर आधारित) में निर्मित कोड कवरेज का उपयोग करता हूं। फिर, पूर्ण एकीकरण।

यह एकीकृत समाधान विश्वसनीय, शक्तिशाली और विभिन्न विक्रेताओं से एक साथ उपकरण पाइकिंग की तुलना में उपयोग में आसान है।


4

चेकस्टाइल एक और है जिसका उपयोग मैंने पिछली कंपनी में किया है ... यह मुख्य रूप से स्टाइल चेकिंग के लिए है, लेकिन यह कुछ स्थैतिक विश्लेषण भी कर सकता है। इसके अलावा, कोड कवरेज के लिए तिपतिया घास , हालांकि यह एक मुक्त उपकरण नहीं है जागरूक हो।


3

हम कोड कवरेज के लिए फाइंडबग्स और चेकस्टाइल के साथ-साथ क्लोवर का उपयोग कर रहे हैं।

मुझे लगता है कि आपके विकास का समर्थन करने के लिए किसी प्रकार का स्थैतिक विश्लेषण होना महत्वपूर्ण है। दुर्भाग्य से यह अभी भी व्यापक रूप से नहीं फैला है कि ये उपकरण महत्वपूर्ण हैं।


1

हम AntB के साथ एकीकृत FindBugs और JDepend का उपयोग करते हैं। हम JUnit का उपयोग करते हैं लेकिन हम किसी भी कवरेज टूल का उपयोग नहीं कर रहे हैं।

मैं इसे Rational Application Developer (IDE मैं J2EE एप्लिकेशन विकसित करने के लिए उपयोग कर रहा हूं) में एकीकृत नहीं कर रहा हूं क्योंकि मुझे पसंद है कि जब आप विंडोज कंसोल में javac चलाते हैं तो यह कितना साफ दिखता है। : पी


1

मुझे कोबर्टुरा के साथ अच्छी किस्मत मिली। यह एक कोड कवरेज टूल है जिसे आपकी सामान्य स्क्रिप्ट के भाग के रूप में आपकी चींटी स्क्रिप्ट के माध्यम से निष्पादित किया जा सकता है और इसे हडसन में एकीकृत किया जा सकता है।


1

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


1

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



0

मैं नए उपकरणों के बारे में जानने और एक प्रश्न / सूत्र में इस ज्ञान को समेकित करने के लिए कई उत्तरों की तलाश कर रहा हूं, इसलिए मुझे संदेह है कि इस प्रश्न का 1 सही उत्तर होगा।

मेरे अपने प्रश्न का उत्तर यह है कि हम उपयोग करते हैं:

  • सामान्य त्रुटियों को देखने के लिए फाइंडबग्स खराब / कोडिंग - मावेन से चलते हैं, और ग्रहण में आसानी से एकीकृत होते हैं
  • हमारी कवरेज रिपोर्टों के लिए कोबर्टा - मावेन से चला

हडसन के पास एक टास्क-स्कैनर प्लगइन भी है जो आपके TODO और FIXMEs की एक गिनती प्रदर्शित करेगा, साथ ही साथ यह दिखाएगा कि वे स्रोत फ़ाइलों में कहाँ हैं।

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

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