티스토리 뷰

일단 바이트 코드 조작의 대표적인 예를 보면서 차근차근 살펴보겠습니다.

코드 커버리지(Code Coverage)는 어떻게 측정하는 걸까?

코드 커버리지란? 

소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나입니다.

테스트를 진행하였을 때 테스트 코드가 얼마나 실행되었는지를 수치화하여 확인할 수도 있습니다.

 

이제 코드 커버리지가 어떻게 보이는지 예제를 통해 살펴보겠습니다.

우선 프로젝트 생성하기 전에 현재 개발환경을 적어 놓겠습니다.

IDE : 인텔리제이 / 운영체제 : Mac OS / Java Version : 11

그럼 프로젝트 생성을 해보겠습니다.

새 프로젝트 생성 시 Maven을 클릭합니다.

Create from archetype 체크박스 클릭을 합니다.

그리고 maven-archetype-quickstart 클릭 후 Next 버튼을 클릭합니다.

 

프로젝트 이름은 codeCoverage입니다.

Next 클릭 후에 Finish 클릭하면 프로젝트가 생성됩니다.

 

package org.example;

public class Moim {

    int maxNumberOfAttendess;
    int numberOfEnrollment;

    public boolean isEnrollmentFull() {
        if (maxNumberOfAttendess == 0) {
            return false;
        }

        if (numberOfEnrollment < maxNumberOfAttendess) {
            return false;
        }

        return true;
    }
}

모임 최대 인원과 모임 등록한 인원을 비교하여 현재 모임의 정원이 가득 차 있는지를

boolean 값으로 리턴하는 메소드를 가진 Moim 클래스를 생성합니다. 

 

package org.example;

import junit.framework.TestCase;
import org.junit.Assert;
import org.junit.Test;

public class MoimTest {

    @Test
    public void isFull(){
        Moim moim = new Moim();
        moim.maxNumberOfAttendess = 100;
        moim.numberOfEnrollment = 10;
        Assert.assertFalse(moim.isEnrollmentFull());
    }

}

위 코드처럼 테스트 케이스를 작성하였습니다.

모임 최대 인원이 100명이고, 등록한 인원이 10명 일 경우

정원이 초과되지 않았으므로, 해당 테스트 코드는 통과되게 됩니다.

현재 테스트 코드가 내 소스코드에 얼마나 커버하면서 테스트를 했는지를  확인하는 툴이 코드 커버리지입니다.

 

<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> </executions>
    </plugin>
</plugins>

이제 프로젝트에 코드 커버리지 라이브러리인 JaCoCo를 추가해보겠습니다.

pom.xml에 플러그인을 추가하겠습니다. 

인텔리제이 상단 메뉴인 View -> Tool Windows -> Maven 클릭 후

위 사진처럼 M 버튼을 클릭하시고,  mvn clean verify 입력 후 엔터를 치시면 됩니다. 

 

위 사진처럼 target -> site -> jacoco -> index.html 파일이 있는 게 보이실 겁니다.

index.html 오른쪽 마우스 클릭 후 Run 'index.html' 클릭해주시면 되겠습니다.

그러면 브라우저 창이 생성될 겁니다.

 

org.example 패키지가 브랜치 커버리지 기준으로 50% 테스트(커버)가 되었다고 확인할 수 있습니다.

패키지와 마찬가지로 클래스 및 메소드 별로 테스트가 얼마나 되었는지도 확인할 수 있습니다.

소스 코드 파일에는 색상별로 어떤 식으로 테스트가 되었는지 구분되어 있습니다.

초록색은 해당 라인이 완벽하게 커버(테스트)가 되었다는 표시입니다.

노란색은 해당 라인이 모든 조건으로 테스트가 진행되지 않고, 일부 조건만 테스트가 되었다는 표시입니다.

빨간색은 해당 라인이 전혀 진행되지 않았다는 표시입니다.

 

위 사진처럼 현재 테스트 코드는

9라인 경우 maxNumberOfAttendess가 100 설정되었기 때문에 조건문이 false입니다. 

true인 조건을 만족하는 테스트 코드가 없어서 10라인이 실행이 안 되었고 일부 조건만 테스트되어 노란색으로 표시되어 있습니다.

 

13라인 경우에는 numberOfEnrollment가 maxNumberOfAttendess보다 크기 때문에 true입니다.

그리고 14라인이 실행되면서 해당 메소드는 종료하게 됩니다.

false인 조건을 만족하는 테스트 코드가 없어서 17라인이 실행이 안 되었고 일부 조건만 테스트되어 노란색으로 표시되어 있습니다.

 

그리고 JaCoCo는 사용자가 정의한 코드 커버리지율을 지키지 못할 경우 빌드 자체를 실패하게 설정할 수도 있습니다.

<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.90</minimum>
          </limit>
        </limits>
      </rule>
    </rules>
  </configuration>
</execution>

pom.xml에 excutions안에 작성하시면 됩니다.

minimum이 사용자가 정의할 코드 커버리지율이며, 1 = 100%입니다.

 

사용자가 정의한 코드 커버리지율에 테스트 코드가 만족되지 못할 경우 위 사진처럼 빌드가 실패하게 됩니다.

 

이로써 공부한 내용을 간략히 정리해보았습니다. 

감사합니다.


출처 

https://www.inflearn.com/course/the-java-code-manipulation

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

https://techblog.woowahan.com/2661/