JUnit4とTestNG,ついでにgroovyでも試してみた
なんだかんだで,JUnit3の記述性の低さには辟易しているので,ちょっといろいろ試してみたよ(どうせヒマだし).えー,試してみたのはJUnit4とTestNG.どちらもJava言語の記述性を越える事はできないので,ついでにgroovyも加えてみたよ.
今んところは,以下の理由でJUnit4に軍配をあげよう.
- JUnit4(正しくはJUnit4.4)
- アノテーションとassertThatが秀逸.
- JUnit4.4にバンドルしてあるhamcrestはcoreのみだが,フルセットを準備すれば尚よさげ.
- なんだかんだで,unit testの王道だし.
- TestNG
- JUnit4が出た今となっては,時期を逸した感がある.
- assertThatが無いのは減点材料.
- フィクスチャの準備はJUnitより便利そうではある(ちゃんと評価してない).
- 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がごっちゃになる.
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で単体テストなんて常識だろ」って頭ごなしに「テストコード書けー」って言ったって書けないだろ.フツー.
使い方覚えれば便利なんだけど,なかなかアーリーアダプタの遊び道具の域を脱する事ができずにいるなぁ.>テスティング・フレームワーク