uehaj's blog

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

GrUnitなるものありき

GrUnitというものができたようです。これは何かというと、ざっとみたかぎり、「Groovyでもっと簡単にGroovy流儀でテストを書けるようにする」というもののようです。今のところ、これはGroovy++に付属する機能であるようです*1

具体的には、

  • TestCase,GroovyTestCaseから継承せずに、スクリプトとしてテストコードを書く
  • 「インラインテスト」。@GrUnitアノテーションの引数としてテストコードを書き、テスト対象クラスとテストコードを1ファイルに含める。

というものののようです。

前者について、たしかに、従来のGroovyでテストを書く場合、TestCaseもしくはGroovyTestCaseをextendsしたクラスを定義する必要がありました。わたしはそのことに今の今まで何の疑問も持っていませんでしたが、Groovyではスクリプトの場合、クラス定義はいらないのに、テストコードにクラス定義が必須なのは、対称性に欠けるものでした。

なお、そのスクリプトがテストである事を指定するには、拡張子を.grunitにするそうです。GrUnitの機能はAST変換として実装されていて、拡張子に応じて適用されるAST変換を選択するというのは、たしかGEP 5で提案されていた機能ですね。いつの間にか実装された? Groovy 1.8の機能かもしれません。

また、GrUnitには「accumlated Test」というのがあって、テストメソッドの事前の準備コード(JUnitでのsetUp相当)をスクリプトの流れの中に書けるようにするというものです。
具体的には、例えば,

vv
checkHoge {
  ww
}
checkFuga {
  xx
}
yy

のようなGrUnitのテストスクリプト(拡張子.grunit)は、以下のようにvvがテストメソッドの冒頭にコピーされたものに変換されてテストが実行されます。

class **Test extends **TestCase {
  void testHoge() {
     vv
     ww
  }
  void testFuga() {
     vv
     xx

  }
  void test$main() {
     vv
     yy
  }
}

んー。どんなものかな。微妙かな?

後者の「インラインテスト」も、これまた微妙な気がするなー。全クラスにmainを書いてテストするような時代に戻るような?でも大変面白い。あといつの間にか、アノテーションの引数にクロージャがとれるようになってるな。Groovy 1.8の新機能かな? これはこれでインパクトがありそうな。

*1:GrUnit自体がGroovy++で書かれているようです。