2009年8月5日水曜日

Grailsのテスト・ツール

Grailsのようにアプリケーションを作るのが, 簡単, というか仕様を書けばいいだけ, になってくると, 相対的にテストの比重がどんどん大きくなってくる. となると考えるのが, テストをどうやって楽にするか, だ.


Grailsのテスト・ツール, 特にテスト・データ管理のプラグインを簡単にまとめておく.


DBUnit Plugin


Javaのデータベース用テスト・ツール, DBUnit をそのままプラグイン化したもの.


http://code.google.com/p/dbunit-plugin/ (コード)


http://grails.org/plugin/dbunit


基本的には, DBUnitそのものだから, XMLでデータセットを <PROJECT>/test/datasets に定義して



<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person id="1" name="Pessoa 1" email="p1@email.com" version="1" />
<person id="2" name="Pessoa 2" email="p2@email.com" version="1" />
<person id="3" name="Pessoa 3" email="p3@email.com" version="1" />
<person id="4" name="Pessoa 4" email="p4@email.com" version="1" />
<person id="5" name="Pessoa 5" email="p5@email.com" version="1" />
</dataset>

テスト・コードの中でそれを呼び出すことができる.



static datasets = ['person']

GrailsでXMLかよ, というツッコミは当然だろう. そこで,


Fixtures Plugin


簡単にいえば, データセットをDSLで記述できるようにしたもの.


http://www.grails.org/plugin/fixtures


例えば, 次のようにデータセットを定義して (<PROJECT>/fixtures/foo.groovy),



fixture {
guillaume(Author) {
name = "Guillaume Laforge"
}
dierk(Author) {
name = "Dierk Koenig"
}
gina(Book) {
title = "Groovy In Action"
authors = [guillaume, dierk]
}
}

あるいは



fixture {
guillaume(Author, name: "Guillaume Laforge")
dierk(Author, name: "Dierk Koenig")
gina(Book, title: "Groovy In Action", authors: [guillaume, dierk])
}

テスト・コードの中で, それを呼び出すことができる.



def fixtureLoader
fixtureLoader.load("gina")

Build Test Data Plugin


前の二つが, データセットをすべて, 自分の責任で用意するタイプだった (だから手間はそれなりに掛かるけど, 詳細まで指定できる) のに較べて, このプラグインはドメインクラス定義の中で指定したconstraints に合わせて「適当に」データセットを作ってくれる.


http://www.grails.org/plugin/build-test-data


http://bitbucket.org/tednaleid/grails-test-data/wiki/Home (ドキュメント)


使い方はきわめて簡単で



def a = Author.build(firstName: "Daniel")

これだけ. 指定したプロパティ以外は「適当に」(関連も含めて) 作ってくれる.


ちょっとしたテストにはこっちの方が便利だろう.


この先


とは言え, テスト用のデータセット管理/生成ツールをもう少し何とかしたいという気もするし, Grailsならば何とかなるだろうという気もする.


アイデアはあるけど, 実装している時間が無い.