1. Jacoco
Jacoco를 사용하면 build시 Test Coverage Report를 생성해준다. 코드 라인별로 테스트 코드에서 참조되어 사용되었는지 점검하고, if 분기문 등 모든 케이스에 대해 점검하기 때문에 혹시 빠뜨린 테스트가 없는지 살펴보는데도 도움이 된다.
gradle로 build를 하고나면 build/reports/tests/test/ 디렉토리에 index.html 이라는 coverage report를 만들어준다. 아래 사진 처럼 각 패키지별, 클래스별로 테스트 수, 성공/실패 여부, 성공률 및 자세한 내용을 알려준다. 세부 내용으로 들어가면 앞서 말한 바와 같이 내가 어떤 부분을 놓쳤는지 알 수 있기 때문에 견고한 소프트웨어를 만드는데 있어 필수라고 할 수 있다.
ref) https://velog.io/@lxxjn0/코드-분석-도구-적용기-1편-코드-커버리지Code-Coverage가-뭔가요
1.1 Jacoco 설치
build.gradle의 plugin으로 넣어주면 된다. 아래 코드는 Groovy 문법을 기준으로 작성하였다.
plugins {
//...
id 'jacoco'
}
//...
subprojects { //멀티 모듈 프로젝트인 경우
//...
apply plugin: 'jacoco'
jacoco {
toolVersion = '0.8.12'
}
}
//jacoco 전용 task 추가
jacocoTestReport {
// test task 이후에 실행되도록 한다. test task에서 생성된 리포트를 참고하여 jacoco report가 만들어진다.
dependsOn test
reports {
html.required = true
xml.required = true
csv.required = true
}
// test report에서 제외할 클래스들을 패턴으로 지정한다.
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, excludes: ["**/*MapperImpl.class", "**/*Abstract.class", "**/*Application.class", "**/*Config.class", "**/*HandlerFilter.class", "**/Gzip*.class"])
}))
}
}
jacocoTestCoverageVerification {
//JPA에 의해 생성되는 Q 클래스들을 제외하는 코드
def Qdomains = []
for (qPattern in '*.QA'..'*.QZ') { // qPattern = '*.QA', '*.QB', ... '*.QZ'
Qdomains.add(qPattern + '*')
}
// Verification의 기준을 정한다.
violationRules {
rule {
element = 'CLASS'
limit {
counter = 'BRANCH'
value = 'COVEREDRATIO'
minimum = 0.80
}
limit {
counter = 'LINE'
value = 'COVEREDRATIO'
minimum = 0.70
}
limit {
counter = 'METHOD'
value = 'COVEREDRATIO'
minimum = 0.60
}
excludes = ["*.*Mapper*", "*.*Builder*", "*.*Config*", "*.*Application*", "**/*HandlerFilter", "**/*Gzip*"] + Qdomains
}
rule {
element = 'METHOD'
limit {
counter = 'LINE'
value = 'TOTALCOUNT'
maximum = 100
}
}
}
}
ref) https://cl8d.tistory.com/119
2. CodeCov
2.1 개요
Jacoco로 생성된 Report를 기준으로 github과 연동해준다. 시계열로 Test Coverage의 변화율을 저장하고 보여주기 때문에 팀원들에게 유지보수가 일어날 때마다 test coverage를 신경쓰게하고 테스트 코드가 부족한 부분을 체크할 수 있도록 알림을 줄 수 있다.
다음은 github PR에 codecov가 자동으로 comment를 남겨주는 예시이다.
Codecov는 유료이다! 설치는 복잡하지 않기 때문에 아래 사이트를 참조하면 될 것 같다.
ref) https://dublin-java.tistory.com/65
github workflow에서 실행되어야 하기 때문에, workflow용 yml 파일에 아래처럼 작성해주었다. CODECOV_TOKEN은 codecov로 부터 발급받은 토큰을 github의 repository secrets에 넣어두고 사용하는 것이다. if문은 codecov가 실패했을 경우에도 PR상 build는 통과되도록 always() 메서드를 실행한다.
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
if: ${{ always() }}
3. Test Reporter
github Action에서 테스트의 상세 내용을 UI와 함께 살펴볼 수 있도록 해준다.
Test Reporter도 github workflow에서 실행되는 plugin이다. 대략 아래처럼 설정해줬다.
- name: Test Reporter
uses: dorny/test-reporter@v1.9.1
with:
artifact: ''
name: 'Test Reporter Result'
path: '**/build/test-results/test/TEST-*'
path-replace-backslashes: 'false'
reporter: 'java-junit'
only-summary: 'false'
list-suites: 'all'
list-tests: 'all'
max-annotations: '10'
fail-on-error: 'true'
fail-on-empty: 'true'
working-directory: ''
상세한 내용은 공식 github 페이지에서 확인할 수 있다.
'Programming-[Backend] > Java' 카테고리의 다른 글
자바 기초 강의 정리 - 8. 클래스 패스, JAR (0) | 2024.07.15 |
---|---|
자바 기초 강의 정리 - 7. 리플렉션, 어노테이션, 클래스 로더 (0) | 2024.07.14 |
자바 기초 강의 정리 - 6. 직렬화, URL 및 소켓 프로그래밍 (0) | 2024.06.23 |
자바 기초 강의 정리 - 5. 데이터 입출력(Stream, Reader, Writer) (0) | 2024.06.22 |
자바 기초 강의 정리 - 4. CompletableFuture, Thread-safe, Concurrent, Atomic (0) | 2024.06.16 |