Bạn sử dụng công cụ phân tích mã nào cho các dự án Java của mình? [đóng cửa]


117

Bạn sử dụng công cụ phân tích mã nào cho các dự án Java của mình?

Tôi quan tâm đến tất cả các loại

  • các công cụ phân tích mã tĩnh (FindBugs, PMD và bất kỳ công cụ nào khác)
  • công cụ bảo hiểm mã (Cobertura, Emma và bất kỳ công cụ nào khác)
  • bất kỳ công cụ dựa trên dụng cụ khác
  • bất cứ điều gì khác, nếu tôi thiếu một cái gì đó

Nếu có thể, cũng nêu rõ công cụ xây dựng nào bạn sử dụng và các công cụ này tích hợp tốt như thế nào với cả IDE và công cụ xây dựng của bạn.

Nếu một công cụ chỉ có sẵn một cách cụ thể (như một plugin IDE, hoặc, giả sử, một plugin công cụ xây dựng) thì thông tin đó cũng đáng chú ý.


Ngoài ra, hãy xem UCDetector: ucdetector.org
Roussy

Đi để kiểm tra Pitest cho bảo hiểm kiểm tra đột biến.
mucaho

Câu trả lời:


70

Đối với các công cụ phân tích tĩnh, tôi thường sử dụng CPD, PMD , FindBugsCheckstyle .

CPD là công cụ "Sao chép / Dán dò" PMD. Tôi đã sử dụng PMD một thời gian trước khi tôi nhận thấy liên kết "Tìm mã trùng lặp" trên trang web PMD .

Tôi muốn chỉ ra rằng các công cụ này đôi khi có thể được mở rộng ra ngoài bộ quy tắc "ngoài luồng" của chúng. Và không chỉ vì chúng là nguồn mở để bạn có thể viết lại chúng. Một số công cụ này đi kèm với các ứng dụng hoặc "móc" cho phép chúng được mở rộng. Ví dụ: PMD đi kèm với công cụ "designer" cho phép bạn tạo các quy tắc mới. Ngoài ra, Checkstyle có kiểm tra DescendantToken có các thuộc tính cho phép tùy chỉnh đáng kể.

Tôi tích hợp các công cụ này với bản dựng dựa trên Ant . Bạn có thể theo liên kết để xem cấu hình nhận xét của tôi.

Ngoài việc tích hợp đơn giản vào bản dựng, tôi thấy hữu ích khi định cấu hình các công cụ được "tích hợp" theo một số cách khác. Cụ thể, tạo báo cáo và thống nhất đàn áp cảnh báo. Tôi muốn thêm các khía cạnh này vào cuộc thảo luận này (có lẽ cũng nên có thẻ "phân tích tĩnh"): làm thế nào mọi người định cấu hình các công cụ này để tạo ra một giải pháp "hợp nhất"? (Tôi đã hỏi riêng câu hỏi này ở đây )

Đầu tiên, đối với các báo cáo cảnh báo, tôi chuyển đổi đầu ra để mỗi cảnh báo có định dạng đơn giản:

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

Đây thường được gọi là "định dạng Emacs", nhưng ngay cả khi bạn không sử dụng Emacs, đây là định dạng hợp lý để báo cáo đồng nhất. Ví dụ:

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

Chuyển đổi định dạng cảnh báo của tôi được thực hiện bởi tập lệnh Ant của tôi với bộ lọc Ant .

"Tích hợp" thứ hai mà tôi làm là để ngăn chặn cảnh báo. Theo mặc định, mỗi công cụ hỗ trợ nhận xét hoặc chú thích (hoặc cả hai) mà bạn có thể đặt trong mã của mình để tắt tiếng cảnh báo mà bạn muốn bỏ qua. Nhưng những yêu cầu đàn áp cảnh báo khác nhau này không có một cái nhìn nhất quán mà có vẻ hơi ngớ ngẩn. Khi bạn đang ngăn chặn một cảnh báo, bạn đang ngăn chặn một cảnh báo, vậy tại sao không luôn luôn viết " SuppressWarning?"

Ví dụ: cấu hình mặc định của PMD ngăn chặn việc tạo cảnh báo trên các dòng mã với chuỗi " NOPMD" trong một nhận xét. Ngoài ra, PMD hỗ trợ @SuppressWarningschú thích của Java . Tôi định cấu hình PMD để sử dụng các bình luận có chứa " SuppressWarning(PMD." thay vì NOPMDvậy để các triệt tiêu PMD trông giống nhau. Tôi điền vào quy tắc cụ thể bị vi phạm khi sử dụng triệt tiêu kiểu nhận xét:

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

Chỉ phần " SuppressWarnings(PMD." mới có ý nghĩa đối với một nhận xét, nhưng nó phù hợp với sự hỗ trợ của PMD cho @SuppressWarningchú thích nhận ra các vi phạm quy tắc riêng lẻ theo tên:

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

Tương tự, Checkstyle ngăn chặn việc tạo cảnh báo giữa các cặp ý kiến ​​(không hỗ trợ chú thích). Theo mặc định, các bình luận để tắt và bật Checkstyle chứa các chuỗi CHECKSTYLE:OFFCHECKSTYLE:ON, tương ứng. Thay đổi cấu hình này (với "SuppressionVerFilter" của Checkstyle để sử dụng các chuỗi " BEGIN SuppressWarnings(CheckStyle." và " END SuppressWarnings(CheckStyle." làm cho các điều khiển trông giống như PMD:

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

Với các nhận xét của Checkstyle, vi phạm kiểm tra cụ thể ( HiddenField) rất quan trọng vì mỗi kiểm tra có BEGIN/ENDcặp nhận xét " " riêng .

FindBugs cũng hỗ trợ triệt tiêu thế hệ cảnh báo bằng @SuppressWarningschú thích, do đó không cần cấu hình thêm để đạt được mức độ đồng nhất với các công cụ khác. Thật không may, Findbugs phải hỗ trợ @SuppressWarningschú thích tùy chỉnh vì chú thích Java tích hợp @SuppressWarningsSOURCEchính sách lưu giữ không đủ mạnh để giữ chú thích trong tệp lớp nơi FindBugs cần. Tôi hoàn toàn đủ điều kiện ngăn chặn các cảnh báo của FindBugs để tránh xung đột với @SuppressWarningschú thích của Java :

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

Những kỹ thuật này làm cho mọi thứ trông hợp lý nhất quán trên các công cụ. Lưu ý rằng việc mỗi lần triệt tiêu cảnh báo có chứa chuỗi " SuppressWarnings" giúp dễ dàng thực hiện một tìm kiếm đơn giản để tìm tất cả các phiên bản cho tất cả các công cụ trên toàn bộ cơ sở mã.


wow, câu trả lời khá chi tiết. Cảm ơn đã chia sẻ. tôi sẽ mô phỏng thực hành của bạn vào thực tiễn mã hóa của tôi.
Vatsala

16

Tôi sử dụng kết hợp Cobertura, Checkstyle, (Ecl) Emma và Findbugs.

EclEmma là một plugin Eclipse tuyệt vời cho thấy phạm vi bảo hiểm mã bằng cách tô màu nguồn java trong trình soạn thảo ( ảnh chụp màn hình ) - phạm vi bảo hiểm được tạo bằng cách chạy thử nghiệm JUnit. Điều này thực sự hữu ích khi bạn đang cố gắng tìm ra dòng nào được bao phủ trong một lớp cụ thể hoặc nếu bạn muốn xem dòng nào được bao phủ bởi một thử nghiệm duy nhất. Điều này thân thiện và hữu ích hơn nhiều so với việc tạo báo cáo và sau đó xem qua báo cáo để xem lớp nào có độ bao phủ thấp.

Các bổ trợ Eclipse của Checkstyle và Findbugs cũng rất hữu ích, chúng tạo ra các cảnh báo trong trình soạn thảo khi bạn nhập.

Maven2 có các plugin báo cáo hoạt động với các công cụ trên để tạo báo cáo khi xây dựng. Chúng tôi sử dụng điều này để có được các báo cáo dự án tổng thể, hữu ích hơn khi bạn muốn số tổng hợp. Chúng được tạo bởi các bản dựng CI của chúng tôi, chạy bằng Continuum .


1
wow @ EclEmma! Tôi biết về Emma, ​​nhưng được tích hợp ngay vào Eclipse? Đó là quy tắc.
Joshua McKinnon

3
Continuum hút, quy tắc Hudson.
Ken Liu

11

Tất cả những điều sau đây chúng tôi sử dụng và tích hợp Easiy trong cả hai bản dựng Maven 2.x và Eclipse / RAD 7:

  • Kiểm tra - JUnit / TestNG
  • Phân tích mã - FindBugs, PMD
  • Mã bảo hiểm - Cỏ ba lá

Ngoài ra, trong các bản dựng Maven của chúng tôi, chúng tôi có:

  • JDepend
  • Trình kiểm tra thẻ (TODO, FIXME, v.v.)

Hơn nữa, nếu bạn đang sử dụng Maven 2.x, CodeHaus có một bộ các plugin Maven tiện dụng trong dự án Mojo của họ .

Lưu ý: Cỏ ba lá có tích hợp sẵn với máy chủ Bamboo CI (vì cả hai đều là sản phẩm của Atlassian). Ngoài ra còn có các plugin Tre cho FindBugs, PMD và CheckStyle nhưng, như đã lưu ý, máy chủ Hudson CI miễn phí cũng có những plugin đó.


9

Tôi sử dụng phân tích tĩnh được tích hợp trong IntelliJ IDEA. Tích hợp hoàn hảo.

Tôi sử dụng phạm vi bảo hiểm mã được tích hợp trong Intellij IDEA (dựa trên EMMA). Một lần nữa, hội nhập hoàn hảo.

Giải pháp tích hợp này đáng tin cậy, mạnh mẽ và dễ sử dụng so với việc ghép các công cụ từ các nhà cung cấp khác nhau.


4

Checkstyle là một kiểu khác tôi đã sử dụng ở một công ty trước đây ... chủ yếu là để kiểm tra kiểu, nhưng nó cũng có thể thực hiện một số phân tích tĩnh. Ngoài ra, Cỏ ba lá để bảo hiểm mã, mặc dù lưu ý rằng nó không phải là một công cụ miễn phí.


3

Chúng tôi đang sử dụng FindBugs và Checkstyle cũng như Cỏ ba lá cho Bảo hiểm mã.

Tôi nghĩ điều quan trọng là có một số loại phân tích tĩnh, hỗ trợ sự phát triển của bạn. Thật không may, nó vẫn không được phổ biến rộng rãi rằng các công cụ này là quan trọng.


1

Chúng tôi sử dụng FindBugs và JDepend được tích hợp với Ant. Chúng tôi sử dụng JUnit nhưng chúng tôi không sử dụng bất kỳ công cụ bảo hiểm nào.

Tôi không sử dụng nó được tích hợp vào Rational Application Developer (IDE tôi đang sử dụng để phát triển các ứng dụng J2EE) vì tôi thích nó trông gọn gàng như thế nào khi bạn chạy javac trong bảng điều khiển Windows. : P


1

Tôi đã có may mắn với Cobertura. Đây là một công cụ bao phủ mã có thể được thực thi thông qua tập lệnh ant của bạn như là một phần của bản dựng thông thường của bạn và có thể được tích hợp vào Hudson.


1

Nhóm của chúng tôi sử dụng PMD và Cobertura, thực sự các dự án của chúng tôi là các dự án maven và rất đơn giản để bao gồm các trình cắm để phân tích mã. Câu hỏi thực sự sẽ dành cho dự án cụ thể mà bạn cần sử dụng phân tích, ý kiến ​​của tôi là bạn không thể sử dụng cùng một plugin cho từng dự án.


1

trong dự án của chúng tôi, chúng tôi sử dụng Sonar trước checkstyle, pmd .... cùng với CI (Tre, Hudson), chúng tôi cũng nhận được một lịch sử tốt đẹp về chất lượng nguồn của chúng tôi và những gì chúng tôi chỉ đạo. Tôi thích Sonar, vì bạn là một công cụ trung tâm trong CI Stack phù hợp với bạn và bạn có thể dễ dàng tùy chỉnh các quy tắc cho từng dự án.



0

Tôi đang tìm kiếm nhiều câu trả lời để tìm hiểu về các công cụ mới và củng cố kiến ​​thức này trong một câu hỏi / chủ đề, vì vậy tôi nghi ngờ sẽ có 1 câu trả lời đúng cho câu hỏi này.

Câu trả lời của tôi cho câu hỏi của riêng tôi là chúng tôi sử dụng:

  • Findbugs để tìm các lỗi phổ biến xấu / mã hóa - chạy từ maven và cũng dễ dàng tích hợp vào Eclipse
  • Cobertura cho các báo cáo bảo hiểm của chúng tôi - chạy từ maven

Hudson cũng có một plugin quét tác vụ sẽ hiển thị số lượng TODO và FIXME của bạn, cũng như hiển thị vị trí của chúng trong các tệp nguồn.

Tất cả được tích hợp với Maven 1.x trong trường hợp của chúng tôi và gắn liền với Hudson, nơi điều hành các bản dựng của chúng tôi khi nhận phòng cũng như những thứ thêm vào hàng đêm và hàng tuần. Xu hướng Hudson biểu đồ các bài kiểm tra JUnit của chúng tôi, phạm vi bảo hiểm, tìm kiếm, cũng như các nhiệm vụ mở. Ngoài ra còn có một plugin Hudson báo cáo và vẽ biểu đồ cảnh báo biên dịch của chúng tôi. Chúng tôi cũng có một số bài kiểm tra hiệu suất với các biểu đồ riêng về hiệu suất và sử dụng bộ nhớ theo thời gian bằng cách sử dụng plugin Hudson plots.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.