Home > アーカイブ > 2012-11

2012-11

PHPer が「JUnit実践入門」を読んだ

  • 2012-11-20 (火)
  • book
この記事の所要時間: 62

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)」を献本して頂いたので読んでみました。

普段は PHPUnit でテストを書いているので、その本家とも言える JUnit の本は興味津津でした。

実は、今でこそ PHP 三昧の日々ですが、数年前(JDK1.3 とか 1.4 の時代ですが)は Java で開発していたこともあったので、いまどきの Java、JUnit がどうなっているか知りたくもあり、興味深く読み進めることができました。

読んでみて感じた点を挙げてみます。

1. 圧倒的なボリューム

まず目次をざっと見た時に感じたのがカバーしている範囲の広さです。正直よく一冊に収まってるなあと:D

JUnit の解説からはじまり、JUnit を使ったテストの書き方、ソフトウェアテスト・テスト技法、ユニットテストのパターン、そして JUnit のより発展的な利用方法とつづきます。

さらにより実践的な内容として、モックやスタブ、スパイ(Mockito)、データベース(DbUnit)そしてAndroidアプリのテストの書き方があります。これで十分 JUnit の本となる気がしますが、まだ終わりません。

この後、継続的テストを行うために、Mavenや 各種 VCS 連携、Jenkinsと来ます。

もうお腹いっぱいと思ったところで、とどめにテスト駆動開発、振舞駆動開発が来て、さらに18問にも及ぶ演習問題と開発環境のセットアップやEclipseの便利機能が含まれる付録で締めとなります。

450P でこれだけの内容がギュッと詰まってます。

さらに本書でカバーできない、より深い内容については、ちゃんと参考文献が紹介されています。

いや、ほんとすごい。

2. Eclipse + JUnit 環境構築の解説が嬉しい

日頃、Java を書いてない人間からするとまず面倒なのが環境構築。

本書では JDK から、Eclipse、JUnit、そして QuickJUnit などのインストール方法が付録にまとめられています。たまにしか Java を触らないので、こういうステップバイステップで環境が構築できる解説は嬉しいですね。

迷うこともなく簡単に環境構築ができました。

本書には書いてませんが、Vim 派の人は「Vrapper」を入れると幸せになります。

3. 演習内容が多い

テストの概念や用語の解説といった基礎的な解説はもちろん書かれていますが、それは必要最小限に抑えられており、それよりも実際にテストを書きながら学んでいくということに重点がおかれているように感じました。

普段テストを書いているので、概念的なことはおさらいとしてざっと読んで、実践的な箇所を試して学習していくという流れで読んでいきました。

やっぱりテストは書いて習得していくものだと思うので、これは大事です。

4. いまどきの JUnit

私が知っている JUnit が古いということもあるかもしれませんが、最新の JUnit4 の記法を用いて解説が書かれているので、いまどきのテストの書き方を知ることができました。

これまで大きく変わっていると感じたのは以下です。もしかすると PHPUnit もいずれはこういった変更が行われるかもしれませんね。

4.1. TestCase クラスを継承しない

テストクラスでは、TestCase クラス(PHPUnit なら PHPUnit_Framework_TestCase クラス)を継承するのが当たり前だと思っていましたが、本書のサンプルではどのクラスも継承しておらず、POJO となっていました。

これによりどんなクラスでもテストクラスとして実行することが可能になったので、より柔軟にテストが書けますね。

4.2. assertThat によるアサーション

これまでアサーションメソッドといえば、assertEquals や assertTrue などでしたが、本書では、汎用的に利用できるアサーションメソッドとして assertThat が使われていました。

変わったと感じたのは引数の順番です。

従来(PHPUnit)のアサーションメソッドでは下記のように「期待値」「実際の値」という順番で引数をセットしていました。

$this->assertEquals($expected, $actual);

これが assertThat では一見すると「実際の値」「期待値」という逆の順番になります。(さらに期待値はMatcherオブジェクトを指定します。)

assertThat(actual, is(expected));

これは「assert that actual is expected」という英文となるように、だそうです。

4.3. @Rule アノテーション

JUnit4.7 から追加された @Rule アノテーションについても解説されています。各テストの前処理や後処理などを共通処理として定義できる機構です。

例えば JUnit で提供されている TemporaryFolder を使うと下記のような記載をするだけで、テストメソッド内で利用できる一時フォルダが作成され、テストが終了すると自動でフォルダが削除されます。

これもいずれ PHPUnit に欲しい機能です。

@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder();

5. 18問の演習問題

実際にテストを書いて学べる18問の演習問題が付録に付いています。

この演習問題には、問題だけではなく、テスト対象クラスの設計方法やテストケース、そして実際のソースコード、最後に解説と丁寧に書かれています。

それぞれの問題をこなしていくと JUnitや周辺ライブラリを1つづつ試せるような構成になっているのが心憎いです:D

実際に JUnit で書いてみるのはもちろんですし、さらにこの問題を PHPUnit で書くならどうするか、というような発展的な使い方もできそうです。(そんな勉強会をやっても良いかも)

何問かやってみたのですが、最後の「Hello World のテスト」は下記のように書くと簡潔に書ける気がしました。

ユニットテスト書くなら一読の価値あり

本書は JUnit を題材にした本なので、Java を書く人がメインターゲットだと思うのですが、テストを書くという行為や考え方はどの言語でも共通なので参考になる人は多いと思います。

ここまでテストについてまとまっている日本語の本は少なくとも PHP には無い(あったら教えて下さいm(_ _)m)ので、普段 Java を書かない人も本書でいまどきの Java や JUnit を試してみてはどうでしょう。

あ、Java な人は必読で:D

  • コメント (Close): 0
  • トラックバック (Close): 0

Home > アーカイブ > 2012-11

検索
フィード
メタ情報

Return to page top