일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 회고
- db
- Blue-Green
- 어댑티브 해시 인덱스
- DeleteAll
- BalancedTree
- 클래스
- java
- mysql
- 멀티쓰레드 프로그래밍
- InnoDB 버퍼 풀
- 카카오 2차 코딩테스트
- 프리코스
- Jenkins
- jacoco
- 기능별 구조
- B+TREE
- useQuery
- useMutation
- 주간회고
- 계층별 구조
- 메서드명
- 블로그 병행
- SQL 실행순서
- N+1
- 백기선 스터디
- 우테코
- ci/cd
- 월간회고
- 도커
- Today
- Total
Haneul's Blog
[스케줄 관리 프로젝트 - 일치(BE)] Jacoco 적용기 본문
Jacoco란?
Jacoco는 프로젝트의 커버리지를 체크하는 라이브러리입니다. 이를 사용자의 편의를 위해서 커버리지 결과를 html, csv, xml 등과 같은 리포트를 생성해줍니다.
커버리지가 높을 수록 테스트 코드가 프로젝트의 코드를 잘 테스트 하고 있다는 지표로 활용할 수 있고, 커버리지가 일정 수준에 도달하지 않으면 배포를 할 수 없도록 제한을 걸 수도 있습니다.
Jacoco Gradle 설정
- https://techblog.woowahan.com/2661/
Gradle 프로젝트에 JaCoCo 설정하기 | 우아한형제들 기술블로그
{{item.name}} 안녕하세요. 상품시스템팀에서 서버 개발(..새발)을 하고 있는 연철입니다. 프로젝트 세팅 중에 찾아보고 삽질했던 내용들이 도움이 될까 하여 남깁니다. JaCoCo는 Java 코드의 커버리지
techblog.woowahan.com
설정하는 방법은 위의 링크에 아주 자세하게 나와있어서 그걸 참고하는게 좋을 것 같습니다.
내 프로젝트(일치 프로젝트)에 적용
첫 결과
아래의 이미지를 보면 test coverage가 되지 않고 있는 구간이 상당히 많은데 대표적으로 dto, config, exception 등의 패키지들에서 coverage가 제대로 이루어지지 않고 있는 것을 알 수 있습니다. 하지만 저는 test coverage가 제대로 이루어지지 않는 구간 중에서 dto나, exception과 같은 패키지들은 test를 굳이 안해도 된다고 생각을 하기 때문에 이 부분을 굳이 coverage를 높일 생각은 없습니다.
그렇다면 필요하지 않은 부분을 무시하면 좋겠지만 프로젝트를 build 할 때 gradle에서 설정해둔 coverage의 기준을 넘지 못하면 build가 안되는 설정도 있기 때문에 report에 안보이게 하기 + 해당 패키지는 커버리지의 기준에 미치지 못하더라도 무시를 하는 설정을 따로 하면 좋을 것 같습니다.
리포트에 특정 파일 안보이게 Gradle 설정
jacocoTestReport {
...
afterEvaluate {
classDirectories.setFrom(
files(classDirectories.files.collect {
fileTree(dir: it, excludes: [
'**/*Application*',
'**/*Exception*',
'**/dto/**',
'**/auth/infrastructure/**',
'**/auth/repository/**',
'**/auth/domain/**',
'**/profile/presentation/**',
'**/global/**',
'**/domain/Q*',
'com/illch/*BaseEntity*',
'**/*Builder*'
])
})
)
}
}
커버리지 기준에 도달하지 못해도 무시하는 설정
jacocoTestCoverageVerification {
violationRules {
rule {
element = 'CLASS'
excludes = [
'*.*Application',
'*.*Exception',
'*.dto.*',
'*.auth.infrastructure.*',
'*.auth.repository.*',
'*.auth.domain.*',
'*.profile.presentation.*',
'*.global.*',
'*.domain.Q*',
'com.illch.*BaseEntity*',
'*.*Builder*'
]
}
}
}
두 가지 설정을 한 후 결과
위처럼 설정을 해주게 되면 아래의 이미지처럼 확인하고 싶은 부분들의 커버리지만 확인하고 어떤 부분이 부족한지 알 수 있습니다.
이미지를 보면 com.illch.subscription.domain 부분의 Missed Branches 비율이 눈에 띄게 높은 것을 확인할 수 있습니다.
내부로 들어가보면 Subscription과 SubscriptionRole 부분에서 어떤 문제가 있는 것을 알 수 있습니다.
Subscription부터 확인해보면 빨갛게 줄이 그어져 있는 부분이 있는데, 이 부분은 테스트 코드에서 놓친 부분 즉, 테스트 하지 않은 부분이라고 할 수 있고, 노란색은 모든 조건이 아닌 일부만 테스트된 부분, 초록색은 커버가 된 부분이라고 할 수 있습니다.
다시 말해서 현재 테스트 코드에서 MemberUnauthorizedException을 임의로 발생시켜 테스트하는 코드가 없다는 것이고, 이를 보충해주면 될 것 같습니다.
이번에는 SubscriptionRole 부분을 확인해보면 UnauthorizedEditingException을 임의로 발생시키는 테스트 코드가 없다는 것을 알 수가 있고 이 부분도 보충하면 해당 부분을 커버할 수 있다는 것을 알 수 있게 되었습니다.
jacoco에서 확인한 부분 테스트 코드 작성 후 결과
위에서 coverage가 100%가 아닌 부분들을 모두 확인하고 해당 테스트 코드를 추가해주니까 목표였던 전체 프로젝트 ceverage 100% 달성!
SonarQube를 도입하려다 도입하지 않은 이유
사실 Jacoco와 보통 같이 쓰이는 도구가 있는데, 그것은 SonarQube입니다. SonarQube는 중복 코드, 코드 복잡도 등의 코드 개선점을 찾아주는 정적 분석 도구입니다. 그렇다면 왜 이번 프로젝트에서 SonarQube를 도입하지 않았을까요?
일단 개인 프로젝트이기 때문에 SonarQube가 제공해주는 코드 스멜을 굳이 공유할 필요가 없고, 공유할 필요가 없다면 로컬에서 사용할 수 있는 대체제인 SonarLint가 있다고 판단했고, SonarQube를 도입하게 되면 ec2 서버를 하나 더 열어야 하기 때문에 자원 낭비가 아닌가?라는 생각을 했기 때문에 이번 개인 프로젝트에서는 도입하지 않았습니다.
Reference
- https://techblog.woowahan.com/2661/
Gradle 프로젝트에 JaCoCo 설정하기 | 우아한형제들 기술블로그
{{item.name}} 안녕하세요. 상품시스템팀에서 서버 개발(..새발)을 하고 있는 연철입니다. 프로젝트 세팅 중에 찾아보고 삽질했던 내용들이 도움이 될까 하여 남깁니다. JaCoCo는 Java 코드의 커버리지
techblog.woowahan.com
- https://backtony.github.io/spring/2022-02-01-spring-test-5/
JaCoCo 적용하기 - Gradle
Java, JPA, Spring을 주로 다루고 공유합니다.
backtony.github.io
Jacoco 테스트 커버리지 excludes 안되는 문제
test coverage 문제 해결
velog.io
'일정 관리 프로젝트(일치)' 카테고리의 다른 글
[스케줄 관리 프로젝트 - 일치(BE)] 성능 개선(2) - JPA의 deleteAll 메서드를 통해 삭제 시 생기는 문제 해결 (0) | 2023.05.19 |
---|---|
[스케줄 관리 프로젝트 - 일치(BE)] 성능 개선(1) - JPA의 N + 1 문제 해결 (0) | 2023.05.07 |
[스케줄 관리 프로젝트 - 일치(INFRA)] Blue-Green 무중단 배포 (0) | 2023.05.04 |
[스케줄 관리 프로젝트 - 일치(INFRA)] Jenkins를 활용한 CI/CD(2) - Backend CI/CD 환경 구축 및 사용 (0) | 2023.05.03 |
[스케줄 관리 프로젝트 - 일치(INFRA)] Jenkins를 활용한 CI/CD(1) - 설치 과정 (0) | 2023.05.03 |