개요

JUnit, Unitils 를 이용하여 데이터베이스 관련 테스트 수행에 필요한 테이블 스키마를 자동으로 관리해주는 기능을 소개한다.

설명

이 기능은 다음의 단계로 활용할 수 있다.

  • 단위 테스트에 필요한 테이블을 생성하는 DML 스크립트 작성
  • 이 DML 스크립트 실행 여부를 설정하고, 해당 디렉토리를 설정
  • 테스트 케이스 수행 시 해당 기능 호출

환경설정

Maven Project 인 경우에는 아래와 같은 dependency 를 설정하면 된다.

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <scope>test</scope>
        </dependency>
 
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils</artifactId>
            <version>2.2</version>
            <scope>test</scope>
        </dependency>

사용법

Unitils 를 이용하면 위처럼 TestDataSource 를 생성하거나, spring+unitils 조합의 DataSource 를 생성함과 동시에 테스트에 필요한 테이블을 생성하고 초기 데이터를 입력할 수 있다.

먼저 이를 위해서는 테이블 생성 스크립트를 준비하고, 이를 적절한 폴더에 위치시켜야 하며 unitils.properties 파일을 설정해야 한다.

DBMS 연결 정보 설정

# Properties for the PropertiesDataSourceFactory
database.driverClassName=org.hsqldb.jdbcDriver
database.url=jdbc:hsqldb:hsql://localhost/sampledb
database.userName=sa
database.password=

사용하는 DBMS 의 종류, 스키마 정보 등을 설정

Unitils 는 여기서 언급된 종류의 DBMS를 지원하며 여기에 없는 DBMS 는 unitils 의 기능을 제한적으로 사용할 수 밖에 없으므로 설정하지 않는다.

# This property specifies the underlying DBMS implementation. Supported values are 'oracle', 'db2', 'mysql', 'hsqldb' and 'postgresql'.
# The value of this property defines which vendor specific implementations of DbSupport and ConstraintsDisabler are chosen.
database.dialect=hsqldb
 
# A comma-separated list of all used database schemas. The first schema name is the default one, if no schema name is
# specified in for example a dbunit data set, this default one is used.
# A schema name is case sensitive.
database.schemaNames=PUBLIC
 
# Type of transaction manager that should be created:
# simple: a simple transaction manager that wraps the datasource to control transactions
# spring: a transaction manager that delegates actions to the transaction manager that is configured in the current spring context
# auto: this will first try to load the spring transaction manager. if spring is not available, it will load the simple transaction manager
transactionManager.type=auto

데이터베이스 스키마 정보를 자동으로 update 할지를 설정

이 때 사용하는 sql 문을 저장해 둔 디렉토리 경로를 설정한다.
dbMaintainer.disableConstraints.enabled 는 단위 테스트 수행 시 테이블간의 제약 조건을 제외한다는 것으로 true 로 지정하면 이 관계를 임시적으로 끊는 등의 별도 작업없이 진행이 되므로 유용하다.

# If set to true, the DBMaintainer will be used to update the unit test database schema. This is done once for each
# test run, when creating the DataSource that provides access to the unit test database.
updateDataBaseSchema.enabled=true
 
# Comma separated list of directories and files in which the database update scripts are located. Directories in this
# list are recursively searched for files.
dbMaintainer.script.locations=src/test/resources/META-INF/persistence/maintenance/hsqldb
 
# If set to true, an implementation of org.unitils.dbmaintainer.constraints.ConstraintsDisabler will be used to disable
# the foreign key and not null constraints of the unit test database schema.
# The ConstraintsDisabler is configured using the properties specified below. The property with key 'database.dialect'
# specifies which implementation is used.
dbMaintainer.disableConstraints.enabled=true

샘플

unitils.properties

database.driverClassName=org.hsqldb.jdbcDriver
database.url=jdbc:hsqldb:hsql://localhost/sampledb
database.userName=sa
database.password=
DatabaseModule.Transactional.value.default=disabled
database.dialect=hsqldb
database.schemaNames=PUBLIC
transactionManager.type=auto
updateDataBaseSchema.enabled=true
dbMaintainer.script.locations=src/test/resources/META-INF/persistence/maintenance/hsqldb
dbMaintainer.disableConstraints.enabled=true

Test Case 작성 법

위와 같이 설정하고, 단순히 unitils 의 TestDataSource 를 선언하기만 하면 되고, 하나 이상의 테스트 메소드가 있어야 한다.

	/** 
	 * unitils.properties 에 설정 된 database 접근 정보를 기반으로 
	 * 테스트 용 DataSource 를 만든 후 자동으로 injection 해 준다.
	 * (unitils.properties 파일의 위치와 이름은 변경할 수 없다.)
	 * 
	 * @see		unitils.properties
	 * */
	@TestDataSource
	private DataSource dataSource;
 
	/**
	 * dataSource를 정상적으로 get 했는지를 확인한다.
	*/
	@Test
	public void checkTestDataSource() {
		assertNotNull("dataSource를 정상적으로 get 했는지를 확인한다.", dataSource);
	}

Test Case 실행 결과

아래와 같은 작업이 실행 된 로그를 확인할 수 있다.

정보: Creating data source. Driver: org.hsqldb.jdbcDriver, url: jdbc:hsqldb:hsql://localhost/sampledb, user: sa, password: <not shown>
2009. 4. 23 오후 4:04:36 org.unitils.database.DatabaseModule updateDatabase
정보: Checking if database has to be updated.
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.version.impl.DefaultExecutedScriptInfoSource checkExecutedScriptsTable
경고: Executed scripts table "PUBLIC"."DBMAINTAIN_SCRIPTS" doesn't exist yet or is invalid. A new one is created automatically.
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.structure.impl.DefaultConstraintsDisabler disableConstraints
정보: Disabling contraints in database schema PUBLIC
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.clean.impl.DefaultDBClearer clearSchemas
정보: Clearing (dropping) database schema PUBLIC
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.DBMaintainer updateDatabase
정보: Database update scripts have been found and will be executed on the database.
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.clean.impl.DefaultDBCleaner cleanSchemas
정보: Cleaning database schema PUBLIC
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.DBMaintainer executeScripts
정보: Executing script script/001_initial.sql
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.structure.impl.DefaultConstraintsDisabler disableConstraints
정보: Disabling contraints in database schema PUBLIC
2009. 4. 23 오후 4:04:36 org.unitils.dbmaintainer.structure.impl.DefaultSequenceUpdater updateSequences
정보: Updating sequences and identity columns in database schema PUBLIC

참고자료

 
egovframework/dev/tst/schema_관리.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki