TODO: assertEqualsでなくassertThatを使うべきケースの理解

JavaユニットテストツールのJUnithttp://junit.org/)で、assertThatメソッドが使えるようになったのは、バージョン4.4からです。

それまでは「xの値が3である」というテストを次のように書いていましたが、

assertEquals(3, x);

こう書けるようになりました。

assertThat(x, is(3));

先ほどTwitterを見ていたら、assertThatの話が出ていました。

それで、以前assertThatを見知って使おうとした時、こんな会話をしたのを思い出しました。

↓↓↓↓↓

(assertThatを使ったテストコードを先輩に見てもらいながら)

「assertThat? ヲイ。」

あ、それはですね、assertThatを使うと、テストを英語っぽく書けてうれしいらしいですよ。

「…assertEquals使っとけ」

えぇっ!? なんでですか、、、

「お前それ本当にうれしいの? 英語っぽく書けて? マジデ?」

う、、、(自分は英語が母語ではないので、それほどうれしいわけでもなかった)。

でも、assertThatは、引数のどっちが期待値でどっちが評価値かが、わかりやすいです。

「assertEquals使ってりゃ、どっちがどっちか迷う必要すらねーだろ」

うぅ、、、

「新たに何かを覚えるコストのこととか、考えてんのか?」

スミマセンデシタ……

(※言うまでもなく丁寧語の方が自分です)

上のような指摘をもらった背景には、事情がありました。当時書いていたテストはassertEqualsで十分だったとか、そもそも自分がテストを書くこと自体に慣れていなかったとか、assertThatを十分理解していないなら使わない方がマシであるとか。

しかし、当時の自分は、「余計な部分で頭を使わないようにするプログラマの考え方とはこういうものか」と妙に感心して、それ以来、深く考えずにAssertEquals一択でやってきました。発言の背景にあった上のような限定的な事情も、いつしか忘れてしまいました。

が、最近、上で苦し紛れに自分が挙げたほかにも、assertThatには利点があることを聞きました。

assertThatにはいくつもの利点があるとされている。利便性の主張をまとめると次のようになる。

  • 従来のアサーションメソッドを使うよりもassertThatを使った記述の方が可読性が高く、何を比較するかがよくわかる
  • 従来のアサーションメソッドを使うよりもフェイラーメッセージの出力が理解しやすい
  • 比較処理の部分を他の比較処理と組み合わせ、否定、コレクションのマッピングなどとの組み合わせなど、さまざまな組み合わせを指定できる
  • 比較処理を自ら実装して使うことができる
http://journal.mycom.co.jp/articles/2007/07/20/junit1/index.html

鵜呑みにした後、ろくに検証していませんでしたが、理解した方がよさそうです。

ちなみに、検索したらこういうTogetterがあり、参考になるかもと期待したのですが、

JUnitJavaで書くこと自体が古臭い」というエクストリームな発言で〆られており、未熟者にはついていけない世界でした。精進します。とりあえずJavaで書きたいです。