본문으로 바로가기

[Jacoco] 코드 커버리지 측정하기

category 프로그래밍/자바 2019. 10. 12. 16:16

백기선님의 인프런 강의를 듣는중 Jacoco를 통한 코드 커버리지 측정하는 부분을 정리해봅니다.

 

코드 커버리지란?

소프트웨어의 테스트를 논할 때 얼마나 테스트가 충분한가를 나타내는 지표중 하나다. 말 그대로 코드가 얼마나 커버되었는가이다. 소프트웨어 테스트를 진행했을 때 코드 자체가 얼마나 실행되었냐는 것이다.

코드의 구조를 이루는 것은 크게 구문(Statement), 조건(Condition), 결정(Decision)이다. 이러한 구조를 얼마나 커버했느냐에 따라 코드커버리지의 측정기준은 나뉘게 된다. 일반적으로 많이 사용되는 커버리지는 구문(Statement)커버리지이며, 실행 코드라인이 한번 이상 실행 되면 충족된다. 조건(Condition)커버리지는 각 내부 조건이 참 혹은 거짓을 가지면 충족된다. 결정(Decision) 커버리지는 각 분기의 내부 조건자체가 아닌 이러한 조건으로 인해 전체 결과가 참 혹은 거짓이면 충족된다. 그리고 조건과 결정을 복합적으로 고려하는 MC/DC 커버리지 또한 있다. 커버리지를 측정하는 법은 사람이 로그를 찍어가거나 디버거를 이용하여 볼수는 있으나 매우 힘든 과정이다. 시중에는 많은 코드커버리지 측정 도구가 나와 있으며, 대표적인 도구로 DT10, LDRA, VectorCAST, CodeScroll Controller Tester, QualityScroll Cover 라는 도구가 있다.

(https://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%EC%BB%A4%EB%B2%84%EB%A6%AC%EC%A7%80)

 

 

여기서 코드 커버리지 측정하는 라이브러리는 Jacoco를 사용합니다.

 

Step1. pom.xml에 추가

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>me.wony</groupId>
	<artifactId>classLoaderTest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>classLoaderTest</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>11</maven.compiler.source>
		<maven.compiler.target>11</maven.compiler.target>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>


	<build>
		<plugins>
			<plugin>
				<groupId>org.jacoco</groupId>
				<artifactId>jacoco-maven-plugin</artifactId>
				<version>0.8.4</version>
				<executions>
					<execution>
						<goals>
							<goal>prepare-agent</goal>
						</goals>
					</execution>
					<execution>
						<id>report</id>
						<phase>prepare-package</phase>
						<goals>
							<goal>report</goal>
						</goals>
					</execution>
					<execution>
						<id>jacoco-check</id>
						<goals>
							<goal>check</goal>
						</goals>
						<configuration>
							<rules>
								<rule>
									<element>PACKAGE</element>
									<limits>
										<limit>
											<counter>LINE</counter>
											<value>COVEREDRATIO</value>
											<minimum>0.50</minimum>
										</limit>
									</limits>
								</rule>
							</rules>
						</configuration>
					</execution>

				</executions>
			</plugin>
		</plugins>
	</build>


</project>

Step2. Help > Install New Software...에서 

http://update.eclemma.org/를 입력하여 EclEmma 플러그인을 설치

설치를 완료하게 되면 restart가 되고 project 우측 마우스를 눌러보면 CoverageAs 생김

 

실행해보면 아래의 그림처럼 나오게 됩니다.

MoimTest.java를 보면 모두 측정되었다고 나오지만

Moim.java를 보면 76.5% 만 측정되었다는 것을 알수있습니다.

노란색은 분기문을 말하며 초록색은 실행이 되었고 빨간색은 실행되지 않았다는것을 의미합니다.

 

 

프로그램의 품질을 높이는 기술들을 볼때마다 새롭게 느껴지지만 

과연 실무에서 적용을 하는 회사들이 있을까라는 생각이 든다.

만약 그런곳이 있다면 그곳에서 성장하고 싶다.ㅎㅎ