2009年12月23日水曜日

Grailsのtest-appで、コンソールにstacktraceを出す

Grailsのバージョンは1.2.0.RC2

Grailsには、組み込みのテスト実行環境がついています。
Grailsをインストールして、Grailsのプロジェクトを作成して、
コンソールで"test-app"と打ち込むだけでテストが実行されます。

んですが、このテスト、実行してエラーがでても、コンソールにスタックトレースがでないんですよね。

testSample...FAILED

つー、そっけない一行がでるだけ。なんでやねん。

というわけで、Grailsのテストイベントを取ってスタックトレースを出してみます。

1.スタックトレースを出力するためのイベントリスナを作成する。
以下のようなスタックトレース出力クラスを作ります
package testsupport
import grails.build.GrailsBuildListener;
public class StackTraceDumper implements GrailsBuildListener {
void receiveGrailsBuildEvent(String name, Object[] args) {
if (name == 'TestFailure') {
this.doTestFailure(*args)
}
}
protected doTestFailure(String name, failure, boolean isError) {
failure?.printStackTrace()
}
}

2.上記イベントリスナをコンパイル
なんか、イベントリスナだけは前もってコンパイルしとかないと失敗しました。
[grails-project]/src/groovyの下に入れて"grails compile"を実行してもいいし、
jarにして[grails-project]/libにいれてもいいと思います。

3._Events.groovyスクリプトの記述
上記イベントリスナを設定します。
[grails-project]/scripts/_Events.groovyに以下を記述
import testsupport.StackTraceDumper
eventListener.addGrailsBuildListener(new StackTraceDumper())

4.test-appコマンドを、-echoErrオプション付きで実行する
Grails1.2.0から、echoErrオプションで標準エラーを出力できるようになりました。
"test-app -echoErr"と激しく打ち込み。
テストクラスを限定したり、ユニットテストだけ実行したりできます
"test-app [TEST CLASS] -echoErr"
"test-app unit: -echoErr"

で、スタックトレースがでるはず…


ちなみに、spockプラグインを使うと、powerassertsっぽいかっこいいスタックトレースになります。
こんな↓


あ、[grails-project]/scripts/_Events.groovyの仕様とかよく分かってないんで、突っ込みどころあったら突っ込んでくらはい

0 件のコメント:

コメントを投稿