JUnit4とTestNG,ついでにgroovyでも試してみた

なんだかんだで,JUnit3の記述性の低さには辟易しているので,ちょっといろいろ試してみたよ(どうせヒマだし).えー,試してみたのはJUnit4とTestNG.どちらもJava言語の記述性を越える事はできないので,ついでにgroovyも加えてみたよ.


今んところは,以下の理由でJUnit4に軍配をあげよう.

  1. JUnit4(正しくはJUnit4.4)
    • アノテーションとassertThatが秀逸.
    • JUnit4.4にバンドルしてあるhamcrestはcoreのみだが,フルセットを準備すれば尚よさげ.
    • なんだかんだで,unit testの王道だし.
  2. TestNG
    • JUnit4が出た今となっては,時期を逸した感がある.
    • assertThatが無いのは減点材料.
    • フィクスチャの準備はJUnitより便利そうではある(ちゃんと評価してない).
  3. groovy
    • JUnit4 with Groovyを実現するには,groovy 1.1系じゃないとダメ.
    • 1.0系でも使えるGroovyTestCaseはJUnit3並なので,まだJUnit4 with Javaのほうがマシ.

せっかく作ったんで,コードを残しておく.
IDEAの場合,JUnit(3/4)/TestNG/Groovyのすべてをサポートしているので,どれもそれなりにIDE上で操作を完結できるんで,特に困る事はなかった.
#他所のIDE?そんなの知らんヨ.

JUnit4.4

public class JUnit_ArrayListTest {
   private List list;

   @Before public void セットアップ() {
       list = new ArrayList();
   }

   @Test public void isEmptyが真である() {
       assertThat(list.isEmpty(), is(true));
   }

   @Test public void サイズがゼロである() {
       assertThat(list.size(), is(0));
   }

   @Test(expected = IndexOutOfBoundsException.class)
   public void 空っぽなので要素にアクセスすると例外が発生する() {
       list.get(0);
   }
}

@Testアノテーションのおかげでテストメソッドは完全に日本語化できるし,assertThatとMatcherの組み合わせは文芸的で読みやすい(?).ただ,Matcherの組み合わせが,多様過ぎるので,はたして使いこなせるのだろうか?という疑念は残る.
assertThatの良い点は,expectedとactualが一目瞭然なこと.以前のassertXXXは,左辺がexpected,右辺がactualなんだけど,意識しないとexpectedとactualがごっちゃになる.


ちなみに,IDEAからの実行結果はこんな感じ.JUnit3とくらべ「test...」が無いだけマシって程度.

TestNG

今回試した程度だと,JUnitとほとんど変わらない.んー,だからJUnit4が出るまでの繋ぎととられても致し方ないかな.

public class TestNG_ArrayListTest {
   private List list;

   @BeforeTest public void セットアップ() {
       list = new ArrayList();
   }

   @Test public void isEmptyが真である() {
       assertTrue(list.isEmpty());
   }

   @Test public void サイズがゼロである() {
       assertEquals(list.size(), 0);
   }

   @Test(expectedExceptions = IndexOutOfBoundsException.class)
   public void 空っぽなので要素にアクセスすると例外が発生する() {
       list.get(0);
   }
}

アノテーションはJUnit4よりちょっと豊富なんだけど,その程度の差ならば,王道のJUnitを選ぶよなぁ.それとassertThatがないのは残念だったけど,一番許せなかったのは,assertXXXのexpectedとactualがJUnitと逆だったこと.
お前ぇなぁー.後続なんだから,そうゆう部分は先駆者を尊重しろってば.
JUnitのAssert
TestNGのAssert(一応,AssertJUnitってのがある)


一応,IDEAの実行結果を載っけとく(見た目はJUnitとほとんど変わんないけど).

groovy

これは戯れでやってみただけ.groovy 1.0ではアノテーションやらstatic importが使えないって知らなくて,JUnit4相当のことはやれなかった.1.1b3にすりゃできるんだけど,IDEA(JetGroovy)のテストランナーが対応してないんで,試すの止めた.


一応コード載っけるけど,面白みがまったくない.

class Groovy_ArrayListTest extends GroovyTestCase {
 private list;

 void setUp() {
   list = new ArrayList();
 }

 void testIsEmptyが真である() {
   assertTrue list.empty
 }

 void testサイズがゼロである() {
   assertEquals 0, list.size
 }

 void test空っぽなので要素にアクセスすると例外が発生する() {
   try {
     list.get(0);
     fail();
   } catch (e) {
     assertEquals IndexOutOfBoundsException, e.class
   }
 }
}

ちょいとDSL的な用途を期待してるんだけど,JUnit4ですら普及すんのかあやしいのに,groovyでテストなんて夢のまた夢な気もする.:-P


せっかく撮ったから,これも.


うーん,なんだかんだでテストコードって気ぃ遣うんだよね.それをだ「今やJUnit単体テストなんて常識だろ」って頭ごなしに「テストコード書けー」って言ったって書けないだろ.フツー.
使い方覚えれば便利なんだけど,なかなかアーリーアダプタの遊び道具の域を脱する事ができずにいるなぁ.>テスティング・フレームワーク