[Spring] JaCoCo를 활용한 테스트 커버리지 확인

WOOK JONG KIM·2022년 10월 31일
0
post-thumbnail

코드 커버리지란 소프트웨어의 테스트 수준이 충분하지를 표현하는 지표

커버리지를 확인하기 위해 가장 보편적으로 사용하는 도구가 JaCoCo(Java Code Coverage)
-> JUnit 테스트를 통해 애플리케이션의 코드가 얼마나 테스트 되었는지 Line,Branch를 기준으로 한 커버리지로 리포트

런타임으로 테스트 케이스를 실행하고 커버리지를 체크하는 방식으로 동작하며, 리포트는 HTML, XML,CSV와 같은 형식으로 확인 가능

의존성 추가

<dependency>
			<groupId>org.jacoco</groupId>
			<artifactId>jacoco-maven-plugin</artifactId>
			<version>0.8.7</version>
</dependency>

플러그인 설정(< build > 태그 내 추가)

			<plugin>
				<groupId>org.jacoco</groupId>
				<artifactId>jacoco-maven-plugin</artifactId>
				<version>0.8.7</version>
				<configuration>
					<excludes>
						<exclude>**/ProductServiceImpl.class</exclude>
					</excludes>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>prepare-agent</goal>
						</goals>
					</execution>
					<execution>
						<id>jacoco-report</id>
						<phase>test</phase>
						<goals>
							<goal>report</goal>
						</goals>
					</execution>
					<execution>
						<id>jacoco-check</id>
						<goals>
							<goal>check</goal>
						</goals>
						<configuration>
							<rules>
								<rule>
									<element>BUNDLE</element>
									<limits>
										<limit>
											<counter>INSTRUCTION</counter>
											<value>COVEREDRATIO</value>
											<minimum>0.80</minimum>
										</limit>
									</limits>
									<element>METHOD</element>
									<limits>
										<limit>
											<counter>LINE</counter>
											<value>TOTALCOUNT</value>
											<maximum>50</maximum>
										</limit>
									</limits>
								</rule>
							</rules>
						</configuration>
					</execution>
				</executions>
			</plugin>

Configuration 태그의 설정은 일부 클래스를 커버리지 측정 대상에서 제외하는 것

경로와 무관하게 ProductServiceImpl.class를 커버리지 측정 대상에서 제외하였음

< excution>

기본적으로 < goal > 을 포함하며, 설정한 값에 따라 추가 설정이 필요한 내용을 < configuration > 과 < rule > 을 통해 작성

< goal > 속성 값

  • help : jacoco-maven-plugin에 대한 도움말을 보여줌
  • prepare-agent : 테스트 중인 애플리케이션에 VM인수를 전달하는 JaCoCo 런타임 에이전트의 속성 준비, 에이전트는 maven-surefire-plugin을 통해 테스트한 결과 가져옴
  • prepare-agent-integration: prepare-agent와 유사하지만 통합 테스트에 적합한 기본값 제공
  • merge : 실행 데이터 파일 세트(.exec)를 단일 파일로 병합
  • report : 단일 프로젝트 테스트를 마치면 생성되는 코드 검사 보고서를 다양한 형식(HTML, XML, CSV)중에서 선택할 수 있게 함
  • report-integration : report와 유사하나 통합 테스트에 적합한 기본값 제공
  • report-aggregate : Refactor 내의 여러 프로젝트에서 구조화된 보고서를 생성, 보고서는 해당 프로젝트가 의존하는 모듈에서 생성
  • check : 코드 커버리지의 메트릭 충족 여부 검사, 메트릭이란 테스트 커버리지를 측정하는데 필요한 지표, 이는 check가 설정된 < execution > 태그 내 < rule > 을 통해 설정
  • dump : TCP 서버 모드에서 실행중인 JaCoco 에이전트에서 TCP/IP를 통한 덤프 생성
  • instrument : 오프라인 측정을 수행하는 명령
  • restore-instrumeneted-class : 원본 파일 저장 기능

Rule 설정

< configuration > 태그 안에 설정

Element는 코드 커버리지를 체크하는데 필요한 범위 기준 설정

  • BUNDLE(기본값) : 패키지 번들(프로젝트 내 모든 파일)
  • PACKAGE : 패키지
  • CLASS : 클래스
  • GROUP : 논리적 번들 그룹
  • SOURCEFILE : 소스 파일
  • METHOD : 메서드

BUNDLE은 Element를 기준으로 < limit> 태그 내 < counter> 과 < value > 를 활용해 커버리지 측정 단위와 방식 설정

Counter는 커버리지를 측정하는 데 사용하는 지표

  • LINE : 빈 줄을 제외한 실제 코드의 라인 수
  • BRANCH : 조건문 등의 분기 수
  • CLASS : 클래스 수
  • METHOD : 메서드 수
  • INSTRUCTION(기본 값) : 자바의 바이트코드 명령 수
  • COMPLEXITY : 복잡도, 멕케이브 순환 복잡도 따름

Value 태그로는 커버리지 지표 설정

  • TOTALCOUNT : 전체 개수
  • MISSEDCOUNT : 커버 되지 않은 개수
  • COVEREDCOUNT : 커버된 개수
  • MISSEDRATIO : 커버되지 않는 비율
  • COVEREDRATIO(기본값) : 커버된 비율
//<confiugration> 태그 안
<rules>
		<rule>
			<element>BUNDLE</element>
			<limits>
					<limit>
							<counter>INSTRUCTION</counter>
							<value>COVEREDRATIO</value>
							<minimum>0.80</minimum>
					</limit>
			</limits>
			<element>METHOD</element>
				<limits>
					<limit>
						<counter>LINE</counter>
							<value>TOTALCOUNT</value>
								<maximum>50</maximum>
					</limit>
				</limits>
		</rule>
</rules>

패키지 번들 단위로 바이트코드 명령 수를 기준으로 커버리자가 최소한 80프로 달성하는것을 Limit으로 설정

메서드 단위로 전체 라인 수를 최대 50라인줄로 설정하였음

-> 기준들을 벗어날 시 에러 발생


JaCoCo 테스트 커버리지 확인

JaCoCo plugin으로 테스트 커버리지를 측정하려면 메이븐의 테스트 단계가 선행되어야 함

메이븐 생명 주기에서 JaCoCo는 test 단계 뒤에 있는 package 단계에서 실행 가능

package를 더블 클릭해서 빌드를 진행하면 타겟 폴더네에 폴더가 생성됨

HTML 파일열면 리포트 결과 확인가능

  • Element : 커버리지를 측정한 단위를 표현
  • Missed Instructions - Coverage : 테스트를 수행한 후 바이트코드의 커버리지를 퍼센티지와 바 형식으로 제공
  • Missed Branches -Cov : 분기에 대한 테스트 커버지를 퍼센트와 바형식으로 제공
  • Missed - Cxty : 복잡도에 대한 커버리지 대상 개수와 커버되지 않은 수를 제공
  • Missed - Lines : 테스트 대상 라인 수와 커버되지 않은 라인 수 제공
  • Missed - Methods : 테스트 대상 메서드 수와 커버되지 않은 메서드 수 제공
  • Missed - Classes : 테스트 대상 클래스 수와 커버되지 않은 메서드 수를 제공

초록색은 테스트에서 실행되었단 의미, 빨간색은 실행되지 않은 라인 의미

조건문의 경우 true,false에 대한 모든 케이스가 테스트 되면 초록색, 둘중 하나만 되었다면 노란색

profile
Journey for Backend Developer

0개의 댓글