목차

Test Coverage

개요

Test Coverage는 개발자가 작성한 테스트 코드가 대상 소스 코드에 대해 테스트하는 코드를 작성했는지 그 커버하는 정도를 백분률과 코드 라인을 통해 알려주는 것을 말하며, Test Coverage를 분석하고 그 결과를 리포팅하는 것에 대해 설명한다.

설명

Test Coverage는 개발자가 작성한 코드에 대해 상응하는 테스트를 갖는 소스 코드의 비율을 평가하는 작업으로 다음과 같은 개념을 이해하는 것이 좋다.

Test Coverage Tool

Test Coverage를 수행하는 데는 다양한 툴이 있고, 각각 평가하는 나름의 로직을 갖고 있으며, 리포팅 또한 그 로직에 상응하는 형태라고 볼 수 있다. 따라서, 필요에 맞는 도구를 잘 선택하면 된다.

본 개발환경에서는 라이선스를 고려하여 EMMA와 EclEmma를 선택했다.
그러나, 코드를 수정하지 않고 툴로서 사용하기만 한다면 Cobertura를 사용하는 것도 괜찮다.

구분 툴 이름
상용 Clover
오픈소스 Cobertura, EMMA
Eclipse Plug-in EclEmma, Coverlipse

Cobertura 특징

본 개발환경에서 채택은 하지 않았지만, 고려대상 중 하나였던 Cobertura의 특징은 다음과 같다.

Test Coverage - EMMA

EMMA는 오픈소스로서 라이선스는 CPL (Common Public License) v1.0 이다.
Ant와 Maven에서 실행 가능하며, Command-line에서도 사용 가능하다.

EMMA 특징

EMMA를 이용한 Test Coverage 프로세스

EMMA Test Coverage HTML 리포트

환경설정

사용법

EclEmma 사용법

자세한 내용은 EclEmma Home을 참조하기 바란다.

  1. EclEmma 설치
    1. eGovFrame 통합메뉴에서 Configuration > Customize Development Tool 선택
    2. 리스트에서 EclEmma를 선택하여 설치를 진행한다.
  2. Test Coverage 실행 :
    • 툴바 이용 : EclEmma를 설치하면 툴바에 다음과 같은 아이콘이 생기고, Coverage AsCoverage Configuration 메뉴를 통해 실행할 수 있다.
    • Context Menu 이용 : 프로젝트나 테스트 코드를 선택하고 오른쪽 버튼을 클릭하여 Context Menu에서 Coverage As > JUnit Test 를 통해 수행할 수 있다.

  3. Coverage View 확인 : JUnit Test를 수행하면서 Test Coverage instrument 작업이 끝나면 Coverage View에 결과가 나타나며, 해당 항목을 더블클릭하면 해당 소스가 에디터 View를 통해 열린다.

Maven으로 EMMA 실행하기

  1. pom.xml 작성 : Maven을 이용한 EMMA 설정 샘플 참조
    • instrument : goal - emma:instrument
    • instrument + HTML Report : goal - emma:emma
  2. 리포트 확인 : target/site/emma 디렉토리 밑에서 coverage.xml 및 index.html (emma:emma) 리포트를 확인할 수 있다

Ant로 EMMA 실행하기

Ant에서 EMMA를 쓰는 일은 조금 까다롭다. 따라서, Ant 수행에 대해서는 EMMA 사이트Using EMMA With ANT For JUnit Test Coverage Reporting를 참조하기 바란다.

  1. build.xml 작성 : Ant를 이용한 EMMA 설정 샘플 참조
  2. Ant의 target 실행 : 이클립스에서 Ant 실행하기를 참조하여 설정된 target을 실행한다.
  3. 리포트 확인 : 지정된 위치 즉, outfile에 설정한 리포트를 확인할 수 있다

샘플

Maven을 이용한 EMMA 설정 샘플

전체 설정 내용은 EMMA 실행을 위한 pom.xml 설정 샘플을 참조하기 바란다.

  1. instrument : Test Coverage 분석만 하고 XML 결과까지만 남길 경우
    <build>
        <plugins>
            <!-- test -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>false</skipTests>
                    <forkMode>always</forkMode>
                    <reportFormat>xml</reportFormat>
                </configuration>
            </plugin>
            <!-- EMMA   -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>emma-maven-plugin</artifactId>
                <version>1.0-alpha-1</version>
            </plugin>
        </plugins>
    </build>
  2. Test Coverage HTML 리포트 생성
    <reporting>
        <plugins>
            <!-- EMMA Coverage Reporting -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>emma-maven-plugin</artifactId>
                <inherited>true</inherited>
            </plugin>
        </plugins>
    </reporting>

Ant를 이용한 EMMA 설정 샘플

전체 설정 내용은 EMMA 실행을 위한 build.xml 설정 샘플을 참조하기 바란다.

  1. instrument : Test Coverage 분석만 하고 XML 결과까지만 남길 경우
    <!-- EMMA 세팅 생략 -->
    <target name="emma-jars" depends="build" description="Uses Emma to instrument the jar files">
        <emma enabled="${emma.enabled}">
            <instr mode="fullcopy"
                   outdir="${basedir}/build/temp"
                   merge="yes"
                   filter="egovframework.dev.tst.*"
                   metadatafile="${artifactsDir}/test-coverage/coverage.em">
                <instrpath>
                    <fileset dir="build/" includes="${ant.project.name}.jar" />
                </instrpath>
            </instr>
        </emma>
    </target>
     
    <target name="test.with.emma" depends="emma-jars">
       . . . 중략 . . .
        <junit fork="yes"
               printsummary="yes"
               haltonfailure="no"
               failureproperty="test.failed"
               errorproperty="test.failed"
               dir="${basedir}">
            <classpath>
                <path refid="master-classpath" />
                <path refid="test-classpath" />
                <path refid="emma.lib" />
                <fileset dir="${basedir}/build/temp/lib"
                         includes="${ant.project.name}.jar" />
                <pathelement location="${testbuild.dir}" />
            </classpath>
     
            <formatter type="xml" />
            <batchtest fork="yes" todir="${artifactsDir}/test-results/xml">
                <fileset dir="${testbuild.dir}">
                    <include name="**/*Test.class" />
                </fileset>
            </batchtest>
        </junit>
    </target>
  2. Test Coverage 리포트 생성
    <!-- Test Code Coverage Report  -->
    <target name="emmareport" depends="test.with.emma">
        <move file="${basedir}/coverage.ec"
              todir="${artifactsDir}/test-coverage" />
        <emma description="now we can generate the emma report"
              enabled="${emma.enabled}">
            <report sourcepath="${src.dir}"
                    sort="+name,+method,+class"
                    metrics="method:70,line:80,class:100"
                    depth="method"
                    columns="name,class,method,block,line"
                    encoding="UTF-8">
                <infileset dir="${artifactsDir}/test-coverage"
                           includes="*.em, *.ec" />
                <!-- XML Report -->
                <xml outfile="${artifactsDir}/test-coverage/coverage.xml" />
                <!-- Text Report -->
                <txt outfile="${artifactsDir}/test-coverage/coverage.txt" />
                <!-- HTML Report -->
                <html outfile="${artifactsDir}/test-coverage/coverage.html" />
            </report>
        </emma>
    </target>

EMMA HTML 리포트 샘플

참고자료

1) EMMA의 coverage 기본 단위를 말하며, 일련의 바이트코드 명령이라고 볼 수 있다.