TestNGとJUnit4

TestNGはJUnit4と一緒でしょ、と思っていたけどそうではなかった話。
TestNGが出てきた当初はアノテーションとか使ってアドバンテージがあったように見えたけど、JUnit4が出てからはこれでTestNGいらなくなるんだなーと遠くから思ってた。が、最近TestNGを使ってテストを書く機会があったのでようやくそれが間違いだったことに気がついた。

まぁ、すべてここ↓に書いてあるので、TestNGに対して私と同じ偏見を持っている方は今からでも読んでみるといいかも。
http://www.ibm.com/developerworks/jp/java/library/j-cq08296/

TestNGとJUnit4は一見アノテーションを使ってテストを書くというところでは同じに見えるかもしれない。が、重要な違いはTestNGは各テストメソッド間に依存関係を定義することができるということ。逆にJUnitの場合は各テストはそれぞれ完全に独立しているということ。

確かに単体テストって観点からすれば、JUnitの様にそれぞれ独立していた方がいいのかもしれないけど、そうじゃないときも結構とある。例えば、あるデータを取得した後じゃないとこれからやりたテストが実行できないとかよくある話。また、そういうある処理に依存したテストが大量にあるとテストに時間がかかってしまったりもする。TestNGだとこういう処理の依存性を定義でき、テストの状態を保存しておくこともできる(JUnitと違ってインスタンス変数にデータを保存しておくことができるので、あるテストでそこにデータを保存しておくと別のテストからもそのデータを見ることができる。あ、ここもおっきな違いだね)
同じと思っていたTestNGだが、実はこういうJUnitには無いを持ってもいる。JUnitで冗長になっていたテストをもっと簡潔にかけたりするわけだ。
ただ、単体テスト用途にも使えるけどむしろ結合テストっぽいところが向いているので注意が必要。単体テスト用途に使ってるつもりでもついついテストが依存しまくってしまうという落とし穴が。なにも考えずに書いてるとついつい普通にプログラム組んでたりするんだよね(これは普段からJUnitでもテストを書いていないせいという話もあって普通はそんなことにならないのかもしれないが)。その点JUnitの方は縛りがあるので純粋な単体テストが綺麗にかける。

ってわけで、上の記事に書いてあるのでそっちを読んでもらったらいいんですが、なんか、棚ぼた、じゃなくて目から鱗じゃなくて、なんか、久しぶりに、あぁ、そうなんだーーと思ったので書いてみた。

どっちも上手く使い分ければいいじゃんって話だけど、まぁ、できれば同じものつかってどっちもやりたいよねと思うんだけどなんか上手い方法は無いもんかね。

とにかく、一度TestNGやってみるといいかも。常識?