คุณใช้เครื่องมือวิเคราะห์โค้ดอะไรสำหรับโปรเจ็กต์ Java ของคุณ [ปิด]


117

คุณใช้เครื่องมือวิเคราะห์โค้ดอะไรในโปรเจ็กต์ Java ของคุณ

ฉันสนใจทุกชนิด

  • เครื่องมือวิเคราะห์รหัสคงที่ (FindBugs, PMD และอื่น ๆ )
  • เครื่องมือครอบคลุมรหัส (Cobertura, Emma และอื่น ๆ )
  • เครื่องมือที่ใช้เครื่องมือวัดอื่น ๆ
  • อย่างอื่นถ้าฉันขาดอะไรไป

หากเป็นไปได้ให้ระบุเครื่องมือสร้างที่คุณใช้และเครื่องมือเหล่านี้ทำงานร่วมกับทั้ง IDE และเครื่องมือสร้างของคุณได้ดีเพียงใด

หากเครื่องมือมีให้ใช้งานเฉพาะทาง (เป็นปลั๊กอิน IDE หรือกล่าวว่าปลั๊กอินเครื่องมือสร้าง) ข้อมูลนั้นก็ควรค่าแก่การสังเกตเช่นกัน


ดู UCDetector ด้วย: ucdetector.org
Christophe Roussy

ไปที่จุดชำระเงินPitestสำหรับความครอบคลุมการทดสอบการกลายพันธุ์
mucaho

คำตอบ:


70

สำหรับเครื่องมือในการวิเคราะห์แบบคงที่ผมมักจะใช้ CPD, PMD , FindBugsและCheckstyle

CPD คือเครื่องมือ "Copy / Paste Detector" ของ PMD ผมใช้ PMD สำหรับเล็ก ๆ น้อย ๆ ในขณะที่ก่อนที่ผมสังเกตเห็นการเชื่อมโยง "Finding ซ้ำโค้ด"บนหน้าเว็บ PMD

ฉันอยากจะชี้ให้เห็นว่าบางครั้งเครื่องมือเหล่านี้สามารถขยายได้นอกเหนือจากชุดกฎที่ "ใช้งานได้ทันที" และไม่ใช่เพียงเพราะเป็นโอเพนซอร์สเพื่อให้คุณสามารถเขียนซ้ำได้ เครื่องมือเหล่านี้บางส่วนมาพร้อมกับแอปพลิเคชันหรือ "ตะขอ" ที่ช่วยให้สามารถขยายได้ ตัวอย่างเช่น PMD มาพร้อมกับเครื่องมือ "นักออกแบบ"ที่ช่วยให้คุณสร้างกฎใหม่ได้ นอกจากนี้ Checkstyle ยังมีการตรวจสอบ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.

คำเตือนการเปลี่ยนแปลงรูปแบบของฉันจะทำโดยสคริปต์มดของฉันกับมดfilterchains

"บูรณาการ" ที่สองที่ฉันทำคือการปราบปรามการเตือน โดยค่าเริ่มต้นเครื่องมือแต่ละตัวรองรับความคิดเห็นหรือคำอธิบายประกอบ (หรือทั้งสองอย่าง) ที่คุณสามารถวางไว้ในโค้ดของคุณเพื่อปิดปากคำเตือนที่คุณต้องการละเว้น แต่คำขอระงับคำเตือนต่างๆเหล่านี้ไม่มีรูปลักษณ์ที่สอดคล้องกันซึ่งดูเหมือนจะงี่เง่า เมื่อคุณระงับคำเตือนคุณกำลังระงับคำเตือนดังนั้นทำไมไม่เขียน " SuppressWarning?" เสมอไป

ตัวอย่างเช่นการกำหนดค่าเริ่มต้นของ PMD จะยับยั้งการสร้างคำเตือนในบรรทัดของโค้ดที่มีสตริง " NOPMD" ในข้อคิดเห็น นอกจากนี้ PMD ยังรองรับ@SuppressWarningsคำอธิบายประกอบของ Java ฉันกำหนดค่า PMD ให้ใช้ความคิดเห็นที่มี " SuppressWarning(PMD." แทนNOPMDเพื่อให้การปราบปราม PMD ดูเหมือนกัน ฉันกรอกกฎเฉพาะที่ละเมิดเมื่อใช้การระงับรูปแบบความคิดเห็น:

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

เฉพาะส่วน " SuppressWarnings(PMD." เท่านั้นที่มีความสำคัญสำหรับความคิดเห็น แต่สอดคล้องกับการสนับสนุนของ PMD สำหรับ@SuppressWarningคำอธิบายประกอบซึ่งยอมรับการละเมิดกฎแต่ละรายการตามชื่อ:

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

ในทำนองเดียวกัน Checkstyle จะยับยั้งการสร้างคำเตือนระหว่างคู่ความคิดเห็น (ไม่มีการสนับสนุนคำอธิบายประกอบ) ตามค่าเริ่มต้นความคิดเห็นในการปิดและเปิด Checkstyle จะมีสตริงCHECKSTYLE:OFFและCHECKSTYLE:ONตามลำดับ การเปลี่ยนการกำหนดค่านี้ (ด้วย "SuppressionCommentFilter" ของ Checkstyle) เพื่อใช้สตริง " BEGIN SuppressWarnings(CheckStyle." และ " END SuppressWarnings(CheckStyle." ทำให้การควบคุมดูเหมือน PMD มากขึ้น:

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

ด้วยความคิดเห็นของ Checkstyle การละเมิดเช็คโดยเฉพาะ ( HiddenField) มีความสำคัญเนื่องจากการตรวจสอบแต่ละรายการมีBEGIN/ENDคู่ความคิดเห็น " " ของตัวเอง

FindBugs ยังสนับสนุนการปราบปรามการสร้างคำเตือนด้วย@SuppressWarningsคำอธิบายประกอบดังนั้นจึงไม่จำเป็นต้องกำหนดค่าเพิ่มเติมเพื่อให้ได้ระดับความสม่ำเสมอกับเครื่องมืออื่น ๆ น่าเสียดายที่ Findbugs ต้องรองรับ@SuppressWarningsคำอธิบายประกอบแบบกำหนดเองเนื่องจากคำอธิบายประกอบ Java ในตัว@SuppressWarningsมีSOURCEนโยบายการเก็บรักษาซึ่งไม่รัดกุมเพียงพอที่จะเก็บคำอธิบายประกอบไว้ในไฟล์คลาสที่ FindBugs ต้องการ ฉันมีคุณสมบัติครบถ้วนในการระงับคำเตือนของ FindBugs เพื่อหลีกเลี่ยงการปะทะกับ@SuppressWarningsคำอธิบายประกอบของ Java :

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

เทคนิคเหล่านี้ทำให้สิ่งต่างๆดูสอดคล้องกันอย่างสมเหตุสมผลในเครื่องมือต่างๆ โปรดทราบว่าการระงับคำเตือนแต่ละรายการมีสตริง " SuppressWarnings" ทำให้ง่ายต่อการเรียกใช้การค้นหาอย่างง่ายเพื่อค้นหาอินสแตนซ์ทั้งหมดสำหรับเครื่องมือทั้งหมดในฐานรหัสทั้งหมด


ว้าวคำตอบที่ละเอียดมากขอบคุณสำหรับการแบ่งปัน ฉันจะเลียนแบบการปฏิบัติของคุณในการเขียนโค้ดของฉัน
Vatsala

16

ฉันใช้การผสมผสานระหว่าง Cobertura, Checkstyle, (Ecl) Emma และ Findbugs

EclEmmaเป็นที่น่ากลัว Eclipse ปลั๊กอินแสดงให้เห็นว่าการรายงานข่าวด้วยการระบายสีรหัสแหล่งที่มา Java ในการแก้ไข ( หน้าจอ ) - ความคุ้มครองที่ถูกสร้างขึ้นโดยใช้การทดสอบ JUnit สิ่งนี้มีประโยชน์มากเมื่อคุณพยายามคิดว่าบรรทัดใดบ้างที่ครอบคลุมในชั้นเรียนหนึ่ง ๆ หรือหากคุณต้องการดูว่าบรรทัดใดถูกครอบคลุมโดยการทดสอบเพียงครั้งเดียว สิ่งนี้เป็นมิตรกับผู้ใช้และมีประโยชน์มากกว่าการสร้างรายงานจากนั้นดูรายงานเพื่อดูว่าชั้นเรียนใดมีความครอบคลุมต่ำ

ปลั๊กอิน Checkstyle และ Findbugs Eclipse ก็มีประโยชน์เช่นกันโดยจะสร้างคำเตือนในตัวแก้ไขขณะที่คุณพิมพ์

Maven2 มีปลั๊กอินรายงานที่ทำงานร่วมกับเครื่องมือข้างต้นเพื่อสร้างรายงานในเวลาสร้าง เราใช้สิ่งนี้เพื่อรับรายงานโครงการโดยรวมซึ่งมีประโยชน์มากขึ้นเมื่อคุณต้องการตัวเลขรวม เหล่านี้จะถูกสร้างโดย CI ของเราสร้างซึ่งทำงานโดยใช้ต่อเนื่อง


1
ว้าว @ EclEmma! ฉันรู้เกี่ยวกับ Emma แต่รวมเข้ากับ Eclipse หรือไม่? กฎนั้น
Joshua McKinnon

3
Continuum ห่วยกฎฮัดสัน
Ken Liu

11

สิ่งต่อไปนี้ทั้งหมดเราใช้และรวมความง่ายในการสร้าง Maven 2.x และ Eclipse / RAD 7:

  • การทดสอบ - JUnit / TestNG
  • การวิเคราะห์โค้ด - FindBugs, PMD
  • ความครอบคลุมของรหัส - Clover

นอกจากนี้ในงานสร้าง Maven ของเราเรามี:

  • JDepend
  • ตัวตรวจสอบแท็ก (TODO, FIXME ฯลฯ )

นอกจากนี้ถ้าคุณกำลังใช้ Maven 2.x, CodeHaus มีคอลเลกชันของปลั๊กอิน Maven ประโยชน์ของพวกเขาในโครงการ Mojo

หมายเหตุ: Clover มีการผสานรวมแบบสำเร็จรูปกับเซิร์ฟเวอร์ Bamboo CI (เนื่องจากเป็นผลิตภัณฑ์ Atlassian ทั้งคู่) นอกจากนี้ยังมีปลั๊กอิน Bamboo สำหรับ FindBugs, PMD และ CheckStyle แต่ตามที่ระบุไว้เซิร์ฟเวอร์ Hudson CI ฟรีก็มีเช่นกัน


9

ฉันใช้การวิเคราะห์แบบคงที่ที่มีอยู่ใน IntelliJ IDEA บูรณาการที่สมบูรณ์แบบ

ฉันใช้ความครอบคลุมของรหัสที่มีอยู่ใน Intellij IDEA (อิงตาม EMMA) อีกครั้งบูรณาการที่สมบูรณ์แบบ

โซลูชันแบบบูรณาการนี้มีความน่าเชื่อถือมีประสิทธิภาพและใช้งานง่ายเมื่อเทียบกับการรวมเครื่องมือจากผู้ขายหลายราย


4

Checkstyleเป็นอีกรูปแบบหนึ่งที่ฉันเคยใช้ใน บริษัท ก่อนหน้านี้ ... ส่วนใหญ่ใช้สำหรับการตรวจสอบสไตล์ แต่สามารถวิเคราะห์แบบคงที่ได้เช่นกัน นอกจากนี้Cloverสำหรับการครอบคลุมรหัสแม้ว่าโปรดทราบว่าไม่ใช่เครื่องมือฟรี


3

เรากำลังใช้ FindBugs และ Checkstyle รวมถึง Clover สำหรับ Code Coverage

ฉันคิดว่าสิ่งสำคัญคือต้องมีการวิเคราะห์แบบคงที่เพื่อสนับสนุนการพัฒนาของคุณ น่าเสียดายที่ยังไม่แพร่หลายว่าเครื่องมือเหล่านี้มีความสำคัญ


1

เราใช้ FindBugs และ JDepend รวมกับ Ant เราใช้ JUnit แต่เราไม่ได้ใช้เครื่องมือครอบคลุมใด ๆ

ฉันไม่ได้ใช้มันรวมกับ Rational Application Developer (IDE ที่ฉันใช้เพื่อพัฒนาแอปพลิเคชัน J2EE) เพราะฉันชอบความเรียบร้อยเมื่อคุณเรียกใช้ javac ในคอนโซล Windows : P


1

ฉันโชคดีกับ Cobertura เป็นเครื่องมือครอบคลุมรหัสที่สามารถเรียกใช้งานผ่านสคริปต์มดของคุณซึ่งเป็นส่วนหนึ่งของงานสร้างปกติของคุณและสามารถรวมเข้ากับฮัดสันได้


1

ทีมของเราใช้ PMD และ Cobertura จริงๆแล้วโครงการของเราเป็นโครงการ maven และมีปลั๊กอินสำหรับการวิเคราะห์โค้ดที่ง่ายมาก คำถามที่แท้จริงคือสำหรับโครงการเฉพาะที่คุณต้องใช้การวิเคราะห์ความคิดเห็นของฉันคือคุณไม่สามารถใช้ปลั๊กอินเดียวกันสำหรับแต่ละโครงการได้


1

ในโครงการของเราเราใช้ Sonar หน้า checkstyle, pmd .... ร่วมกับ CI (Bamboo, Hudson) เรายังได้รับประวัติที่ดีเกี่ยวกับคุณภาพของแหล่งที่มาของเราและสิ่งที่เราจะไป ฉันชอบ Sonar เพราะคุณเป็นเครื่องมือหลักอย่างหนึ่งใน CI Stack ที่ทำเพื่อคุณและคุณสามารถปรับแต่งกฎสำหรับแต่ละโครงการได้อย่างง่ายดาย



0

ฉันกำลังมองหาคำตอบมากมายเพื่อเรียนรู้เกี่ยวกับเครื่องมือใหม่ ๆ และรวบรวมความรู้นี้ไว้ในคำถาม / เธรดเดียวดังนั้นฉันจึงสงสัยว่าจะมี 1 คำตอบที่แท้จริงสำหรับคำถามนี้

คำตอบของฉันสำหรับคำถามของฉันเองคือเราใช้:

  • Findbugs เพื่อค้นหาข้อผิดพลาดทั่วไปที่ไม่ดี / การเข้ารหัส - เรียกใช้จาก maven และรวมเข้ากับ Eclipse ได้อย่างง่ายดาย
  • Cobertura สำหรับรายงานความครอบคลุมของเรา - เรียกใช้จาก maven

ฮัดสันยังมีปลั๊กอินสแกนเนอร์งานที่จะแสดงจำนวนสิ่งที่ต้องทำและ FIXME ของคุณตลอดจนแสดงตำแหน่งที่อยู่ในไฟล์ต้นทาง

ทั้งหมดถูกรวมเข้ากับ Maven 1.x ในกรณีของเราและเชื่อมโยงกับ Hudson ซึ่งดำเนินการสร้างของเราในการเช็คอินรวมถึงสิ่งพิเศษทุกคืนและทุกสัปดาห์ แนวโน้มของฮัดสันแสดงกราฟการทดสอบ JUnit ความครอบคลุมการค้นหาจุดบกพร่องและงานที่เปิดอยู่ นอกจากนี้ยังมีปลั๊กอิน Hudson ที่รายงานและสร้างกราฟคำเตือนการคอมไพล์ของเรา นอกจากนี้เรายังมีการทดสอบประสิทธิภาพหลายรายการด้วยกราฟประสิทธิภาพและการใช้หน่วยความจำในช่วงเวลาหนึ่งโดยใช้ปลั๊กอินฮัดสันพล็อตเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.