ユニットテストを学ぶための推薦図書

このトピックではユニットテストの学習に有用な書籍をいくつかのカテゴリごとに紹介していきます。 1. 基礎を学ぶ まず最初にユニットテストの基本的なトピックを扱う書籍を紹介します。 「JUnit実践入門 …

このトピックではユニットテストの学習に有用な書籍をいくつかのカテゴリごとに紹介していきます。

1. 基礎を学ぶ

まず最初にユニットテストの基本的なトピックを扱う書籍を紹介します。

「JUnit実践入門 ~体系的に学ぶユニットテストの技法」(渡辺 修司, 技術評論社, 2012年)

【初心者~中級者向け】
JUnitの解説を中心に、ユニットテストに関わる様々なトピックを体系的に解説しています。

扱う話題は、xUnit、テストダブルやシミュレータの活用、継続的インテグレーションによる運用、ユニットテストを使う方法論など、実にさまざまです。ユニットテストについて網羅的に知見を深められますので、JUnitやJavaを使用していない方でもお勧めできる一冊です。

「現場で使えるソフトウェアテスト Java編 」(飯山 教史 (著, 監修), 町田 欣史 他 (著), 翔泳社, 2008)

【初心者~中級者向け】

本書はJavaを対象としたユニットテストの解説書です。

前述の書籍は主に開発者テストと呼ばれる、開発支援のための開発中のユニットテストを主に扱っていますが、本書は品質保証やテスト工程での活用にも触れる内容となっています。また、レビューや静的解析といった静的検証について解説している点でも特徴があります。

静的なユニットテストや、テスト工程としてのユニットテストに興味ある方にお勧めできます。

「レガシーコード改善ガイド」(マイケル・C・フェザーズ(著), ウルシステムズ株式会社(監修), 平澤 章 他(翻訳), 翔泳社, 2009)

【中級者向け】
本書はレガシーコードへの対処方法についての書籍です。ただ本書では「レガシーコード」を「ユニットテスト・自動テストが欠落したコード」と定義付けており、「レガシーコードの改善」とは「レガシーコードにユニットテスト・自動テストを記述すること」であると主張しています。そのため、本書の大半はユニットテストについての解説になります。

また、ユニットテストでコードの保守・変更を効率化するCover & Modify(保護して変更する)というアプローチも解説しています。さたに、テスタビリティが劣悪で保守困難なレガシーコードに対して、ユニットテストを書くためのさまざまなテクニックを紹介しています。対象もJava、C++、Cなどを扱っており、多くの方にとって有用な内容となっています。

ユニットテストのないコードで新たにユニットテストを始めようとする方や、派生開発でユニットテストを運用する方にお勧めです。

「Clean Code アジャイルソフトウェア達人の技」(Robert C. Martin (著), 花井 志生(翻訳), アスキー・メディアワークス, 2009)

【初心者~中級者向け】
洗練されたコードを書くための知見を解説する書籍です。保守性に優れたユニットテストの書き方について有益な解説があります。

例えば可読性に優れたユニットテストを書くための原則、ユニットテストのリファクタリングの仕方、ユニットテストの原則F.I.R.S.Tなどの解説を行っています。また学習テストといった、プログラミングを効率化するユニットテストの活用方法にも言及があります。

日本語では類書があまりないので、ユニットテストの保守性の確保に興味ある方にお勧めできます。

2. テスト駆動開発について学ぶ

次にテスト駆動開発を学ぶための本を紹介します。テスト駆動開発はユニットテストを積極的に活用することから、その文献ではユニットテストの構築アプローチや運用についての解説が豊富です。

「テスト駆動開発入門」(ケント・ベック(著), 長瀬 嘉秀他(翻訳), ピアソンエデュケーション, 2003年)

【初心者~中級者向け】
テスト駆動開発の原典的な書籍です。

実際に行うテスト駆動開発の進め方をJavaで詳細に解説するなど具体例に富んでおり、テスト駆動開発について手を動かして学べるようになっています。

また、アサートファーストといったテスト駆動開発についてのパターンや用語を定義しています。これら定義は、テスト駆動開発やアジャイルを扱うコミュニティの共通言語となっているため、本書を理解しておくと他のテスト駆動開発の文献も理解しやすくなります。

テスト対象とユニットテストを並行で設計・実装していく手法に興味がある方にお勧めできます。

「実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる」(Steve Freeman・Nat Pryce(著), 和智 右桂・高木 正弘 (翻訳), 翔泳社, 2012)

【初心者~中級者向け】
同じくテスト駆動開発の入門書籍です。国内では前述の「テスト駆動開発入門」との2冊セットでテスト駆動開発の定番入門書と位置づけされています。

本書の特徴として、ユニットテストにおけるモックオブジェクトの活用方法について解説が充実しています。

また「エンドツーエンドテストによるテストファースト」と「ユニットテストによるテスト駆動開発」という2つのテストファーストを同時に運用するダブルループのアプローチについて解説を行っています。テスト駆動開発については「ユニットレベルの細粒度で設計を進めるためアーキテクチャを瓦解させることがある」という問題がしばしば指摘されていますが、このアプローチを行えばそうした問題を軽減できます。

モックオブジェクトの活用や、設計でのユニットテストの活用について興味ある方にお勧めできる一冊です。

3. テスト設計やテスト実装について学ぶ

ユニットテストの設計や実装について、さらに詳細に解説する書籍を紹介します。

「xUnit Test Patterns: Refactoring Test Code」(Gerard Meszaros, Addison-Wesley Professional, 2007)

【中級者~上級者向け】
本書はxUnitやxUnitを使ったユニットテストの解説書です。

xUnitの仕組み、ユニットテスト・自動テストの原則論や戦略、ユニットテストの各種テクニックやデザインパターン、ユニットテストのリファクタリング、ユニットテストを取り巻くプロジェクトや環境についての知見など、ユニットテストに関する話題を網羅的に解説しています。特にユニットテストの実装の解説については、日本語では類書があまりないほど充実しています。

なお、本書ではユニットテストに関してさまざまな用語やパターンの定義を行っていますが、それらはアジャイルコミュニティに影響を与えています。例えば前述の「JUnit実践入門」などもそうですが、本書出版以降のユニットテストの書籍の多くが、本書の用語やパターンの定義に準拠しています。

洋書ですが、ユニットテストの実装について網羅的に学びたい方や、ユニットテストの前提知識や共通言語をしっかり学びたい方にお勧めできる書籍です。

「ソフトウェアテスト技法―自動化、品質保証、そしてバグの未然防止のために」(Boris Beizer (著), 小野間 彰 他(翻訳), 日経BP出版センター, 1994)

【中級者~上級者向け】
ユニットテストと関わりの深い、ホワイトボックスのテスト設計の解説が充実した書籍です。古典に属する書籍であり、現在では古くなっている内容もいくつかありますが、一方で現代でも見劣りのない詳細な解説も多数記述されています。

内容として、制御フローテストなどホワイトボックスのテスト設計技法や、コードのメトリクスなど、ユニットテストの設計に有用な知見が解説されています。また、ホワイトボックステストを効果的に運用するための考え方や、戦略といった抽象概念の解説も洗練されています。

ユニットテストでのテスト設計に興味のある方にお勧めできる書籍です。なお、ホワイトボックスのテスト設計技法については、別途テスト設計技法の参考書籍紹介にあるトピックでも参考図書を紹介したいと思います。

4. ユニットテストの運用について学ぶ

最後に、ユニットテストの運用や活用について解説を行なっている書籍を紹介します。

「Jenkins実践入門 ~ビルド・テスト・デプロイを自動化する技術 」(佐藤 聖規 (著, 監修), 和田 貴久 他 (著), 技術評論社, 2011)

【初心者~中級者向け】
ユニットテストの保守・運用を大きくサポートする継続的インテグレーションツール・Jenkinsについての解説書です。ユニットテストの解説が充実しています。

具体的には、Jenkinsをターゲットに、継続的インテグレーションにユニットテストを組み込んだり、コードカバレッジなどの指標を運用したりする手順について解説があります。

Jenkinsや継続的インテグレーションでのユニットテストの活用に興味のある方にお勧めできる書籍です。

「Test-Driven Development for Embedded C 」(James W. Grenning, Pragmatic Bookshelf, 2011)

【中級者向け】
組み込みCでのクロス開発を対象とした、テスト駆動開発の解説書です。

本書はホスト環境でのユニットテストと、ターゲット環境でのユニットテストを並行して運用するデュアルターゲットテストのアプローチについて解説を行っています。デュアルターゲットテストは複数の異なるテスト環境のメリットを相互に活かし合うアプローチで、組み込み開発などでのTDDをサポートします。

また、クロス開発やC言語での開発において、効率的にユニットテストを作成するための設計方法やテストの実装方法についての解説にも優れています。

洋書ですが、クロス開発やC言語による開発でのユニットテストの活用に興味ある方にお勧めできる一冊です。

執筆者:プロフィール goyoki

WACATE実行委員 / TDD研究会 / TDDBC 医療機器の開発やテストに従事。テストと開発のコラボレーションやテストの効率化について検討を行なっているほか、テストに関して講演や執筆活動を続けている。