본문 바로가기

Programming/JAVA

[펌] DBUnit의 사용

== Background Story.. ==

 

Handysoft에서 그룹웨어 개발을 할 때이다.(이 글을 쓰는 현재도 하고 있다 ㅠㅠ)

당시 개발환경이 테스트 서버에 모듈을 올리고 직접 유저가 되어서 사용을 하고, 그 로그를 분석하고 수정, deploy를 하는 환경이었다. 그나마 remote debugging이 있어서 그 불편한 과정을 조금 줄일수 있었다.

 

당시 Test기반의 개발 프로세스를 따르지 않아서 TestCase가 없는 상황이었다.

당장 제품의 빌드가 다가왔기에 단위 유닛 테스트보다는 시나리오 테스트를 짜야했고, RF로 인해서 없어질 지 모르는 코드에 유닛 테스트를 작성하기에는 시간이 부족했다.

 

Client와 Server간 통신하는 부분을 분석해보니 WSDL(SOAP기반의 웹서비스가 아니기에 WSDL이라 하기에는 무리지만 파일의 확장자가 wsdl이고 wsdl의 형식에 따랐다.)에 정의된 인터페이스에 맞게 자체 제작한 핸디 프레임웍 기반의 프로토콜을 사용했다.

게다가 C++의 클라이언트 모듈에서 Server로 쏘기때문에 그 모듈을 사용할 수 없었다.(JNI를 쓰자니 배보다 배꼽이 더 큰 상황이다.)

 

따라서 전체적인 시나리오에서 콘트롤러 부분만 잘 이용하기로 했으며 transaction을 관리하는 manager를 mock형식으로(mock은 아니다.. -_- ) 사용했다. 즉 하나의 독립적인 사용자의 행동에 맞는 db transaction이 발생하는지를 테스트 하는 것이었다.

transaction manager에 쌓인 db query를 분석해서 expected query과 assertion하는 junit scenario test를 작성하였다.

 

여기서 data의 종속적인 면이 나타난다. data는 해당 database에 등록되어 있는 것을 사용해야 했는데 테스트 서버는 여러대이기에 database 종속적인 data로는 한계가 있고, 사용자의 unit operation 하나하나에만 촛점을 맞추기 때문에 여러 operation을 통한 test는 불가능하다.

 

작은 메모리나 파일의 테스트를 위한 DB를 이용하고(HSQLDB사용), dbunit을 이용하여 data의 종속적인 면을 제거하고 하나 이상의 사용자 작업을 누적해서 테스트 할수 있는 환경을 추구하게 된다.

 

 

== Why DBUnit ==

 

개발 환경에서 test용으로 사용하는 database는 독립된 서버로 동작하며, 단위 테스트에서 database를 사용할 경우 local에 간단한 database가 필요한 경우가 있다.

간단한 schema와 샘플 data, 가벼운 database로 테스팅하는데 도움이 되는 xUnit이다.

 

== Environment ==

 

Database : HSQLDB (http://hsqldb.sourceforge.net)

JDBC Driver Class Name : org.hsqldb.jdbcDriver

JDBC URL : jdbc:hsqldb:db_file ( file mode)

                  jdbc:hsqldb:. (memory mode)

 

 

== Starting... ==

 

1. database schema를 준비한다.

 

- schema dtd export

 

    File schemaFile = new File("data/db/schema.dtd");

    IDatabaseConnection connection = new DatabaseConnection(cn);

    IDataSet partialDataset = connection.createDataSet();

    FlatDtdDataSet.write(partialDataset, new FileWriter(schemaFile));

 

- DB Schema 생성

앞서 db에서 export한 schema dtd를 이용해서 다른 db에 schema를 생성할 수 없었다.

그래서 SQLNavigator등을 이용하여 테스트 서버의 DB 스키마를 생성했다.

oracle과 hsqldb간의 데이터 타입으로 다음을 수정하였다.

 

  • varchar2 -> varchar
  • Data -> DateTime
  • number -> int

    이처럼 수정한 table 생성 쿼리를 createTableName.sql 으로 저장한다.

    아래는 sql을 이용하여 database에 table을 생성하기 위한 코드이다.

     

     public void createTable(Connection con, File sqlFile) throws IOException, SQLException {
      StringBuffer query = new StringBuffer();
      BufferedReader reader = new BufferedReader(new FileReader(sqlFile));
      String line;
      while ((line = reader.readLine()) != null) {
        query.append(line);
      }
      Statement statement = con.createStatement();
      statement.execute(query.toString());
      statement.close();
     }

     

     

    2. database contents를 준비한다.

     

      - 이미 샘플로 사용할만한 내용이 database에 있는 경우 export해온다.

      - 샘플로 사용할 data를 xml 파일로 준비한다.

     

    - Data export

    database에 있는 table의 내용을 xml로 export한다.

     

        File contentFile = new File("data/db/" + tableName + ".xml");

        IDatabaseConnection connection = new DatabaseConnection(cn);

        String[] tableNames = {tableName};

        IDataSet partialDataset = connection.createDataSet(tableNames);

        FlatXmlDataSet.write(partialDataset, new FileWriter(contentFile), "euc-kr");

     

     

    - HSQL Database에 data를 import하기

    - 실제 테스트에 이용하기

    [출처] [펌] DBUnit의 사용|작성자 짱가

  • 'Programming > JAVA' 카테고리의 다른 글

    [펌]오라클 clob JDBC 예제  (0) 2008.08.08
    [펌] DbUnit  (0) 2008.08.05
    [REX] Commons-DbUtils  (0) 2008.08.05
    [Exception전략] Java의 Exception 처리 최적화  (0) 2008.08.05
    Java 관련 사이트 총망라  (0) 2008.04.28