uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

djUnitのススメ

djUnitというのは、ユニットテストをするためのEclipse のプラグインであります。機能的にすぐれていて、かつ情報もまとまっていて大変よろしいです。

* http://works.dgic.co.jp/djwiki/Viewpage.do?pid=@646A556E6974

djUnitには、JUnitを呼び出して実行するユニットテストの機能に加えて、2つの機能があります。

(1)カバレッジ
(2)相互作用テスト

(1)に関してここでは説明しませんが、djUnitカバレッジを取るのは非常に簡単で直感的です。内部的にはjcoverageを呼んでいるようです。

お勧めしたいのが(2)の相互作用テストで、これってのは、「あるメソッド呼び出しをきっかけとして、どんなメソッド呼び出し(回数・引数・返り値)が引き続いて発生するのか」をチェックするものです。基本的に「メソッド呼び出しの結果そのオブジェクトの状態がどう変化するのか」しか試験できないUnitテストよりはるかに強力です。(もちろん、ユニットテストが無意味だということではなくて、向き不向きがあって、ユニットテストでは試験できない領域があるということ。)

なお、相互作用テストは「モックを用いたテスト」とかいう、意味の分かりにくい呼び方をされることもありますが、「相互作用試験」と覚えておけば理解が早いです。実際、djUnitを使う限りモックオブジェクトなる概念の存在を意識する必要がありません。

Groovy Eclipse を組み込んでおけばちゃんとGroovyでdjUnit試験を書くこともできます。ただし、テストメソッドの戻り値の型はdefじゃなくてvoid型にしておかないといけないみたいです。

import junit.framework.TestCase
import jp.co.dgic.testing.framework.DJUnitTestCase

public class HelloTestGroovy extends DJUnitTestCase {
	void testHello() {
		Hello.main(["abc","def"] as String[])
		def arg = getArgument("java.io.PrintStream", "println", 0)
		assertEquals("Hellox", arg);
	}
}

上で例えばdef testHello()だとテストメソッドとして認識してくれません。
あと、試験結果のツリービューからテストコードのGroovyソースにジャンプできないなど、多少問題がありました。


参考: http://d.hatena.ne.jp/uehaj/20080701/1214894591