Java 프로젝트에 어떤 코드 분석 도구를 사용하십니까? [닫은]


117

Java 프로젝트에서 어떤 코드 분석 도구를 사용하십니까?

나는 모든 종류에 관심이 있습니다

  • 정적 코드 분석 도구 (FindBugs, PMD 및 기타)
  • 코드 커버리지 도구 (Cobertura, Emma 및 기타)
  • 기타 계측 기반 도구
  • 다른 것, 내가 뭔가를 놓치고 있다면

해당되는 경우 사용하는 빌드 도구와 이러한 도구가 IDE 및 빌드 도구와 얼마나 잘 통합되는지도 설명합니다.

도구가 특정 방식 (IDE 플러그인 또는 빌드 도구 플러그인)으로 만 제공되는 경우 해당 정보도 주목할 가치가 있습니다.


또한 UCDetector를 살펴보십시오 : ucdetector.org
Christophe Roussy

체크 아웃가는 Pitest를 돌연변이 시험 범위에 대해.
mucaho

답변:


70

정적 분석 도구의 경우 CPD, PMD , FindBugsCheckstyle을 자주 사용 합니다.

CPD는 PMD "복사 / 붙여 넣기 감지기"도구입니다. PMD 웹 페이지 에서 "중복 코드 찾기"링크 를 발견하기 전에 잠시 PMD를 사용하고있었습니다 .

이러한 도구는 때로 "기본"규칙 세트를 넘어서 확장 될 수 있음을 지적하고 싶습니다. 그리고 그것들이 오픈 소스이기 때문에 다시 작성할 수 있기 때문이 아닙니다. 이러한 도구 중 일부는 확장 할 수있는 응용 프로그램 또는 "후크"와 함께 제공됩니다. 예를 들어, PMD는 새 규칙을 만들 수 있는 "디자이너"도구 와 함께 제공됩니다 . 또한 Checkstyle에는 상당한 사용자 정의를 허용하는 속성 이있는 DescendantToken 검사가 있습니다.

이러한 도구를 Ant 기반 빌드 와 통합합니다 . 링크를 따라 가면 내 댓글 구성을 볼 수 있습니다.

빌드에 대한 간단한 통합 외에도 몇 가지 다른 방법으로 도구를 "통합"하도록 구성하는 것이 도움이됩니다. 즉, 보고서 생성 및 경고 억제 균일 성입니다. 이 토론에 이러한 측면을 추가하고 싶습니다 ( "정적 분석"태그도 있어야 함). 사람들은 "통합"솔루션을 만들기 위해 이러한 도구를 어떻게 구성하고 있습니까? ( 여기에서 별도로이 질문을했습니다 )

먼저 경고 보고서의 경우 각 경고가 간단한 형식을 갖도록 출력을 변환합니다.

/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.

내 경고 형식 변환은 Ant 필터 체인이있는 Ant 스크립트에 의해 수행됩니다 .

내가하는 두 번째 "통합"은 경고 억제를위한 것입니다. 기본적으로 각 도구는 무시할 경고를 무시하기 위해 코드에 배치 할 수있는 주석 또는 주석 (또는 둘 다)을 지원합니다. 그러나 이러한 다양한 경고 억제 요청은 다소 어리석은 것처럼 보이는 일관된 모양이 아닙니다. 경고를 억제 할 때 경고를 억제하는 것이므로 항상 " SuppressWarning?"를 작성하지 않는 이유는 무엇입니까?

예를 들어, PMD의 기본 구성 NOPMD은 주석에 " " 문자열이 포함 된 코드 줄에서 경고 생성을 억제 합니다. 또한 PMD는 Java의 @SuppressWarnings주석을 지원합니다 . PMD 억제 기능이 비슷하게 보이도록 SuppressWarning(PMD.대신 " "이 포함 된 주석을 사용하도록 PMD를 구성합니다 NOPMD. 주석 스타일 억제를 사용할 때 위반되는 특정 규칙을 입력합니다.

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

" SuppressWarnings(PMD."부분 만 주석에 중요하지만 @SuppressWarning이름으로 개별 규칙 위반을 인식 하는 주석에 대한 PMD의 지원과 일치합니다 .

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

마찬가지로 Checkstyle은 주석 쌍 사이의 경고 생성을 억제합니다 (주석 지원이 제공되지 않음). 기본적으로 Checkstyle을 끄고 켜는 주석에는 각각 CHECKSTYLE:OFF및 문자열이 포함 CHECKSTYLE:ON됩니다. 이 구성 (Checkstyle의 "SuppressionCommentFilter"사용)을 변경하여 " 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주석이 SOURCEFindBugs가 필요로하는 클래스 파일에서 주석을 유지할만큼 강력하지 않은 보존 정책을 가지고 있기 때문에 사용자 지정 주석 을 지원 해야합니다. Java의 @SuppressWarnings주석 과 충돌하지 않도록 FindBugs 경고 억제를 완전히 제한합니다 .

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

이러한 기술은 모든 도구에서 일관되게 일관되게 보입니다. 각 경고 억제에 문자열 " SuppressWarnings"이 포함되어 있으면 전체 코드베이스에서 모든 도구에 대한 모든 인스턴스를 찾기 위해 간단한 검색을 쉽게 실행할 수 있습니다.


와우, 꽤 자세한 답변입니다. 공유해 주셔서 감사합니다. 저는 여러분의 관행을 제 코딩 관행에 모방 할 것입니다.
Vatsala 2010 년

16

Cobertura, Checkstyle, (Ecl) Emma 및 Findbugs의 조합을 사용합니다.

EclEmma 는 편집기에서 자바 소스를 채색하여 코드 커버리지를 보여주는 멋진 Eclipse 플러그인입니다 ( screenshot ). 커버리지는 JUnit 테스트를 실행하여 생성됩니다. 이것은 특정 클래스에서 다루는 줄을 알아 내려고 할 때 또는 단일 테스트에서 다루는 줄만보고 싶을 때 매우 유용합니다. 이는 보고서를 생성 한 다음 보고서를 통해 적용 범위가 낮은 클래스를 확인하는 것보다 훨씬 사용자 친화적이고 유용합니다.

Checkstyle 및 Findbugs Eclipse 플러그인도 유용하며 입력 할 때 편집기에서 경고를 생성합니다.

Maven2에는 위의 도구와 함께 작동하여 빌드시 보고서를 생성하는 보고서 플러그인이 있습니다. 이를 사용하여 전체 프로젝트 보고서를 가져 오며 집계 수치를 원할 때 더 유용합니다. Continuum을 사용하여 실행되는 CI 빌드에서 생성됩니다 .


1
와우 @ EclEmma! 나는 Emma에 대해 알고 있었지만 Eclipse에 바로 통합 되었습니까? 그 규칙.
Joshua McKinnon

3
연속체는 형편 없다. 허드슨은 규칙이다.
Ken Liu

11

다음은 Maven 2.x 빌드와 Eclipse / RAD 7 모두에서 쉽게 사용하고 통합합니다.

  • 테스트-JUnit / TestNG
  • 코드 분석-FindBugs, PMD
  • 코드 커버리지-클로버

또한 Maven 빌드에는 다음이 있습니다.

  • JDepend
  • 태그 검사기 (TODO, FIXME 등)

또한 Maven 2.x를 사용하는 경우 CodeHaus에는 Mojo 프로젝트 에 편리한 Maven 플러그인 모음이 있습니다 .

참고 : Clover는 Bamboo CI 서버와 즉시 통합됩니다 (둘 다 Atlassian 제품이기 때문에). FindBugs, PMD 및 CheckStyle 용 Bamboo 플러그인도 있지만 언급했듯이 무료 Hudson CI 서버에도 이러한 플러그인이 있습니다.


9

IntelliJ IDEA에 내장 된 정적 분석을 사용합니다. 완벽한 통합.

Intellij IDEA (EMMA 기반)에 내장 된 코드 커버리지를 사용합니다. 다시 말하지만 완벽한 통합입니다.

이 통합 솔루션은 다양한 공급 업체의 도구를 함께 연결하는 것에 비해 안정적이고 강력하며 사용하기 쉽습니다.


4

Checkstyle 은 이전 회사에서 사용한 또 다른 것입니다. 주로 스타일 검사 용이지만 일부 정적 분석도 할 수 있습니다. 또한 코드 커버리지에 대한 Clover 는 무료 도구가 아니라는 점에 유의하십시오.


3

코드 커버리지를 위해 FindBugs와 Checkstyle과 Clover를 사용하고 있습니다.

개발을 지원하는 일종의 정적 분석이 중요하다고 생각합니다. 불행히도 이러한 도구가 중요하다는 것은 아직 널리 퍼지지 않았습니다.


1

우리는 Ant와 통합 된 FindBugs 및 JDepend를 사용합니다. 우리는 JUnit을 사용하지만 커버리지 도구를 사용하지 않습니다.

나는 Windows 콘솔에서 javac를 실행할 때 얼마나 깔끔하게 보이는지 좋아하기 때문에 Rational Application Developer (J2EE 애플리케이션을 개발하기 위해 사용하는 IDE)에 통합 된 것을 사용하지 않습니다. :피


1

나는 Cobertura와 행운을 빕니다. 일반 빌드의 일부로 ant 스크립트를 통해 실행할 수 있고 Hudson에 통합 할 수있는 코드 커버리지 도구입니다.


1

우리 팀은 PMD와 Cobertura를 사용합니다. 실제로 우리 프로젝트는 maven 프로젝트이며 코드 분석을위한 플러그인을 포함하는 것이 매우 간단합니다. 진짜 질문은 어떤 분석을 사용해야 하는가하는 특정 프로젝트에 대한 것입니다. 제 생각에는 각 프로젝트에 대해 동일한 플러그인을 사용할 수 없다는 것입니다.


1

우리 프로젝트에서 우리는 CI (Bamboo, Hudson)와 함께 checkstyle, pmd .... 앞에 Sonar를 사용합니다. 우리는 또한 소스 품질과 우리가가는 방향에 대한 멋진 역사를 얻습니다. 저는 Sonar를 좋아합니다. CI 스택의 중앙 도구 중 하나가이를 수행하고 각 프로젝트의 규칙을 쉽게 사용자 지정할 수 있기 때문입니다.



0

나는 새로운 도구에 대해 배우고이 지식을 하나의 질문 / 스레드로 통합하기 위해 많은 답변을 찾고 있으므로이 질문에 대한 진정한 답이 1 개있을 것 같지 않습니다.

내 질문에 대한 내 대답은 다음을 사용한다는 것입니다.

  • Findbugs는 일반적인 오류 불량 / 코딩을 찾기 위해-Maven에서 실행되며 Eclipse에 쉽게 통합됩니다.
  • 커버리지 보고서를위한 Cobertura-Maven에서 실행

Hudson에는 TODO 및 FIXME의 개수를 표시하고 소스 파일의 위치를 ​​표시하는 작업 스캐너 플러그인도 있습니다.

우리의 경우에는 모두 Maven 1.x와 통합되고 Hudson에 연결되어 체크인시 빌드를 실행하고 야간 및 주간 추가 작업을 수행합니다. Hudson 트렌드는 JUnit 테스트, 적용 범위, findbugs 및 열린 작업을 그래프로 표시합니다. 컴파일 경고를보고하고 그래프로 표시하는 Hudson 플러그인도 있습니다. 또한 Hudson 플롯 플러그인을 사용하여 시간이 지남에 따라 성능 및 메모리 사용에 대한 자체 그래프로 여러 성능 테스트를 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.