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行目移行がデータです。