1. Java Code Coverage Lib
- 자바 코드 커버리지를 확인 할 수 있는 라이브러리
- html과 같은 리포트 화면 제공
- https://www.eclemma.org/jacoco/index.html
2. 확인 계기 및 과정
1) pull request 이후 build 체크 시 에러가 발생한다고 메시지가 옴 → Details
버튼을 클릭하면 페이지 이동
2) TestCase에서 영속성 초기화가 안되서 그런 것으로 생각하고 있었는데 맞는지 한번 확인해보기로 함 → ./gradlew.bat test jacocoTestCoverageVerification
→ProductService 에서 1개의 line이 호출이 안 됬다고 리포팅 해줌
3) 테스트 실패 나는 테스트부터 처리 하기로 함. → 웹으로 확인 → /app/build/reports/jacoco/tests/test/index.html
브라우저로 열기
4) 2가지 케이스에 대해 실패 확인 → ProductRepository 쪽 소스임
5) 문제가 되는 소스 제거 및 수정 하여 테스트 케이스 100퍼센트로 만듬
6) 프로젝트의 root 폴더에서 명령어로 jacoco 확인 → 그래도 문제가 있음. → 역시나 동일한 ProductService에서 1개가 hit하지 않음
7) /app/build/reports/jacoco/html/index.html
브라우저로 Open
8) com.codesoom.assignment.application Package에서 Code Coverage가 84%임을 확인 → 클릭해서 들어가 보면 ProductService에서 91% Code Coverage임 을 확인
9) ProductService 클릭 → getProduct(Long)이 호출이 안됨 → getProduct(Long) 클릭
10) getProduct(Long)이 hit가 안됨
11) 여기가 호출이 안된 건가? → ./gradlew.bat --info test jacocoTestCoverageVerification
→ --info
옵션으로 상세 확인
12) Controller는 제대로 호출됨 확인
13) Repository에서 호출이 BDD관계가 이상함을 발견 → { }
(브라켓) 처리가 이상해서 수정 → 호출은 이상 없어 보임 → 수정 후 테스트 케이스 정상 확인
)
14) ./gradlew.bat --scan test jacocoTestCoverageVerification
→ --scan
옵션으로 Gradle사이트에서 확인 → 중간에 yes 누르면 사이트 주소 알려줌.
15) 사이트에서 확인 → ProductService에서 hit가 안됨
17) ProductServiceTest에서 getProduct 호출 부분 메서드 확인 → 발견 repository에서 호출했음.
@Test
@DisplayName("요청한 고양이 장난감을 반환한다.")
void existed_getProduct_return() {
//productService.getProduct(productId); 가 호출 되었어야함
Optional<Product> returnProduct = productRepository.findById(productId);
assertThat(returnProduct.get())
.extracting("id")
.isEqualTo(productId);
}
18) ProductServiceTest 소스 수정 후 테스트 점검
@Test
@DisplayName("요청한 고양이 장난감을 반환한다.")
void existed_getProduct_return() {
product = productService.getProduct(productId);
assertThat(product)
.extracting("id")
.isEqualTo(productId);
}
19) 테스트 정상 확인
20) .\gradlew.bat test jacocoTestCoverageVerification
다시 실행 → Build 성공
21) hit 확인