2009年8月11日火曜日

Autobase

Autobase pluginLiquiBaseのGrails wrapperで, LiquiBaseはRuby on RailsのMigrationぽいDBリファクタリング・ツールなんだけど, Autobaseが動かないんだな.


プロジェクトではこれはあるといいと思って評価したいんだけど, うちだけではなく, (作者の環境以外は:-) どこでも動かないらしい. 作者は忙しくて手を付けられないみたい.


かといって, XMLの塊であるLiquibaseを直接使うつもりはない (きっぱり). XMLを扱うつもりでよければ, Grailsで直接使うためのプラグイン (LiquiBase Database Refactoring for Grails) もあるけど.


# scriptsからは, srcもgrails-app/utilsも見えないのだよな... ところがたまに見えることがある...



2009年8月10日月曜日

Hudsonを動かしてみたよ

https://hudson.dev.java.net/ に行って, 最新版をダウンロードする. MacOSXならば, ダウンロードした hudson.war をダブル・クリックするだけ. http://localhost:8080/ をブラウズすると, すでにHudsonは立ち上がっている.


「Hudsonの管理」メニューから「プラグインの管理」に行って, 例えばGrails, Groovy, Mercurialの各プラグインをインストールしてみる.


「Hudsonの管理」メニューから「システムの設定」に行って, Grails Builderに「追加」して, 適当な名前 (grails-1.1.1) と GRAILS_HOME 環境変数と同じ値を設定する. で, 保存. 「Hudsonの管理」メニューから「設定の再読み込み」をした方がいいみたい.


ダッシュボードに戻り, 適当に名前を付けてジョブをひとつ作る. ソースコード管理システムはMercurialなので, そのプロジェクトのローカルなパスをRepository URLに指定する.


「ビルド手順の追加」して, Build with Grails する. Grails Iinstallation はさっき Grails BUilder で指定したやつ (grails-1.1.1) を, Targetsには "test-app --non-interactive" とか書いてみる.


「ビルド実行」すると...


Compilation error: srcdir "/Users/masaki/.hudson/jobs/AutobaseExample/workspace/src/groovy" does not exist!


とか言ってfailしているよ!


buildに先だって, hgのリポジトリからcloneでソースコードを取り出しているのだが, その時に空のディレクトリは取り出されないのが原因のようだ...


これはmercurialがそういうものだから仕方ない. で, 次のようなgantスクリプトを作って, <basedir>/scriptsに置き, 手で % grails unemptyDirectories することにする. grailsの方を弄ってもいいのだったら, <grails>/scriptsに置いて, scripts/_GrailsCreateProject.groovyのcreateAppターゲットの最後のeventの前に呼ぶようにしてもいいかも知れない.


% cat scripts/unemptyDirectories.groovy



target ('default': "Makes a hidden file ('...') under the empty directories for marcurial+hudson") {
new File("${basedir}").eachDirRecurse {
if (it.list().length == 0) ant.touch file:"${it}/..."
}}

もっとも例えばNetBeansからaddすると'.'ファイルは無視されてしまうから, hgで直接addする必要があるのだが...


というわけで, 今の自分の環境とは合わないけど, Hudson自身はよさそう.


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ならば何とかなるだろうという気もする.


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