Spring Cloud 를 이용한 MSA #6. 코드 품질 개선하기(jacoco, sonarqube)

Bobby·2023년 3월 21일
0

spring cloud

목록 보기
6/6
post-thumbnail

📋 jacoco

  • jacoco는 java에서 코드커버리지 분석을 위한 도구 이다.
  • 코드 커버리지는 코드가 얼마나 커버되었는가? 즉, 테스트 코드가 애플리케이션의 코드를 얼마만큼 수행하고 있는가를 나타내는 지표이다.

적용

  • 플러그인을 적용하면 간단하게 사용할 수 있다.
  • 자동으로 알맞은 버전을 선택해 주지만 직접 버전을 선택 할 수 있다.
    버전 확인

build.gradle


...

// 하위 모든 프로젝트 공통 세팅
subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    
    // 플러그인 적용
    apply plugin: 'jacoco'

    ...
   
	// jacoco 버전 명시
    jacoco {
        toolVersion = '0.8.8'
    }
  
    ...
    
}

...
  • 플러그인을 적용하고 나면 두가지 task가 생긴다

jacocoTestReport :

  • 코드 커버리지 결과를 읽기 쉽게 만들어준다.

jacocoTestCoverageVerification :

  • 지정한 코드 커버리지 기준을 넘어야만 통과 되도록 검증

실행 - Test

🪓 gradle wrapper 실행 하는 방법

./gradlew clean test 

🪓 하위 모듈만 실행하려면 task 앞에 모듈명을 붙여준다.

  • {module_name}:{task}
./gradlew api:clean api:test
  • 테스트를 실행 해보자.
  • 실행 과정을 보기 위해 --info 옵션을 추가 했다.
./gradlew api:clean api:test --info
  • jacoco가 수행된 결과가 생성 되었다.
  • test.exec : 테스트 코드 수행 후 결과파일
  • index.html : 테스트 코드 수행 리포트

실행 - jacocoTestReport

  • 코드커버리지 데이터 분석을 쉽게 할 수 있도록 리포트를 만들어 준다.

build.gradle

  • 옵션을 설정 할 수 있다.
subprojects {
    
    ...
    
    jacocoTestReport {
    	// 분석 리포트 출력 포맷 설정
        reports{
            html.enabled=true
            xml.enabled=true
            csv.enabled=true
        }
    }
    
    ...
}

실행

./gradlew api:jacocoTestReport --info
  • reports > jacoco 디렉토리에 새로운 파일들이 생겼다.
  • index.html 파일을 열어보면 코드 커버리지 데이터를 확인 할 수 있다.

실행 - jacocoTestCoverageVerification

  • 코드커버리지 기준을 넘었는지 검증한다.

build.gradle

subprojects {
    
    ...
    
    jacocoTestCoverageVerification {
        violationRules {
            rule {
                enabled = true
                element = 'CLASS'
                
                // 적용 할 패키지(기본은 전체)
                // includes = []

                // 브랜치 커버리지
                limit {
                    counter = 'BRANCH'
                    value = 'COVEREDRATIO'
                    minimum = 0.50
                }

                // 라인 커버리지
                limit {
                    counter = 'LINE'
                    value = 'COVEREDRATIO'
                    minimum = 0.50
                }

                // 빈 줄을 제외한 코드의 최대 라인수
                limit {
                    counter = 'LINE'
                    value = 'TOTALCOUNT'
                    maximum = 200
                }

                // 커버리지 체크를 제외할 클래스들
                excludes = []
            }
        }
    }
    
    ...
}

ElementType

타입설명
BUNDLE패키지 번들
CLASS클래스
GROUP번들의 논리적 그룹
METHOD메소드
PACKAGE패키지
SOURCEFILE소스 파일

CounterEntity

타입설명
BRANCH분기문 수
CLASS클래스 수
COMPLEXITY복잡도
INSTRUCTION명령 수
LINE소스코드 라인 수
METHOD메소드 수

CounterValue

타입설명
TOTALCOUNT총 개수
MISSEDCOUNT커버 안된 개수
COVEREDCOUNT커버 된 개수
MISSEDRATIO커버 안된 비율

|COVEREDRATIO
|커버 된 비율|

실행

./gradlew api:jacocoTestCoverageVerification --info
  • 설정한 코드 커버리지 기준을 넘지 못했기 때문에 작업이 실패

실행 순서

test 작업 수행 후 jacocoTestReport, jacocoTestCoverageVerification 를 수행 해야 한다.

  • 다음과 같이 순서대로 실행해도 되지만 각 작업 후에 다음 작업을 수행 하도록 설정 해보자.
./gradlew test jacocoTestReport jacocoTestCoverageVerification 
  • test 실행 후 jacocoTestReport 실행
  • jacocoTestReport 실행 후 jacocoTestCoverageVerification 실행

build.gradle

`build.gradle`
```java
subprojects {
    
    ...
    
    test {
        useJUnitPlatform()
        finalizedBy 'jacocoTestReport'
    }

    jacocoTestReport {
        reports{
            html.enabled=true
            xml.enabled=true
            csv.enabled=true
        }

        finalizedBy 'jacocoTestCoverageVerification'
    }
    
    ...
}

실행

./gradlew api:clean api:test --info
  • 실행 완료

📋 Sonarqube

  • 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼
  • jacoco와 연동하여 사용해보자.

실행

  • 도커 컨테이너로 실행
docker run --name sonarqube -d -p 9000:9000 sonarqube

http://localhost:9000

  • 초기 아이디 / 비밀번호는 admin / admin
  • 일단 아무것도 없다.

jacoco 연동

  • jacoco연동을 위해 토큰이 필요하다.

  • 토큰 확인

build.gradle

// 빌드 시
buildscript {
    ext {
        
        ...
        
        sonarqubeVersion = '3.0'
    }
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
    
        ...
        
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:${sonarqubeVersion}"
    }
}

// 하위 모든 프로젝트 공통 세팅
subprojects {
    
    ...
    
    // 플러그인 추가
    apply plugin: 'org.sonarqube'

	...

    sonarqube {
        properties {
            property "sonar.host.url", "http://localhost:9000"
           
            // 토큰을 직접 등록 해도 되지만 주입 받아서 사용한다.
            // property "sonar.login", "{token}"
            property "sonar.sources", "src"
            property "sonar.language", "java"
            property "sonar.sourceEncoding", "UTF-8"
            property "sonar.test.inclusions", "**/*Test.java"
            property "sonar.coverage.jacoco.xmlReportPaths", "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
            property 'sonar.exclusions', '**/test/**, **/Q*.java, **/*Doc*.java, **/resources/**'
        }
    }

}

실행

./gradlew api:sonarqube -Dsonar.login={token}
  • 다양한 지표들이 있다.

🪓 하위 모듈 모두 한번에 실행하면 메모리 부족이 뜰 수 있다!!

./gradlew sonarqube -Dsonar.login={token}


참고


코드

profile
물흐르듯 개발하다 대박나기

0개의 댓글