ちょっと、迷って困ってた。
JUnitのテストを書いてて、
- とある整数型リストは、1,2,3,4 の四つの要素を持っているはず。
- リストの要素の順番はどうでもいいが、要素の中身はこうであるはず。
ってのを、JUnitのassertで検証したい、となった時、書き方としては、
- assertTrue(actItem.getRolled().containsAll(Arrays.asList(1, 2, 3, 4)));
- assertThat(actItem.getRolled().containsAll(Arrays.asList(1, 2, 3, 4)), is(true));
- assertThat(actItem.getRolled().toArray(new Integer[0])
, IsArrayContainingInAnyOrder.arrayContainingInAnyOrder(1, 2, 3, 4));
と、こんな風に、色々とあるんだけど、どれが判りやすいんだろうか、正しいんだろうか。
考えるネタとして、逆に、このassert文はこれをテストしたいんだな、と、assert文から読み下してみたらどうなるのかなぁと思って、やってみたの。
- 1234の値で構成されたリストを引数としたContainsAllメソッドの実行結果が、trueであることを確かめたい。
- 1234の値で構成されたリストを引数としたContainsAllメソッドの実行結果が、戻り値trueであることを確かめたい。
- リストの構成要素を整数配列型にキャストした結果が、並び順関係なく1234の要素で構成されていることを確かめたい。
こうなった。なので、この場合、確かめたいことをassertしているのは、3ってことになる。
だって、テストしたいのはContailsAllメソッドじゃないし。リストの要素だし。
といいつつも、私は個人的な好みでシンプルな1が好き。何をassertしたいのか、コメントしとけば良いもん。<我儘w
でも、個人のお気楽開発ならこんな風に好きにして良いけど、チームでの開発であるなら、こういうの、きっと、どれにしときましょ?とすり合わせた方がいいね。
assertの書き方は、チーム内なり、プロジェクト内なりで、ある程度基準を作っておくと、ここで何を確認したかったのか、仕様の要点が何なのかが判りやすくなって、後から来た人にも、作って忘れちゃってる人にも、親切なテストコードになると思うの。よくある「好きにしていいよ」が一番よろしくないオチ。後で混乱したり、なんでこうなってるの?、これはなにをテストしてるの?が起きちゃうこと請け合い、つか、経験則w