관리 메뉴

nalaolla

코드 커버리지 가이드 본문

프로젝트 개발정보

코드 커버리지 가이드

날아올라↗↗ 2017. 12. 4. 22:55
728x90

개요

코드 커버리지의 의미를 설명하고 단위 테스트와 병행하여 코드 커버리지를 측정하는 방법 및 그 수치를 높일 수 있는 방안을 예시한다.


코드 커버리지란?

코드 커버리지(Code Coverage)란, 소프트웨어 테스트에서 얼마나 테스트가 충분한지를 나타내는 지표 중 하나다. (말 그대로 코드가 얼마나 커버되었는가, 하는 정도다) 소프트웨어 테스트를 하면 얼마나 많은 코드가 실행되었느냐를 의미한다. 개발자 입장에서 이해하기 쉽게 풀이하면, 스프링 테스트로 MVC 컨트롤러를 테스트할 때, 만약 서비스 구현 코드에 조건 분기(if ~ else if ~ else)가 많을 경우 가장 단순한 케이스 한 가지만 테스트할 때보다 각 케이스별로 테스트 코드를 작성하여 실행할 때 코드 커버리지 수치(%)가 높다.



그러나, 마틴 파울러(Martin Fowler)가 지적했듯이 코드 커버리지가 반드시 준수해야 할 절대적인 품질 관리(QA) 지표는 아니며, 코드베이스 중 테스트되지 않은 영역의 비중 및 위치를 파악하여 코드 품질을 높일 수 있는 하나의 수단으로 바라보는 편이 좋다.


코드 커버리지 충족 기준

코드 커버리지에 관한 국제적으로 통용되는 기준 수치는 따로 없으나, 100%는 현실적으로 거의 불가능하며 80% 정도를 목표치로 잡는 게 업계의 지배적인 시각이다. 따라서 프로젝트별로 최소 60% 이상 커버리지를 목표로 하되, 중요 모듈의 경우 80%까지 상향 조정할 것을 권고한다.




이클립스 플러그인(EclEmma) 설치 및 사용 방법

개발자가 이클립스 개발 환경에서 플러그인을 통해 코드 커버리지를 측정하는 방법을 안내한다. 코드 커버리지 관련 툴은 여러 종류가 있지만, EclEmma 팀에서 개발한 JaCoCo(Java Code Coverage)라는 자바 전용 라이브러리를 사용한다.

1. pom.xml에 다음 코드를 추가한다.

<dependencies>
...
    <!-- JaCoCo configuration -->
    <dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.7.9</version>
    </dependency>
...
</dependencies>
 
 
<build>
    <plugins>
        ...
        <!-- JaCoCo configuration -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.9</version>
            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        ...
    </plugins>
 
</build>


2. Help > Install New Software...에서 http://update.eclemma.org/를 입력하여 EclEmma 플러그인을 설치한다.


3. 설치 후 이클립스를 restart하면 다음과 같이 커버리지 실행 아이콘이 추가된다.


4. 코드 커버리지를 측정할 프로젝트를 선택 후, 위 아이콘을 클릭하거나 단축키 Alt + Shift + E, T를 누르면 단위 테스트가 실행되면서 커버리지가 측정된다.


5. 커버리지 측정이 완료되면, Coverage 탭에 다음과 같이 결과가 표시된다.


프로젝트의 클래스별 코드 커버리지가 적녹색 막대 그래프와 함께 시각적으로 표시된다. 위 그림에서 이 프로젝트의 전체 코드 커버리지는 32.5%임을 알 수 있다.


6. 단위 테스트가 수행된 코드의 흔적을 상세히 추적하려면 Coverage 탭에서 해당 클래스를 더블 클릭한다.


적색은 테스트되지 않은 코드(untested code), 녹색은 테스트된 코드(tested code)를 의미하며, 결국 적색으로 표시된 코드를 줄이는 것이 코드 커버리지를 높이는 길이다.


7. Coverage 탭의 다음 버튼을 클릭하여 코드 편집기에서 적녹색으로 표시된 부분을 없애고 세션을 종료한다.




코드 커버리지 개선 예시

방금 전 예로 든 BoardServiceImpl 클래스에서 적색 부분을 녹색으로 바꾸려면 if (board.getFiles() != null ...) { 조건에 해당하는 별도의 테스트를 추가해야 한다. 즉, 파일을 업로드하는 POST 요청까지 함께 테스트해야 할 것이다.


1. 기존 테스트 코드를 다음과 같이 변경하여 목 업로드 파일 2개를 첨부한다.

@Test
public void test005BoardWriteSubmit() throws Exception {
     
    /* 기존 코드
    mockMvc.perform(post("/write/submit")
                   .param("title", "테스트 게시글")
                   .param("contents", "내용이 여기에 들어갑니다..."))
           .andExpect(content().contentType(HTML_CONTENT_TYPE));
    */
 
    mockMvc.perform(fileUpload("/write/submit")
                   .file(new MockMultipartFile("files""dummyFile01""text/plain""dummyFile01_Contents".getBytes()))
                   .file(new MockMultipartFile("files""dummyFile02""text/plain""dummyFile02_Contents".getBytes()))
                   .param("title""파일 업로드 테스트")
                   .param("contents""내용은 여기에 들어갑니다..."))
           .andExpect(content().contentType(HTML_CONTENT_TYPE));
}


2. JUnit 테스트를 먼저 실행해보고 오류가 없으면 EclEmma 플러그인을 실행하여 코드 커버리지를 다시 측정한다.


3. 다음 결과 화면을 보면 전체 코드 커버리지가 43.3%로 상당히 개선되었음을 알 수 있다. 하나의 예에 불과하지만 이와 같은 방법으로, 개발자는 수시로 단위 테스트와 병행하여 코드 커버리지를 측정하고 개선할 수 있다.





소나큐브 서버에서 커버리지 확인

개발자가 깃 master 브랜치에 푸시한 소스 코드는 매일 21시, 젠킨스 서버에서 자동으로 코드 커버리지를 산출한다. 소나큐브 서버에 접속 후 해당 프로젝트를 클릭하면 다음과 같이 집계된 코드 커버리지 수치를 확인할 수 있다.


Coverage 항목을 클릭하면 클래스별로 좀 더 상세한 커버리지 정보를 조회할 수 있다.


소나큐브 서버에서 자동 집계한 수치는 master 브랜치에 전날 21시에 푸시된 소스 코드를 기준으로 하므로 로컬에 내려받은 브랜치가 상이하거나 소스 코드를 수정했을 경우, 이클립스 플러그인으로 측정한 수치와 달라질 수 있음을 감안한다.


728x90