본문 바로가기
Homo Coding

테스트 데이터 관리

by javauser 2009. 11. 11.

Unitils (버전 2.4 기준)에는 테스트 데이터 관리를 위해 dbunit 방식의 XML 형태로 관리를 한다.
하지만, DB 데이터를 XML로 변환하는 작업이 수반되어야 하기 때문에 Excel 형태로 관리된 테스트 데이터를 사용하는 경우도 있다.
이 경우, Unitils의 DataSetFactory를 확장하여, excel 형태의 데이터를 로딩해서 테스트를 수행하게끔 가능하다.

Unitils의 properties 파일에는 다음과 같이 기본 DataSetFactory가 XML을 읽어들이게끔 설정되어 있다.

unitils-default.properties
# Default factory that is used to create a dataset object from a file for the @DataSet annotation
DbUnitModule.DataSet.factory.default=org.unitils.dbunit.datasetfactory.impl.MultiSchemaXmlDataSetFactory

테스트 코드에서는 @DataSet을 사용해서 XML에 정의된 데이터를 테스트 수행시 사용이 가능하다.

@Test @DataSet("test-data.xml")
public void testSomeMethod() {
   ...
}


여기에서 Excel 을 사용하려면 MultiSchemaXmlDataSetFactory가 구현한 org.unitils.dbunit.datasetfactory.DataSetFactory 인터페이스를 구현하면 된다.

import java.io.File;
import java.io.IOException;
import java.util.Properties;

import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.excel.XlsDataSet;
import org.unitils.dbunit.datasetfactory.DataSetFactory;
import org.unitils.dbunit.util.MultiSchemaDataSet;

public class XlsDataSetFactory implements DataSetFactory {

 private String defaultSchemaName;
 public MultiSchemaDataSet createDataSet(File... dataSetFiles) {
  if (dataSetFiles == null || dataSetFiles.length <= 0 || dataSetFiles[0] == null) {
   throw new RuntimeException("xls 파일이 없습니다.");
  }
  
  if (!dataSetFiles[0].getName().endsWith(".xls")) {
   throw new RuntimeException("xls 파일 확장자가 다릅니다.");
  }
  
  MultiSchemaDataSet multiSchemaDataSet = new MultiSchemaDataSet();
  
  IDataSet idataSet = null;
  try {
   idataSet = new XlsDataSet(dataSetFiles[0]);
  } catch (DataSetException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  multiSchemaDataSet.setDataSetForSchema(defaultSchemaName, idataSet);
  return multiSchemaDataSet;
 }

 public String getDataSetFileExtension() {
  return "xls";
 }

 public void init(Properties configuration, String defaultSchemaName) {
  this.defaultSchemaName = defaultSchemaName;
 }

}


위의 코드에서는 DBUnit의 IDataSet의 한 형태은 XlsDataSet을 사용하고 있다.
테스트 코드는 다음과 같다.


@Test @DataSet("test-data.xls" factory=XlsDataSetFactory.class)
public void testSomeMethod() {
   ...
}

Excel 데이터는 각각의 시트가 개별 테이블명이 되어 있어야 하며, 최상위 행은 컬러명, 그다음의 행부터 실제 데이터를 입력하면 된다.

옆의 그림과 같이 TB_TAB1 이라는 테이블 데이터와
TB_TAB2 라는 테이블 데이터 두개가 정의되어 있다.

그리고, Excel은 POI를 사용하고 있기 때문에 이에 대한 의존관계를 추가해주어야 한다.
따라서, 현재 Excel 2007 (확장명이 .xlsx)은 지원하지 못하며, .xls 로만 저장되어야 한다.

XML이 아닌 Excel로만 테스트 데이터를 관리하고자 한다면 위의 properties 에 정의된 내용을 overriding하면 된다.

반응형