본문 바로가기

Server Development/Testing

Test Coverage with Jacoco

 

 

 

Code Coverage

- 소프트웨어의 테스트 수준이 충분한지를 측정하는 지표

- 테스트 코드 작성 후 해당 코드가 실행되었는지 테스트하는 지표를 의미한다.

- 여러가지 도구 존재. ex) Jacoco

 

Jacoco

- JAVA 코드의 커버리지를 체크하는 라이브러리

- 테스트 커버리지를 측정해준다.

- Runtime에서 측정

- 결과를 Html, xml, csv 형태로 저장해서 전달

 

테스트의 종류

- 블랙 박스 테스트 : 사용자 관점에서 입력에 대해 올바른 출력이 나오는지를 테스트

- 화이트 박스 테스트 : 개발자 관점에서 소스 내부 구조와 동작을 테스트 (Unit Test 등)

 

 

Maven의 라이프 사이클은 다음과 같다.

compile -> test -> package -> install -> deploy

Test Coverage는 이 중 test 단계에서 플러그인으로 사용되는 라이브러리 정도로 생각하면되고

특정 애플리케이션을 개발한다고 가정했을 때, test coverage를 통해 테스트가 얼마나 잘 되었는지 판단 후 애플리케이션의 배포를 한다고 생각하면 좋다. 

 

 

 

설정

 

Execution 내부에 설정

- prepare-agent : 테스트 중인 어플리케이션에서 인수를 전달하는 Jacoco Runtime Agent에 대한 property를 준비

- merge : 여러 실행 데이터 파일들을 하나로 통합하는 명령어

- report : 하나의 프로젝트 테스트에 대한 Code Coverage Report를 생성하는 명령어

- check : code coverage metric이 충돌되는지 확인하는 명령어

 

 

Jacoco Rule

- Element Type(코드 커버리지 체크 기준) : Bundle(default, 패키지 번들), Package(패키지), Class(클래스), Sourcefile(소스파일), method(메서드) 

- Counter(코드 커버리지를 측정할 때 사용되는 지표) : Line(라인 수), Branch(조건문 등의 분기 수), Class(클래스 수), Method(메서드 수), Instruction(Default, Java 바이트 코드 명령 수), Complexity(복잡도)

- Value(커버리지 정도를 나타내는 지표) : TotalCount(전체 개수), MissedCount(커버되지 않은 개수), CoverdCount(커버된 개수), MissedRatio(커버되지 않은 비율), CoveredRatio(커버된 비율)

 

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>**/테스트하지않을클래스명.class</exclude>
            <exclude>**/테스트하지않을패키지명/*</exclude>
        </excludes>
        <rules>
            // 예시 : 패키지 번들 단위로 메서드 수에 40%미만일 경우 에러 발생
            <rule>
                <element>BUNDLE</element>
                <limits>
                    <limit>
                        <counter>METHOD</counter>
                        <value>COVEREDRATIO</value>
                        <minimum>0.40</minimum>
                    </limit>
                </limits>
            </rule>
            // 예시 : 패키지에 라인수가 30초과시 에러 발생
            <rule>
                <element>PACKAGE</element>
                <limits>
                    <limit>
                        <counter>LINE</counter>
                        <value>TOTALCOUNT</value>
                        <maximum>30</maximum>
                    </limit>
                </limits>
            </rule>
        </rules>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

 

- 이렇게 설정을 끝내고 build 단계중, test보다 더 나중 단계를 실행하면 알아서 jacoco가 실행된다. 다른 플러그인 사용도 가능하니 여러가지 알아보고 다양하게 사용하면 좋을 것 같다.

- 안된다면 터미널을 이용해 해당 패키지에 들어가 mvn 명령어를 통해 validate → compile →test → package → install → deploy 순으로 처리시 동작한다. package까지 해줘도 동작

 

 

(+) SonarQube

-> 여러 프로젝트의 테스트 커버리지 등을 한번에 관리하는 도구

 

 

결과 분석

결과는 다양한 형태로 반환되는데, index.html이 가장 쉽게 확인가능하다.

초록색 줄 : 테스트가 잘 이루어짐

노란색 줄 : 조건문은 실행되었지만 반례에 대한 테스트 코드를 작성하지 않음

빨간색 줄 : 테스트가 이루어지지 않음

 

 

 

 

'Server Development > Testing' 카테고리의 다른 글

UNIT TEST - JUNIT5, Mockito  (0) 2023.07.16
Apache Jmeter  (0) 2023.05.15
Unit Test with MVC  (0) 2023.04.02
Swagger  (0) 2023.04.01
TDD  (0) 2023.03.27