書籍概要

WEB+DB PRESS plus

JUnit実践入門
── 体系的に学ぶユニットテストの技法

著者
発売日
更新日

概要

本書では,JavaテスティングフレームワークのデファクトスタンダードであるJUnitの基本的な使い方から,拡張機能,テストパターンまでを網羅的に解説します。また,データベースやAndroidのテストを取り上げるほか,ユニットテストを開発に効果的に取り入れるためのビルド支援ツール・カバレッジ測定ツール・継続的インテグレーション・テスト駆動開発などの周辺技術について,ユニットテストからの視点で説明します。JUnitをこれから学びたい方,もっと効率的にユニットテストしたい方,必読の書です。

こんな方におすすめ

  • Javaプログラマ全般
  • ユニットテストの効果的な活用方法に興味のある方

本書に関するお知らせ

本書に関連する記事を公開しております。

目次

  • 推薦のことば 和田卓人
  • はじめに
  • 本書について

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

1.1 なぜ,ユニットテストを行うのか?

1.2 JUnitとは?

バージョン

  • [コラム]企業文化と「ユニットテスト」の定義
ライセンス

1.3 JUnitテストを始めよう

チュートリアルの概要

プロジェクトを作成する

  • 新規Javaプロジェクトの作成
  • ライブラリの追加
  • [コラム]junit-4.x.jarとjunit-dep-4.x.jar
テスト対象クラスを作成する

テストクラスを作成する

  • testソースフォルダの作成
  • テストクラスの作成
  • Quick JUnitの利用
テストを実行する

1.4 テストコードの記述

乗算メソッドのテストを作成する

  • 日本語のメソッド名でわかりやすくする
  • 値を比較検証する
  • [コラム]日本語のメソッド名を使うメリット
  • 乗算メソッドテストの実行
乗算メソッドのテストを追加する

  • 障害トレースとエラーメッセージの読み方
  • テストコードの修正
除算メソッドのテストを作成する

  • Calculatorクラスの設計変更
ゼロ除算を例外として送出するテストを作成する

  • 除算メソッドのゼロ除算対応
  • 例外の送出を検証するテスト
チュートリアルの完了

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

2.1 ソフトウェアテストとは?

ソフトウェアテストの特徴

テストケースとテストスイート

  • [コラム]製造業と建築業とソフトウェア開発
ソフトウェアテストの目的

ソフトウェアテストの限界

2.2 テスト技法

ホワイトボックステストとブラックボックステスト

同値クラスに対するテスト

境界値に対するテスト

2.3 ユニットテストとは?

ユニットテストの特徴

ユニットテストの目的

ユニットテストのフレームワーク

2.4 ユニットテストのパターン

自動化されたテスト ── 繰り返しいつでも実行できること

不安定なテスト ── 結果が一定でないテストを避けること

  • [コラム]実行環境とテスト
ドキュメントとしてのテスト ── 仕様書として読めること

  • [コラム]テストケースとドキュメント
問題の局所化 ── テスト失敗時に問題を特定しやすいこと

不明瞭なテスト ── 可読性の低いテストコードは避けること

独立したテスト ── 実行順序に依存しないこと

  • [コラム]シングルトンオブジェクトとユニットテスト

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

3.1 テスティングフレームワークとは?

xUnitフレームワーク

3.2 JUnitによるユニットテストの記法

テストメソッドのthrows句

テストメソッドを簡単に挿入する

3.3 可読性の高いテストコードの書き方

テストケース

テスト対象

  • [コラム]不完全なテストケース
実測値と期待値

メソッドと副作用

4フェーズテスト

テストフィクスチャ

3.4 比較検証を行うアサーション

JUnitのアサーション

3.5 JUnitが提供するアノテーション

@Test ── テストメソッドを宣言する

  • expected
  • timeout
@Ignore ── テストの実行から除外する

@Before ── テストの実行前に処理を行う

@After ── テストの実行後に処理を行う

@BeforeClass ── テストの実行前に一度だけ処理を行う

  • [コラム]JUnit 3スタイルのテスト
@AfterClass ── テストの実行後に一度だけ処理を行う

3.6 JUnitのテストパターン

標準的な振る舞いを検証するテスト

例外の送出を検証するテスト

コンストラクタを検証するテスト

【Part 2 JUnitの機能と拡張】
第4章 アサーション
値を比較検証するしくみ

4.1 Assertによる値の比較検証

assertThat ── 汎用的な値の比較検証

fail ── テストを失敗させる

そのほかのアサーションメソッド

4.2 Matcher APIによるアサーションの特徴

可読性の高い記述

柔軟な比較

  • カスタムMatcherによる,より柔軟な比較
詳細な情報の提供

4.3 Matcher APIの使用

CoreMatchersが提供するMatcher

  • is
  • nullValue
  • not
  • notNullValue
  • sameInstance
  • instanceOf
JUnitMatchersが提供するMatcher

  • hasItem
  • hasItems
そのほかHamcrestが提供するMatcher

4.4 カスタムMatcherの作成

日付の比較検証を行うカスタムMatcherの要件

カスタムMatcherの作成手順

  • IsDateクラスを作成する
  • ファクトリメソッドを作成する
  • コンストラクタを定義する
  • matchesメソッドを実装する
  • describeToメソッドを実装する
  • テスト失敗メッセージの確認
カスタムMatcherのメリット

IsDateによる比較の実行結果

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

5.1 コマンドラインからのJUnitの実行

テストクラスからテストを実行する

JUnitCoreクラスのしくみ

5.2 テストランナーとは?

テストランナーの設定

5.3 JUnitが提供するテストランナー

  • [コラム]ユニットテストの実行結果をカスタマイズする
JUnit4 ── テストクラスの全テストケースを実行する

Suite ── 複数のテストクラスをまとめて実行する

  • テストスイートクラスでテストクラスを束ねる
  • テストスイートクラスの利用
  • テストスイートとビルド支援ツール
Enclosed ── 構造化したテストクラスを実行する

Theories ── パラメータ化したテストケースを実行する

Categories ── 特定カテゴリのテストクラスをまとめて実行する

  • カテゴリクラスの作成
  • カテゴリクラスの指定
  • カテゴリ化テストの実行
  • [コラム]JUnitのorg.junit.experimentalパッケージ

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

6.1 テストのコンテキストとは?

6.2 テストケースの整理

テストクラスの構造化

テストケースをグループ化する

Enclosedによるテストクラスの構造化

6.3 コンテキストのパターン

共通のデータに着目する

共通の状態に着目する

コンストラクタのテストを分ける

6.4 テストクラスを横断する共通処理

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

7.1 テストフィクスチャとは?

ユニットテストのフィクスチャ

フレッシュフィクスチャ

フィクスチャとスローテスト問題

共有フィクスチャ

7.2 フィクスチャのセットアップパターン

インラインセットアップ

暗黙的セットアップ

生成メソッドでのセットアップ

外部リソースからのセットアップ

  • YAMLを使ったセットアップ
  • [コラム]Javaと宣言的記法

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

8.1 テストデータの選択

どのくらいのテストデータが必要か?

  • 同値クラスによるテストデータの選択
  • 組み合わせによるテストデータの選択
どのテストデータを選択するか?

  • [コラム]妥当な値の範囲を制限する

8.2 入力値と期待値のパラメータ化

Theories ── パラメータ化テストのテストランナー

@Theory ── テストメソッドに指定するアノテーション

@DataPoint ── パラメータを定義するアノテーション

  • [コラム]Parameterizedテストランナー
  • 複数のテストメソッドがある場合
  • 複数の引数が定義されている場合
  • 同じ型の引数が複数定義されている場合
  • パラメータをフィクスチャオブジェクトにまとめる
@DataPoints ── 複数のパラメータを定義するアノテーション

8.3 組み合わせテスト

Assumeによるパラメータのフィルタリング

8.4 パラメータ化テストの問題

データの網羅性

パラメータに関する情報の欠落

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

9.1 ルールとは?

ルールの宣言

ルールのしくみ

複数のルールの宣言

9.2 JUnitが提供するルール

TemporaryFolder ── 一時ファイルを扱う

  • TemporaryFolderの拡張
ExternalResource ── 外部リソースを扱う

Verifier ── 事後検証を行う

ErrorCollector ── エラーを収集する

ExpectedException ── 詳細な例外を扱う

Timeout ── テストのタイムアウトを設定する

TestWatcher ── テストの実行を監視する

TestName ── テスト名を扱う

9.3 カスタムルールの作成

TestRuleインタフェース

事前条件をチェックするカスタムルール

OSに依存したテストを行うカスタムルール

9.4 RuleChainによるルールの連鎖

9.5 ClassRuleによるテストクラス単位でのルールの適用

  • [コラム]JUnitのバージョンとルール

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

10.1 スローテスト問題

スローテスト問題とは?

対策

  • テストの実行時間を短くする
  • テストの実行環境を強化する
  • テストを並列で実行する
  • 実行するテストを絞り込む

10.2 カテゴリ化テスト

カテゴリ化テストとは?

カテゴリ化テストの実行

  • カテゴリクラスを作成する
  • テストケースにカテゴリを指定する
  • テストスイートクラスを作成する
  • Eclipseからカテゴリ化テストを実行する

10.3 カテゴリ化テストのパターン

データベーステスト

通信処理を伴うテスト

GUIを伴うテスト

10.4 ビルドツールによるカテゴリ化テスト

【Part 3 ユニットテストの活用と実践】
第11章 テストダブル
テスタビリティと,モック/スタブによるテスト

11.1 テスタビリティを高めるリファクタリング

テスタビリティとは?

リファクタリングとは?

  • [コラム]ユニットテストを前提としたリファクタリング
メソッドの抽出

  • 処理をメソッドに抽出する
  • 抽出メソッドをテストでオーバーライドする
委譲オブジェクトの抽出

  • 処理を委譲オブジェクトに抽出する
  • [コラム]メソッドとオブジェクト
  • 委譲オブジェクトをテストで置き換える
  • [コラム]DIとユニットテスト

11.2 テストダブルとは?

スタブ ── 依存オブジェクトに予測可能な振る舞いをさせる

  • 固定値を返すスタブ
  • 例外を送出するスタブ
モック ── 依存オブジェクトの呼び出しを検証する

  • モックとスタブの違い
スパイ ── 依存オブジェクトの呼び出しを監視する

  • [コラム]状態に着目するテストと相互作用に着目するテスト

11.3 Mockitoによるモックオブジェクト

Mockitoとは?

Mockitoを利用する準備

モックオブジェクトの作成

スタブメソッドの戻り値

スタブメソッドの定義

  • 例外を送出するスタブメソッド
  • void型を返すスタブメソッド
  • 任意の引数に対するスタブメソッド
スタブメソッドの検証

  • [コラム]Mockitoの後置記法と前置記法
部分的なモックオブジェクト

スパイオブジェクト

  • メソッド実行時のコールバック

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

12.1 データベースに依存するユニットテスト

データベースを扱うソフトウェアの設計

  • Web三層構造アーキテクチャ
  • パーシステンス層のスタブによる置き換え
  • プロダクション環境とユニットテスト
  • [コラム]代替データベースを利用したテスト
データベースの状態とユニットテスト

  • 参照系のテスト
  • 更新系のテスト

12.2 ユニットテストの自動化とH2 Database

H2 Databaseサーバの起動/停止を行うルール

12.3 DbUnitによるデータベースのテスト

DbUnitとは?

DbUnitのJUnit 4対応

  • DbUnitのルールクラスの作成
  • DbUnitのルールクラスの利用
データベースのセットアップ

  • DbUnitのデータセット
  • データセットの外部定義
データベースのアサーション

  • JUnit 4スタイルでのアサーション
コンテキストによるテストケースの整理

DbUnitのそのほかの機能

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

13.1 GUIアプリケーションの設計

GUIアプリケーション開発のポイント

MVCパターン

  • モデル
  • ビュー
  • コントローラ
イベント駆動

  • イベントハンドラ/イベントリスナ
GUIアプリケーションのスレッドモデル

  • [コラム]なぜGUIはシングルスレッドモデルなのか?

13.2 MVCパターンによるAndroidアプリケーションの作成

HelloAndroidの概要

Androidのプロジェクトの作成

エミュレータの起動

レイアウトを作成する

アクティビティを実装する

  • コンポーネントの参照
  • イベントハンドラの追加
モデル用プロジェクトの作成

モデルの定義

モデルのスタブ実装

  • [コラム]独立したモデルプロジェクトのメリット
スタブ実装によるイベントの実装

13.3 モデルのテスト

認証ユーザクラスのテスト

ユーザ認証クラスのテスト

13.4 ビューとコントローラのテスト

Androidアプリケーションの機能テスト

Android SDKが提供するテスティングフレームワーク

アクティビティのテスト

  • テスト用プロジェクトの作成
  • [コラム]JUnit 3.8におけるテストを書くルール
  • MainActivityTestの作成
  • アクティビティテストの初期化
  • 初期状態のテスト
  • アクティビティテストの実行
シナリオテスト

  • ハッピーパスのテスト
  • 拡張シナリオのテスト
  • エラーシナリオのテスト
  • シナリオの優先順位

13.5 GUIアプリケーションのテストにおける注意点

  • [コラム]正常系/準正常系/異常系
  • [コラム]Webアプリケーションの機能テスト

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

14.1 コードカバレッジとは?

カバレッジの基準

  • C0(命令網羅)
  • C1(分岐網羅)
  • C2(条件網羅)
カバレッジ測定の効果

14.2 カバレッジツールの利用

ユニットテストの漏れを監視する

テストケースの問題を検知する

コードの実行をトレースする

カバレッジツールの選択肢

14.3 EclEMMAによるカバレッジ測定

EclEMMAプラグインのインストール

  • [コラム]そのほかのカバレッジツール
EclEMMAプラグインの実行

  • [コラム]EclEMMAプラグインとJaCoCoエンジン
カバレッジビューとカウンタ

  • 命令カウンタ
  • ブランチカウンタ
  • 行カウンタ
  • メソッドカウンタ
  • 型カウンタ
  • 複雑度
コードハイライト

測定結果のクリア

14.4 カバレッジに関するよくある疑問

カバレッジとは何か?

カバレッジ測定の目的は何か?

  • [コラム]デフォルトコンストラクタとカバレッジ
何%のカバレッジを目標とするべきか?

ユーティリティクラスのコンストラクタをどう扱うか?

再現困難な例外処理をどうするか?

いつカバレッジを測定するか?

カバレッジは本当に役に立つのか?

【Part 4 開発プロセスの改善】
第15章 継続的テスト
すばやいフィードバックを手に入れる

15.1 継続的テスト

開発チームへのすばやいフィードバック

  • 早期からテストする
  • 自動的にテストする
  • 繰り返しテストする
継続的テストとは?

継続的テストを行うための3つの要素

  • ユニットテスト
  • 自動化
  • バージョン管理
継続的テストの運用

継続的テストとリファクタリング

  • ユニットテストとリファクタリング
  • 積極的なリファクタリング

15.2 Mavenによるビルドプロセスの自動化

Mavenとは?

  • [コラム]Mavenのバージョン
Mavenの準備

MavenプロジェクトとPOM

Mavenプロジェクトの作成

Mavenのプロジェクト構成

依存ライブラリの管理

  • Mavenのリポジトリ
  • 依存ライブラリの追加
ソースコードのエンコーティング設定

Mavenのプラグイン

  • プラグインの設定
  • [コラム]プラグインのconfigurationセクション
Mavenによるビルドの実行とフェーズ

  • テストをスキップする
  • Eclipseから実行する
プラグインとゴール

  • ゴールを実行する
Mavenによるカテゴリ化テスト

Mavenによるカバレッジレポート

  • JaCoCoプラグインの導入
  • JaCoCoによるカバレッジレポート

15.3 バージョン管理システムによる継続的テストの運用

バージョン管理システムとは?

バージョン管理システムへのコミット

Subversionでのテストサイクル

GitやMercurialでのテストサイクル

15.4 Jenkinsによる継続的インテグレーション

継続的インテグレーションとは?

Jenkinsとは?

Jenkinsの導入

Jenkinsのジョブ

ジョブの作成

ジョブの設定

  • バージョン管理システムの設定
  • ビルドゴールの設定
  • ジョブの実行
ビルドトリガーの設定

  • Jenkinsのリモートビルド機能
  • バージョン管理システムのフック機能
継続的インテグレーションの効果

  • テストの実行コスト削減
  • すばやいフィードバック
  • テスト結果の履歴
  • [コラム]失敗するテストの扱い

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

16.1 テスト駆動開発とは?

16.2 テスト駆動開発のサイクル

設計する

テストコードを書く

プロダクションコードを書く

リファクタリングを行う

次のサイクルを始める

16.3 Calculatorクラスのテスト駆動開発

テストファースト

  • テストクラスの作成
  • 設計とテストケースの作成
  • テストケースの実装
コンパイルエラーの解決

  • [コラム]テスタビリティとクラス設計
  • クイックフィックスの活用
仮実装

  • 仮実装の目的
リファクタリング

  • リファクタリングの目的
三角測量

  • 計測点の追加
  • プロダクションコードの修正

16.4 テスト駆動開発の目的

ステップバイステップ

自分が最初のユーザ

動作するきれいなコード

すばやいフィードバック

メンテナンスされたドキュメント

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

17.1 受け入れテストとは?

受け入れテストの自動化

17.2 振舞駆動開発とは?

ソフトウェアの振る舞いを記述するシナリオ

  • 「~するべき」とアサーション
振舞駆動開発と受け入れテスト

テスト駆動開発との違い

  • テストコードと自然言語によるシナリオ
  • [コラム]ユースケースシナリオと振舞駆動開発のシナリオ
  • API設計のタイミング
  • 検証する対象の粒度
振舞駆動開発の語彙

  • Given/前提
  • When/もし
  • [コラム]振舞駆動開発の生まれた背景
  • Then/ならば

17.3 cucumber-junitによる振舞駆動開発

cucumber-junitのしくみ

cucumber-junitの準備

ポーカーアプリケーションの概要

フィーチャファイルの作成

シナリオの作成

  • ランダム性とテスト
シナリオの実行

ステップ定義の作成

  • コードスニペットの利用
  • ステップ定義ファイルの作成
ステップ定義の実装

  • ポーカーアプリケーションの設計
  • プロダクションコード
  • [コラム]PokerGameクラスの設計
ワンペアシナリオの作成

シナリオテンプレートの利用

アウトサイドインの開発

【Part 5 演習問題】
第18章 ベーシックなテスト

18.1 状態を持たないメソッドのテスト

18.2 例外を送出するメソッドのテスト

18.3 副作用を持つメソッドのテスト

18.4 同値クラスに対するテスト

18.5 void型を戻り値とするメソッドのテスト

18.6 マルチスレッドのテスト

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

19.1 リストのアサーション

19.2 JavaBeansのアサーション

19.3 複数行テキストのアサーション

19.4 境界値のテスト

19.5 フィクスチャを用いたパラメータ化テスト

19.6 組み合わせテスト

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

20.1 システム時間に依存するテスト

20.2 例外ハンドリングのテスト

20.3 外部システムに依存するテスト

20.4 インタフェースとスタブによるテスト

20.5 サーブレットのテスト

20.6 Hello Worldのテスト

【付録】
付録A 開発環境のセットアップ

A.1 JDKのセットアップ

Javaのバージョン

JDKのインストール

A.2 Eclipseのセットアップ

Eclipseのバージョン

Eclipseのインストール

Eclipseの日本語化

Mac OS X環境におけるデフォルト文字コードの設定

  • [コラム]Eclipseは英語版のまま使おう

付録B Eclipseの便利機能と設定

B.1 EclipseのJUnitサポート

B.2 テキストファイルのエンコーディング設定

B.3 staticインポートのワイルドカード

B.4 Quick JUnit

Quick JUnitプラグインをインストールする

テスティングペアを開く

テストを実行する

B.5 コンテンツアシストとお気に入り

B.6 テンプレート

test ── テストメソッド

at ── アサーション

setUp ── 初期化メソッド

tearDown ── 後処理メソッド

setUpClass ── クラスの初期化メソッド

tearDownClass ── クラスの後処理メソッド

when ── ネストしたテストクラス

instantiation ── インスタンス化テスト

B.7 次の注釈

B.8 クイックフィックス

B.9 クイックアウトライン

付録C H2 Databaseのセットアップと使い方

C.1 H2 Databaseの特徴

C.2 H2 Databaseのセットアップ

C.3 H2 Databaseの起動と停止

サーバモード

組込みモード

C.4 H2 Databaseの起動オプション

C.5 H2 Console

付録D Android開発環境のセットアップ

D.1 ADTのインストール

D.2 AVDの設定

付録E Jenkinsの設定

E.1 JDKの設定

E.2 Mavenの設定

E.3 プラグインの設定

付録F 本書利用環境のバージョン

F.1 開発環境

F.2 Eclipseプラグイン

F.3 外部ライブラリ

F.4 Mavenプラグイン

巻頭付録 JUnitチートシート

巻末付録 Eclipseのショートカット

サポート

ダウンロード

本書で使用したサンプルコード,および巻頭・巻末付録をダウンロードできます。

サンプルコードの利用方法については,付属のREADMEファイルをご覧ください。

巻頭・巻末付録についてはPDFとPNG画像を用意しました。印刷して利用する,壁紙として利用するなど,ご自由にお使いください。

MercurialやGitをお使いの方は,下記リポジトリからも取得できます。

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2013年9月4日更新)

P.4 「ライセンス」の2行目(第2刷以降,修正済み)

EPL(Ecilpse Public License)
EPL(Eclipse Public License)

P.4 本文,下から2行目(第2刷以降,修正済み)

Eclipse 3.6.2 Indigo
Eclipse 3.7.2 Indigo

P.5 上から3行目(第2刷以降,修正済み)

Eclipse 3.6.2 Indigo
Eclipse 3.7.2 Indigo

P.35 コラム「テストケースとドキュメント」の脚注b(第3刷以降,修正済み)

注b Martin Fowler著/児玉信、友野晶夫、~
注b Martin Fowler著/児玉公信、友野晶夫、~

P.76 「テスト失敗メッセージの確認」の3行目(第3刷以降,修正済み)

assertThat(new Data(), is(dateOf(2012, 1, 12)));
assertThat(new Data(), is(dateOf(2011, 2, 10)));

P.174 脚注2(第3刷以降,修正済み)

注b Martin Fowler著/児玉信、友野晶夫、~
注b Martin Fowler著/児玉公信、友野晶夫、~

P.186 リスト11.18の3,4行目(第2刷以降,修正済み)

public class UserDaoStub implements UserDao {
    @Override
    public User find(String userId) throws {
        new UserNotFoundException("connection error");
    }
}
public class UserDaoStub implements UserDao {
    @Override
    public User find(String userId) throws UserNotFoundException {
        throw new UserNotFoundException("connection error");
    }
}

P.196 リスト11.29の3行目(第2刷以降,修正済み)

List list = new ArrayList();
List spy = spy(list);
when(mock.size()).thenReturn(100);
spy.add("Hello");
List list = new ArrayList();
List spy = spy(list);
when(spy.size()).thenReturn(100);
spy.add("Hello");

P.239 リスト13.7の上から16,17行目(第2刷以降,修正済み)

"ユーザIDとパスワードを正しく入力してください" :
"ようこそ、" + authUser.userId + "さん";
"ようこそ、" + authUser.userId + "さん" :
"ユーザIDとパスワードを正しく入力してください";

P.259 下から2行目(第2刷以降,修正済み)

実行状態を見えやすくなるため
実行状態を見えやすくるため

P.264 「ブランチカウンタ」の3行目(第3刷以降,修正済み)

記述に間違いがあります。一般的にC1カバレッジは例外処理なども分岐と見なしますが,EclEMMAで利用しているJaCoCoでは例外処理を分岐と見なしません。

try-catch構文なども含め、コードに分岐がいくつあるかをカウントし、実行されたブロックの割合をカバレッジとして測定します。
if文やswitch文などの分岐をカウントし、実行された分岐の割合をカバレッジとして測定します。ただし、EclEMMAでは例外処理を分岐と見なしません。

P.286 「ソースコードのエンコーディング設定」の6行目(第2刷以降,修正済み)

project.build.sourceEncofingタグ
project.build.sourceEncodingタグ

P.328 ページ中段のボックス内,下から2行目(第2刷以降,修正済み)

もし 3と4を加算したならば
もし 3と4を加算した

P.362 「テストケース」の箇条書きの最後の項目(第3刷以降,修正済み)

Itemが1つ追加されている状態で、addで同じItemオブジェクトを追加すると~
Itemが1つ追加されている状態で、addで異なるItemオブジェクトを追加すると~

P.378 リスト19.9の5行目(第3刷以降,修正済み)

String expected = "Hello" + ls + "World";
String expected = "Hello" + ls + "World" + ls;

P.412 「A.1JDKのセットアップ」の2行目(第3刷以降,修正済み)

Java Runtime Enviroment
Java Runtime Environment

P.421 「テキストファイルのエンコーディング設定」の7行目(第2刷以降,修正済み)

「テスト・ファイルのエンコード」
「テスト・ファイルのエンコード」

巻末付録(第2刷以降,修正済み)

ソースメニューの表示 Ctrl + Alt + S
リファクタリングメニューの表示 Ctrl + Alt + T
ソースメニューの表示 Shift + Alt + S
リファクタリングメニューの表示 Shift + Alt + T

商品一覧