JUnit 테스트 결과를 Excel Report로 생성하는 것은 오픈소스를 사용한 것이 아니라 전자정부 개발 프레임워크 개발환경의 테스트 도구에서 자체 개발한 기능이다. 여기에서는 Excel Report 기능에 대한 상세 내용에 대해 설명하도록 한다.
JUnit TestCase를 자동화하게 되면 결과를 남기게 되는데, Test Reporting에서 관련 내용을 확인할 수 있다. 국내에서는 엑셀 문서를 통한 보고나 관리 작업이 다양하게 일어나므로, 기본적으로 제공하는 Text, XML, HTML 외에 엑셀 형식을 작성할 수 있는 기능을 Ant Task와 Maven Plug-in으로 제공한다.
자세한 사용법은 Test Reporting과 테스트 결과 Excel 리포트를 참조하기 바란다.
코드의 구조는 다음과 같다.
3개의 프로젝트로 구성되어 있다.
프로젝트명 | 빌드 도구 | 설명 |
---|---|---|
egovframework-dev-tst | Maven pom.xml | JUnit Test XML Report 파일을 파싱하고, 템플릿 엑셀 파일을 읽어 들인 후, 값을 매핑하여 엑셀 리포트 파일을 생성하는 핵심 작업을 담당한다. |
egovframework-dev-tst-ant | Ant build.xml | egovframework-dev-tst.jar 파일을 사용하여 Ant Task를 제공한다. |
egovtest-maven-plugin | Maven pom.xml | egovframework-dev-tst.jar 파일을 사용하여 Maven Plug-in을 제공한다. |
프로젝트명 | 패키지명 | 설명 |
---|---|---|
egovframework-dev-tst | egovframework.dev.tst.report.junit | JUnit Test XML Report 파일을 파싱하고, 템플릿 엑셀 파일을 읽어 들여 값을 매핑하여 엑셀 리포트 파일을 생성하는 핵심 작업의 클래스들이 있다. |
egovframework-dev-tst | egovframework.dev.tst.report.util | Exception과 엑셀 처리 유틸리티 클래스가 있다. |
egovframework-dev-tst-ant | egovframework.dev.tst.report.ant | Ant Task인 EgovJUnitExcelReportTask 클래스가 있다. |
egovtest-maven-plugin | egovframework.dev.tst.mojo | Maven Plugin인 EgovJUnitExcelReportMojo 클래스가 있다. |
관계를 설명하면 다음과 같다.
프로젝트명 | 클래스 | 설명 |
---|---|---|
egovframework-dev-tst | ReportTestCase | 테스트 결과의 최소 단위인 TestCase 정보를 저장하는 VO 클래스이다. |
egovframework-dev-tst | ReportTestSuite | TestCase의 모음인 TestSuite 정보를 저장하는 VO 클래스이다. |
egovframework-dev-tst | TestSuiteXmlParser | org.xml.sax.helpers.DefaultHandler를 상속받아 JUnit Test XML 파일을 파싱하여 각 VO 클래스에 담는다. |
egovframework-dev-tst | JUnitReportParser | 저장된 VO 클래스를 이용하여, Summary, Package, TestCase Lists 등 리포팅을 위한 정보를 재구성한다. |
egovframework-dev-tst | EgovJUnitExcelReportGenerator | JUnitReportParser가 구성한 리포팅 정보를 템플릿 엑셀 파일을 읽어 목록을 구성하고 엑셀 리포트 파일을 생성한다. |
egovframework-dev-tst | EgovExcelUtil | EgovJUnitExcelReportGenerator에서 엑셀 관련 Apache POI를 사용한 처리 유틸리티 클래스이다. |
egovframework-dev-tst | EgovTestException | Exception 클래스이다. |
egovframework-dev-tst | template-junit.xls | 엑셀 리포트 생성을 위한 기본 템플릿 엑셀 파일이다. |
egovframework-dev-tst-ant | EgovJUnitExcelReportTask | org.apache.tools.ant.Task를 상속하여 구현된 Ant Task 클래스이다. |
egovframework-dev-tst-ant | egovtest.properties | Ant Task로 사용하기 위한 Task명을 정의한 프로퍼티 파일이다. |
egovtest-maven-plugin | EgovJUnitExcelReportMojo | org.apache.maven.plugin.AbstractMojo를 상속하여 구현된 Maven Plugin Goal 클래스이다. |
egovtest-maven-plugin | egovtest-report.properties | Maven Plug-in에서 사용하는 프로퍼티 파일이다. |
egovtest-maven-plugin | META-INF/maven/lifecycle.xml | Maven Plug-in의 lifecycle을 정의한 설정 파일이다. |
egovframework-dev-tst 프로젝트에는 JUnit Test Excel Generator 기능을 갖고 있다. 각 클래스에 대해 설명하면 다음과 같다.
✔ egovframework-dev-tst
프로젝트의 클래스 설명은 API 문서와 해당 소스를 참조하기 바란다. 또한 egovframework-dev-tst 프로젝트 소스 코드에서 관련 내용을 확인하기 바란다.
먼저, JUnit이 테스트 결과 생성하는 XML 파일의 구조에 대해 알아보자. XML 파일이 생성되는 곳은 Maven과 Ant로 사용시 각각 다르지만, TEST-[TestCase Full Name].xml 과 같이 생성된다. XML 구조는 다음과 같다.
EgovJUnitExcelReportGenerator
클래스는 템플릿 엑셀 파일을 읽어 들여, 테스트 결과 값을 매핑한 뒤 엑셀 리포트로 생성하는 역할을 한다. 이 때, EgovExcelUtil을 사용하여 엑셀 파일을 핸들링한다. 본 클래스와 EgovExcelUtil
클래스는 엑셀 파일을 핸들링하기 위해 엑셀 처리 오픈소스인 Apache POI를 사용하였다. 자세한 내용은 Apache POI Quick Guilde를 참조하도록 하고, 여기에서는 EgovJUnitExcelReportGenerator
클래스를 기준으로 설명하도록 한다.
구분 | 입력 파라미터 | 설명 | Default |
---|---|---|---|
XML로부터 테스트 결과 정보를 갖기 위한 정보 | JUnitReportParser parser | JUnit XML Parser | N/A |
XML로부터 테스트 결과 정보를 갖기 위한 정보 | List<File> xmlReportFileList | JUnit Test XML 파일 Full Path 목록 | 없으면 오류 처리 |
XML로부터 테스트 결과 정보를 갖기 위한 정보 | List<ReportTestSuite> testSuites | Test Suite Lists | N/A |
엑셀 파일 생성을 위해 필요한 정보 | File templatePath | Excel 리포트의 템플릿 리포트 파일의 Full Path | ”/template-junit.xls”의 파일 객체 |
엑셀 파일 생성을 위해 필요한 정보 | File outputDirectory | Excel 파일이 작성될 디렉토리 위치 | 없으면 오류 처리 |
엑셀 파일 생성을 위해 필요한 정보 | String outputName | Excel 리포트 파일명 | “egovtest-junit.xls” |
POI 엑셀 파일 정보 | HSSFWorkbook book | POI 엑셀 파일 정보 | N/A |
템플릿 엑셀 파일의 각 헤더 위치 정보 | int[] summaryPosInfos | Summary 헤더 위치 정보 | { 0, 0, 3 } |
템플릿 엑셀 파일의 각 헤더 위치 정보 | int[] packagePosInfos | Package 헤더 위치 정보 | { 0, 0, 7 } |
템플릿 엑셀 파일의 각 헤더 위치 정보 | int[] listsPosInfos | TestCase Lists 헤더 위치 정보 | { 1, 0, 3 } |
상수 | IDX_SHEET = 0 IDX_COL = 1 IDX_ROW = 2 | 템플릿 엑셀 파일의 헤더 위치 정보를 담고 있는 Array의 인덱스 상수. sheet, column, row 순서 |
생성자에서 입력 받아야 하는 정보는 다음과 같다.
generateExcelReport()
: Excel 파일을 생성하는 메인 함수. EgovJUnitExcelReportGenerator]] 참조private void init()
: 필요한 입력 정보를 확인하고 입력되지 않은 정보가 있는 경우 오류 메시지를 출력한다constructSummaryTable()
: Summary Table 항목을 채운다.constructPackageTable(Map suitePackages)
: Package 별 Table 항목을 채운다.constructTestCaseListTable(Map suitePackages)
: TestCase 별 Table list를 채운다.엑셀 파일 핸들링을 위해서는 Apache POI의 HSSF 객체를 사용할 것이다. 자세한 소스 코드는 EgovExcelUtil을 참조하기 바란다.
EgovExcelUtil.readExcelFile
: 엑셀 파일 읽어서 Workbook 생성한다.EgovExcelUtil.writeExcelFile
: 엑셀 파일로 저장한다.EgovExcelUtil.setCellValues
: Cell에 값을 세팅한다.EgovExcelUtil.getLogicalRowNum
: 실제 열 값 (1-based) 값을 논리적인 0 기준의 열 값으로 바꾼다.EgovExcelUtil.getLogicalColNum
: 실제 컬럼명인 알파벳 (e.g, A ~ Z) 값을 논리적인 0 기준의 칼럼값으로 바꾼다.
Apache POI를 이용하면 엑셀 파일에 대한 핸들링을 하는 예는 Apache POI Quick Guilde를 참조하기 바란다.
EgovJUnitExcelReportTask
클래스는 다음과 같다. 간략한 소스 소개는 egovframework-dev-tst-ant 프로젝트 소스 코드에서 확인한다.
EgovJUnitExcelReportTask
클래스는 Ant Task 프레임워크에 맞게 구현된 클래스이다. Ant Task의 관점에서 구조를 살펴보자.
<egov-junitreport todir="${testxls.dir}"> <fileset dir="${testreports.dir}" includes="**/TEST-*.xml" /> </egov-junitreport>
<egov-junitreport todir="${testxls.dir}" outputname="egovtest-junit-full.xls" templatepath="${basedir}/build/template-kr.xls" summary="0,B,6" packages="0,B,11" lists="1,A,5"> <fileset dir="${testreports.dir}" includes="**/TEST-*.xml" /> </egov-junitreport>
org.apache.tools.ant.Task
를 상속받은 Ant Task 클래스를 작성한다. public class EgovJUnitExcelReportTask extends Task {
public void execute() throws BuildException
메소드에서 처리할 기능을 작성한다.
EgovJUnitExcelReportMojo
클래스는 다음과 같다.
EgovJUnitExcelReportMojo
클래스는 Maven에 egovtest라는 artifactID와 junit-xls라는 goal을 통해 엑셀 리포팅 기능을 제공하는 Plugin이다.
Maven에 기능을 제공하는 Plug-in 또한 몇 가지 틀을 갖추면 작성할 수 있다. 자세한 내용은 http://maven.apache.org/plugin-developers/index.html을 참조하기 바란다.
<groupId>egovframework.dev</groupId> <artifactId>egovtest-maven-plugin</artifactId> <packaging>maven-plugin</packaging> <version>1.0.0</version> <name>egovtest-maven-plugin Maven Mojo</name> <url>http://maven.apache.org</url> . . . 중략 . . . <dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-plugin-testing-harness</artifactId> <scope>test</scope> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>2.0</version> </dependency>
Mojo란 Maven Old Java Object의 약자로 Maven2의 goal을 의미하며, 자세한 내용은 http://maven.apache.org/guides/introduction/introduction-to-plugins.html를 참조하기 바란다.]])). Mojo를 작성하기 위해서는 미리 몇 가지를 정의해야 한다.
/**
* @goal junit-xls
* @execute phase="test" lifecycle="egovtest"
*/
org.apache.maven.plugin.AbstractMojo
를 상속받는다.import org.apache.maven.plugin.AbstractMojo; public class EgovJUnitExcelReportMojo extends AbstractMojo {}
/** * Excel 파일이 작성될 디렉토리 위치 * * @parameter expression="${outputDirectory}" * default-value="${project.build.directory}/egovtest" * @required */ private File outputDirectory; /** * Excel 리포트 파일명 * * @parameter expression="${outputName}" default-value="egovtest-junit.xls" * @required */ private String outputName; /** * Excel 리포트 생성을 위한 JUnit Test 결과 XML 파일 위치 * * @parameter expression="${reportsDirectory}" * default-value="${project.build.directory}/surefire-reports" */ // private File[] reportsDirectories; private File reportsDirectory; /** * Excel 리포트의 템플릿 리포트 파일의 각 헤더 위치 정보 * * @parameter expression="${headerPosition}" */ private Map headerPosition; /** * Excel 리포트의 템플릿 리포트 파일의 Full Path * * @parameter expression="${templatePath}" */ private File templatePath; /** * Maven Project * * @parameter expression="${project}" * @required @readonly */ private MavenProject project;
public void execute()
메소드에 주요 기능을 작성한다.public void execute() throws MojoExecutionException, MojoFailureException { ... }
egovframework.dev.tst.report.emma
와 같이 report 밑에 서브 패키지를 작성한다.egovframework.dev.tst.report.junit
패키지의 클래스와 같이 VO 클래스, XMLParser, ReportParser, ExcelReportGenerator 등의 클래스를 기능에 맞게 작성한다.주요 기능을 작성하고 난 후 필요에 따라 Ant Task를 작성한다.
egovframework.dev.tst.report.ant
패키지 밑에 EgovJUnitExcelReportTask
와 같이 클래스명을 작성한다.주요 기능을 작성하고 난 후 필요에 따라 Maven Plugin을 작성한다.
egovframework.dev.tst.mojo
패키지 밑에 EgovJUnitExcelReportMojo
와 같이 클래스명을 작성한다.본 기능은 3개의 프로젝트가 모두 TDD(Test-driven Development) 방식으로 구현하고자 애썼다. 따라서, 구현 전에 작성했듯, 기능 구현 후에 작성했든 각 클래스에 대한 TestCase들을 작성해 두었고, 각 클래스가 처리해야 할 기능에 집중하여 테스트 코드를 작성하였다.
egovframework-dev-tst 프로젝트의 TestCase는 주로 JUnit4와 Unitils를 이용한 일반적인 TestCase이다. 각 테스트 코드에서 사용하는 자료들은 resources 디렉토리에 위치한다. 특히 JUnitExcelReportGeneratorTest
클래스는 Apache POI를 사용하여 엑셀 파일이 잘 작성되고 스타일과 헤더값들이 제대로 작성되어 있는지 등을 테스트하는 내용까지 포함되어 있다.
egovframework-dev-tst-ant 패키지의 TestCase는 Ant Task를 테스트하기 위한 테스트 코드이다. Ant에서는 Task를 테스트할 수 있도록 JUnit 3.8을 확장한 Test Framework을 제공한다. 이를 통해 build.xml에 설정한 내용이 제대로 수행되는지 확인해 볼 수 있다.
org.apache.tools.ant.BuildFileTest
를 상속하여 TestCase를 작성한다.import org.apache.tools.ant.BuildFileTest; public class JUnitExcelReportTaskTest extends BuildFileTest
public void setUp() throws Exception { configureProject(TestUtil.getBaseDirString(this.getClass()) + "/unit/egovtest-excel-test/build.xml"); }
org.apache.tools.ant.BuildFileTest
에서 정의한 다양한 메소드를 활용하여 테스트 코드를 작성한다.
Mojo를 작성할 때도 pom.xml을 테스트할 수 있는 기반을 제공해 준다.
org.apache.maven.plugin.testing.AbstractMojoTestCase
클래스를 상속받아 TestCase를 작성한다.import org.apache.maven.plugin.testing.AbstractMojoTestCase; public class JUnitExcelReportMojoTest extends AbstractMojoTestCase {}