Groovyでユニットテストを書いてみる(DbUnit)⑧

Groovyでユニットテストを書いてみます。
今回は、DbUnitを使用してみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "DbUnitを使ってみる(参照)"() {

		// DbUnitのJARファイルは、下記からダウンロードしました。
		// http://sourceforge.net/projects/dbunit/files/dbunit/

		// SLF4Jも必要です。
		// slf4j-nop-X.X.X.jar、slf4j-api-X.X.X.jar
		// http://www.slf4j.org/download.html

		// Apache POIも必要です。
		// https://poi.apache.org/download.html

		setup:	// 前準備

		// H2データベースを起動
		def server = org.h2.tools.Server.createTcpServer().start()

		// DB接続
		def sql = Sql.newInstance( 'jdbc:h2:tcp://localhost/~/test', 'sa', '', 'org.h2.Driver' )

		// テーブル作成
		try { sql.execute( "CREATE TABLE TEST ( NAME varchar(50), TEXT varchar(100) )" ) } catch( Throwable t ) {} // 既にテーブルがある場合のエラーは無視

		// 初期データ投入
		IDataSet xls = new XlsDataSet( new File( './TEST.xls' ) ) // .xlsx形式だと動かない・・・
		DatabaseConnection connection = new DatabaseConnection( sql.getConnection() )
		DatabaseOperation.CLEAN_INSERT.execute( connection, xls )

		when: // SELECT実行
		def rows = sql.rows( "select * from TEST" )

		then: // 実行結果を検証
		rows.size() == 1			// 取得行は1件であるか
		rows[ 0 ].NAME == 'test'	// NAMEカラムの値が'test'であるか
		rows[ 0 ].TEXT == 'text'	// TEXTカラムの値が'text'であるか

		cleanup: // 後処理
		sql.close()
		server.stop()
	}

	@Test
	def "DbUnitを使ってみる(更新)"() {

		setup:	// 前準備

		// H2データベースを起動
		def server = org.h2.tools.Server.createTcpServer().start()

		// DB接続
		def sql = Sql.newInstance( 'jdbc:h2:tcp://localhost/~/test', 'sa', '', 'org.h2.Driver' )

		// テーブル作成
		try { sql.execute( "CREATE TABLE TEST ( NAME varchar(50), TEXT varchar(100) )" ) } catch( Throwable t ) {} // 既にテーブルがある場合のエラーは無視

		// 初期化(全レコード削除)
		IDataSet xls = new XlsDataSet( new File( './TEST.xls' ) ) // .xlsx形式だと動かない・・・
		DatabaseConnection connection = new DatabaseConnection( sql.getConnection() )
		DatabaseOperation.DELETE_ALL.execute( connection, xls )

		when: // INSERT実行
		sql.execute( "INSERT INTO TEST( NAME, TEXT ) values ( 'test', 'text' )" )

		then: // 期待値Excelと比較
		IDataSet actual = connection.createDataSet()
		Assertion.assertEquals( xls.getTable( 'TEST' ), actual.getTable( 'TEST' ) )	// テーブルと期待値Excelが一致するか

		cleanup:// 後処理
		sql.close()
		server.stop()
	}
}


DbUnitで、データベース操作のユニットテストをしてみました。
参照系は、Excelファイルから初期データを投入しておき、SELECTの取得結果が想定どおりであるかを確認。
更新系は、INSERTを実行し、INSERT結果が期待値Excelファイルと一致するかを確認します。


初期データおよび期待値のExcelファイルは下記の形式です。
シート名がテーブル名、1行目がカラム名、2行目移行がデータです。