JUnit実践入門の読みどころ #junitbook

先日のエントリーではたくさんのブクマありがとうございます。Amazonでの予約も好調とのことで、うれしい限りです。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

というわけで、書影も出てきました!

思えば、JUnitのセカイというエントリーで、たくさんの「わっふる」をいただき、出版の決意を固めたわけですが、気がつくと書き始めて1年経ってました。ようやく、情報を公開できる段階まで来たわけです。

今回のエントリーでは、JUnit実践入門の発売に先立ち、本書の構成と各章の概要をお伝えします。予約を迷っている方は、本エントリーを読んだ上でご検討いただければ幸いです。なお、本書では各章が独立した構成になっているため、興味のある章から読む事ができます。

上空からの眺め

まずは最終的な章構成を紹介します。

【Part 1 JUnit入門】
第1章 JUnitチュートリアル
第2章 ユニットテスト
第3章 テスティングフレームワーク

【Part 2 第2部 JUnitの機能と拡張】
第4章 アサーション
第5章 テストランナー
第6章 テストのコンテキスト
第7章 テストフィクスチャ
第8章 パラメータ化テスト
第9章 ルール
第10章 カテゴリ化テスト

【Part 3 ユニットテストの活用と実践】
第11章 テストダブル
第12章 データベースのテスト
第13章 Androidのテスト
第14章 コードカバレッジ

【Part 4 開発プロセスの改善】
第15章 継続的テスト
第16章 テスト駆動開発
第17章 振舞駆動開発

【Part 5 演習問題】
第18章 ベーシックなテスト
第19章 アサーションとフィクスチャ
第20章 テストダブルの活用

【付録】
付録A 開発環境のセットアップ
付録B Eclipseの便利機能と設定
付録C H2 Databaseのセットアップと使い方
付録D Android開発環境のセットアップ
付録E Jenkinsの設定
付録F 本書利用環境のバージョン
巻頭付録 JUnitチートシート
巻末付録 Eclipseのショートカット

このように、本書は5部20章+付録という構成になっています。総ページ数は480ページで、目次や付録などを除外したとしても400ページほどあります。このようなボリュームとなった経緯は色々とありますが、単なるJUnitのリファレンスとしたくなかった、という想いが最大の理由です。おかげで執筆開始からほぼ1年を費やし、終盤での校正はキツイものとなったのですが...。

本書の前半は、主にJUnitの昨日について解説しています。また、初学者向けのチュートリアルユニットテストの概論も含めました。後半は、実践でユニットテストを活用するためのプラクティスを紹介しています。継続的インテグレーションテスト駆動開発など、それだけで1冊の本になる話題であるため、それぞれは導入部分のみとなってしまいますが、ユニットテストの観点で紹介します。本書を読み、ユニットテストのスキルを磨いた後、次に学ぶべきことに導いてくれるでしょう。さらに本書の最後には合計18問の実践問題を収録しました。解答例を写経するだけでも、ユニットテストスキルアップに役立てることができるはずです。

さて、そろそろ各章の概要について説明していきましょう。

Part1 JUnit入門

Part1はチュートリアルユニットテストの概論となっています。これからユニットテストを学びたいプログラマだけでなく、ユニットテストはなんとなく実施しているけど、どうももやっとしている方は、是非読んでください。体系的にユニットテストの知識を整理することで、本書の内容を深く理解できると思います。

第1章 JUnitチュートリアルユニットテストの作成から実行まで―

第1章は、WEB+DB Press Vol.69に掲載された計算機プログラムのユニットテストと同様の構成です。はじめてJUnitによるユニットテストを学習する人にも解りやすいように、ステップバイステップで学ぶことができます。

第2章 ユニットテスト―何のためにテストするのか―

第2章は、ユニットテストの目的やテスト技法について解説しています。
はじめにソフトウェアテストでのユニットテストの役割と、その目的について説明します。「ユニットテストを行うべき理由」は本書のテーマの1つです。それを知るためには、ユニットテストがどのような効果をもたらし、どんな問題を解決するかを理解すべきです。「バグをみつけるため」とか「品質を高めるため」といったことではなく、開発者としてのテストについて記述します。
また、ブラックボックステストホワイトボックステスト同値クラスや境界値などテスト技法についても簡単に解説します。そして、ユニットテストで有効なパターンをxUnit Test Pattensから紹介します。xUnit Test Pattensは、ユニットテストを実践する上ではバイブル的存在ですので、チーム内で共通のボキャブラリとしてください。

第3章 テスティングフレームワークユニットテストを支えるしくみ―

第3章では、ユニットテストをどのようにJUnitで記述し、実行するかを解説します。第1章で解説したテストコードがどのように構成されているかを確認しましょう。また、可読性の高いテストコードを書くポイントやテストの基本的なパターンなども解説しています。テストコードの書き方を知っているという段階から、簡単なテストコードを書くことができるようになります。

Part2 JUnitの機能と拡張

Part2は本書のメインパートです。JUnitの様々な機能を、必要となった背景を踏まえて解説しています。JUnit4.10で使える機能はほぼ網羅していますので、しばらくJUnitを離れてた方にとっては新鮮な情報となるでしょう。
とはいえ、実践での使用頻度には差があると思います。まずは4章のアサーションと6章のテストコンテキストで紹介するEnclosedテストランナーは即効性の高い機能ですので、オススメです。
WEB+DB Pressでの特集では、このパートからつまみ食いで紹介しました。

第4章 アサーション―値を比較検証するしくみ―

第4章はユニットテストで最も重要な、値の比較検証に関するAPIの解説です。
JUnit4ではassertThatメソッドとMatcher APIを使い、自然言語風のアサーションができるようになりました。本章ではJUnitで提供しているデフォルトのMatcherを紹介しています。しかし、その最大のメリットはカスタムMatcherを簡単に作成できることです。カスタムMatcherを作成し、より詳細なエラーメッセージをテスト失敗時に出力できるようになれば、テストのリズムは改善し、テストコードの重複を減らすことができるでしょう。

第5章 テストランナー―テスト実行方法の制御―

第5章は、JUnitのテストがどのように実行されるかを制御するテストランナーについて解説しています。
JUnit4では、テストの実行を制御するためにテストランナーを指定することができます。本章では、JUnitで提供されるテストランナーを紹介していますが、それぞれのテストランナーの詳細な利用方法はそれぞれの章で解説しています。
なお、本書ではカスタムテストランナーの作成方法については記述しませんでした。独自のビルドツールを作りたいといった要求がなければ、既存のテストランナーを使えば十分でしょう。

第6章 テストのコンテキスト―テストケースの構造化―

第6章では、肥大化するテストコードを整理する手段の1つであるEnclosedテストランナーを利用したテストケースの構造化について解説しています。
テストコードは、プロダクションコードに比べ似たテストをたくさん書く必要があり、自然とコードベースが肥大化してしまいます。しかしながら、プロダクションコードと同じようにDRY原則を用いてコードを減らしていくと、テストコードとしての可読性が低下してしまうのです。したがって、テストコードに合わせた整理が必要なのです。その答えは構造化にありました。
本章では、WEB+DB Press誌では書き切れなかった観点や豊富なサンプルで、どのように構造化し、なぜそれが効果的であるかを解説します。テストケースの構造化の恩恵を強く感じられるようになれば、テストコードが書けるという段階から、ユニットテストを書ける段階にステップアップできたと考えて良いでしょう。

第7章 テストフィクスチャ―テストデータや前提条件のセットアップ―

第7章では、テストコードで厄介なテストデータの構築について、どのように整理すべきかを解説します。
テストのセットアップを整理する方法は幾つかありますが、それぞれの方法にはメリットもデメリットもあります。テストケースに合わせた方法を的確に選択することが勝利の鍵でしょう。また、Javaでは特有の問題として、コードでデータを記述しにくいことがあげられます。このため、YAMLやGroovyなどを活用し、テストデータを構築する方法なども紹介しました。

第8章 パラメータ化テスト―テストケースとテストデータの分離―

第8章では、JUnitのパラメータ化テストについて解説します。
JUnitでは2種類の方法でパラメータ化テストを実現できますが、メソッドに引数を持つことのできるTheoriesテストランナーを利用する方法について解説しています。また、どのようなパラメータを選択すべきかや、組み合わせを考慮したテストをどのように工夫するかなどについても、テスト技法の観点も踏まえて、解説します。

第9章 ルール―テストクラスを拡張するしくみ―

第9章では、JUnitを拡張するために便利なルールについて解説します。
JUnit4ではカスタムテストランナーを作る必要はほとんどありません。それはこのルールがあるからです。ルールを使うことで、複数のテストクラスで共通した機能拡張を作ることができます。本章ではJUnitで提供されているルールとカスタムルールの作成方法を解説しています。
ルールはJUnitを活用するためには必要不可欠な機能です。「それ、ルールで共通化するわー」となれば、JUnitは十分に活用できている段階になったと考えて良いでしょう。

第10章 カテゴリ化テスト―テストケースのグループ化―

第10章では、スローテスト問題とその解決策のひとつであるカテゴリ化テストについて解説します。
カテゴリ化テストは、それほど即時性のない機能かもしれませんが、知っておけば便利な機能です。アノテーションを使い、実行するテストを制御する方法を学びましょう。

Part3 ユニットテストの活用と実践

Part2までで、JUnitのコア機能はすべて解説しています。しかしながら、JUnitにはテストに必要不可欠なモック/スタブの機能がありません。モック/スタブを解説しなければユニットテスト本としてはゴミでしょう。また、実践でユニットテストを行うには具体的なサンプルも欲しいところです。そこで、Part3では、モック/スタブと、実例としてデータベースのテストとAndroidのテストを盛り込みました。また、ユニットテストと合わせて導入されることの多いカバレッジについても記述しました。

第11章 テストダブル―テスタビリティと、モック/スタブによるテスト―

第11章はテストダブルに関して解説し、ライブラリとしてMockitoを紹介しています。
テストダブルとは、モックやスタブなど代役として利用するオブジェクトを指す用語です。本章ではユニットテストでテストしにくい部分に、どのようにテストダブルを適用するかを解説しています。実際にテストダブルを活用するには、リファクタリングが必要不可欠ですが、テスタビリティを高めるために必要なリファクタリングテクニックは本書でも解説しています。
また、モックとスタブの違いなど、はまりやすい部分も解説しています。

第12章 データベースのテスト―テストコードで外部システムを制御する―

第12章は、データベースのテストに関するポイントと、DbUnitについて解説しています。
この章では、データベースに依存する部分をどのように設計し、どのようにテスト設計をするかを解説しています。データベースのテストはデータベースの状態を管理することがすべてです。コツさえ掴めればそれほど難しくありません。
なお、本章ではDbUnitの解説はそれほど多くありません。DbUnitの機能をJUnit4で使うためにカスタムルールやカスタムMatcherを応用する方法を解説しました。

第13章 Androidのテスト―UIとロジックを分けてテストする―

第13章は、Androidアプリケーションのテストについて、ユニットテストだけでなく機能テストについても解説しました。
AndroidアプリケーションはJavaで記述するため、ここ数年で注目されている分野です。そこでMVCのアプリケーションについてどのように設計し、どのようなテストが必要かをまとめています。GUI部分についてはAndroidの開発キットに含まれるテスティングフレームワークを利用した機能テストを紹介しました。
Androidのテストについてはとても本章だけで解説することはできませんが、GUIアプリケーションを作る上で必要なノウハウとテスト方針を学ぶことができるでしょう。

第14章 カバレッジ―テスト網羅率の測定―

第14章はユニットテストを語る上では外せないカバレッジについて解説します。
カバレッジは使い方を間違えなければ心強いツールですが、使い方を間違えるととんでもないことになることは、皆さんご存じでしょう。本書では、カバレッジの目的と効果について誤った使い方がされないようにはっきりと記述しましたのでご安心ください。
本書ではEclipseから簡単に利用でき、Mavenからもカバレッジを測定しやすくなったElcEMMAEclEMMAを紹介します。

Part4 開発プロセスの改善

ユニットテスト本であれば、Part3までで十分な構成かもしれません。ページ数も300ページ程度に収まり、お手軽な入門書になったかもしれません。しかしながら、本書ではさらに一歩踏み込んでユニットテストを学べるようになっています。
Part3では具体的なユニットテストの実例や補助的に使うことができるツールを紹介しました。Part4では、開発プロセスユニットテストを組み込む方法として、継続的テスト、テスト駆動開発、そして振舞駆動開発について解説します。

第15章 継続的テスト―すばやいフィードバックを手に入れる―

十分なユニットテストが作られたプロジェクトは、それだけで良いプロジェクトかもしれません。しかし、そこに達するにはモチベーションを高め、効果を最大限にする必要もあるでしょう。そのためには継続的テストを実践するため、Jenkinsを導入するのが一番です。
第15章では、継続的テストに必要となるバージョン管理・自動化・継続インテグレーションツールについて解説します。バージョン管理については触る程度ですが、Mavenで自動化をする方法については十分な解説を用意しました。Mavenでテストまで自動化できれば、あとはJenkinsに簡単な設定を行うだけです。すぐに継続的テストの環境を手に入れることができるでしょう。

第16章 テスト駆動開発テストファーストで設計する―

前書きでも触れましたが、本書はTDD BootCampで id:t-wada さんから様々な刺激を受けた所が出発点です。したがって、テスト駆動開発(TDD)は触れないわけにはいかないでしょう。
第16章ではテスト駆動開発チュートリアルとなっています。テスト駆動開発をやるために必要な考え方やテクニックが頭に入りやすいように工夫しました。TDDBCに参加するならば、先に読んでおくと和田さんの講演への理解が深まること必至です。
本書でユニットテストの基礎力を付けテスト駆動開発の雰囲気をつかみ、もっと学びたいと思ったならば「実践テスト駆動開発」で実践的な演習を行うとベストなのではないでしょうか?

第17章 振舞駆動開発―ストーリーをテスト可能にする―

ここまで書いたならばBDDも入れてしまおうとCucumberによる受け入れテストの自動化が最後の章になります。テスト駆動開発はすぐれたプラクティスですが、どうしても「木を見て森を見ず」になりがちです。やはり、全体を俯瞰した視点でのテストは必要であり、そこから落とし込む方法は有効な開発手法です。
第17章ではCucumberを利用したアウトサイドインの開発について簡単なチュートリアルとなっています。WEB+DB Press誌での特集とほとんど同じ内容ですが、ユニットテストを学んだ上での受け入れテストとしては重要な章となります。

Part5 演習問題

さて、ここまでで350ページ近くあるのですが、本当にユニットテストが実践できるようになれるのか、不安になるでしょう。やはり手を動かしてテストコードを書きまくらなければ、なかなか実践できるようにならないのです。本文中も豊富にサンプルコードを用意しましたが、もっとたくさんサンプルコードをということで、Part5に演習問題を用意しました。
演習問題は簡単なモノから応用力が必要なモノまで18題あります。写経するだけでも力がつくと思います。

第18章 ベーシックなテスト

第18章は、後半は少し難易度が高いですが、基本的なテストコードを書くための実践問題です。テストコードを書きやすいというのは良い設計であるということでもあるのです。テストコードの書きやすい設計も合わせて習得してください。

第19章 アサーションとフィクスチャ

第19章はカスタムMatcherやフィクスチャのセットアップに工夫が必要な実践問題です。どこかで「こんな時困ったなぁ」と思うような実践問題を用意しました。

第20章 テストダブルの活用

第20章はテストダブルの実践問題です。テストしにくいコードや例外ハンドリングなど、テストダブルを利用する基本的なパターンを用意しています。
なお、最後の問題は「Hello Worldのテスト」です。「標準出力にHello Worldが出力されることをテスト」できますか?

最後に

以上、駆け足ですが、JUnit実践入門の全貌を公開してみました。詳細な目次は技評さんの公式サイトをご確認ください。

なお、おまけとしてユニットテストが捗るEclipseのショートカットと本書のチートシートが付属します。もちろん、画像データとしても公開しますので、デスクトップの壁紙にお使いください。

というわけで…買ってね!

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)