아무도 안써서쓰는 Qodana + Jacoco

no.oneho·2024년 4월 10일
0

젯브레인에 Qodana 라는 코드 품질 관리 툴이 있다.

해당 툴을 인텔리제이에 적용하면

이런식으로 코드 품질에 대한 정보를 나타내주는데

현재 진행중인 프로젝트에서 TDD 방법론으로 개발하기로 하여 테스트 커버리지 적용을 위해 적용해보았다.
근데 문제점이 정작 우리가 궁금했던 테스트 커버리지는 제공이 안되던거였는데

문서를 아무리 뒤져도 인텔리제이 내에서 커버리지 실행하면 저것도 나와야한다고 문서에 나와있었다.

그래서 한참 삽질을 하다 선택한것이 Jacoco에서 제공해주는 코드 커버리지 보고서를 함께 사용하는 방법이였다.

일단 나는 Qodana 를 Ultmate Plus 버전을 사용중이다 2달 무료버전을 준다기에
해당 버전으로 이번 프로젝트를 진행할거같다.

로컬 실행은 대충 이정도가 끝이다. 이 상태로는 코드커버리지를 알려주지않는데 이제부터 jacoco 세팅을 시작해보겠다.

subprojects {
	apply plugin: 'jacoco'
}

먼저 build.gradle 에 jacoco 를 설정해준다. 진행중인 프로젝트 같은 경우는 멀티모듈로 되어있어 루트 프로젝트가 아닌 subproject에 공통으로 걸어줬다.

    jacoco {
        toolVersion = '0.8.10'
        setReportsDirectory(file("${rootDir}/.qodana/code-coverage"))
    }
    
       test {
        useJUnitPlatform()
        finalizedBy 'jacocoTestReport'
    }
    
    acocoTestReport {
        reports {
            xml.required = true
            html.required = false
        }
        finalizedBy 'jacocoTestCoverageVerification'
    }

    jacocoTestCoverageVerification {
        violationRules {
            rule {
                enabled = true
                element = 'CLASS'
                // includes = []

                limit {
                    counter = 'LINE'
                    value = 'COVEREDRATIO'
                    minimum = 0.00
                }

                excludes = []
            }
        }
    }

jacoco 그룹엔 버전과 저장 위치를 명시해준다. 해당 저장위치는 qodana가 코드 품질을 검사할 때 코드 검사 보고서를 읽는 위치이다.

acocoTestReport 그룹에는 qodana에서 사용할 수 있게 xml 을 허용해준다.
우리 프로젝트에선 html로 읽을 필요가 없어 html 파일도 false 로 바꿔줬다.

jacocoTestCoverageVerification 그룹에는 코드 커버리지 검사 룰인데
minimun 보다 코드 커버리지가 낮으면 빌드나 테스트를 실패시킨다.

해당 룰은 아직 미정상태로 추후 룰과 점수를 정하여 적용할 듯 싶다.

이제 ./gradlew test 를 하게되면 test - acocoTestReport - jacocoTestCoverageVerification 순으로 실행이 되어 ${rootDir}/.qodana/code-coverage 이 위치에 xml 파일이 생성이 된다.

그 후 코다나로 코드 보고서를 실행 시켜 보면

아까완 다르게 코드 커버리지가 보임을 확인 할 수 있다.

이제 로컬에선 완료했으니 git action을 통해 push 나 pr 때 사용할 수 있게 자동화해보자

name: qodana

on:
  push:
    branches:
      - develop
      - 'chore/test-coverage/#37'
  pull_request:
    branches:
      - "**"

jobs:
  qodana:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
      checks: write
    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}  # to check out the actual pull request commit, not the merge commit
          fetch-depth: 0
          
      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          java-version: '17'
          distribution: 'adopt'
          cache: 'gradle'
          
      - name: Validate Gradle Wrapper
        run: chmod +x ./gradlew --version
        working-directory: ./

      - name: Create code coverage folder if not exists
        run: |
          mkdir -p .qodana/code-coverage
        working-directory: ./
  
      - name: permission
        run: chmod +x gradlew 
        working-directory: ./

      - name: Run Tests
        run: ./gradlew test
        working-directory: ./    

      - name: Archive coverage data
        uses: actions/upload-artifact@v2
        with:
          name: gradle-coverage-data-jacoco
          path: .qodana/code-coverage
      
      - name: 'Qodana Scan'
        uses: JetBrains/qodana-action@v2023.2
        env:
          QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create code coverage folder if not exists
        run: |
          mkdir -p .qodana/code-coverage
        working-directory: ./

해당 명령으로 jacoco가 실행 후 저장될 디렉토리를 미리 생성해준다.

      - name: Run Tests
      run: ./gradlew test
      working-directory: ./ 

그 후 test 를 실행하여 아까 build.gradle에 작성했던 것 처럼 test - acocoTestReport - jacocoTestCoverageVerification 순으로 실행이 될 수 있게 해준다.

    - name: Archive coverage data
      uses: actions/upload-artifact@v2
      with:
        name: gradle-coverage-data-jacoco
        path: .qodana/code-coverage

qodana scan 에서 파일을 읽을 수 있게 해당 디렉토리에 파일을 업로드 해준다.

      - name: 'Qodana Scan'
       uses: JetBrains/qodana-action@v2023.2
       env:
         QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

마지막으로 qodana scan 명령으로 qodana 스캔을 실행한다.

QODANA_TOKEN 은 Qodana.cloud 에 프로젝트를 찾아보면 찾을 수 있다. 해당 토큰을 action 키로 저장하여 action에서 변수로 사용할 수 있다.

그 후 pr을 통해 체크해보면

action이 예상대로 잘 돌아가는것을 확인 할 수 있고


내가 PR한 코드 품질에 대해 리뷰도 해준다.!!

profile
안녕하세요 백엔드 개발자를 지망하고있는 노원호라고합니다.

0개의 댓글

관련 채용 정보