Javaエンジニアのための ソフトウェアテスト実践入門 ~自動化と生成AIによるモダンなテスト技法~
- 斉藤賢哉 著
 - 定価
 - 3,520円(本体3,200円+税10%)
 - 発売日
 - 2024.10.3
 - 判型
 - A5
 - 頁数
 - 376ページ
 - ISBN
 - 978-4-297-14435-7 978-4-297-14436-4
 
サポート情報
概要
プログラミング開発において、テストと伴奏しながら開発を進めるスタイルが常識となりつつあります。本書はJUnit 5を軸に、定番のJavaのテスティングフレームワークを網羅的に取り上げ、効率的な開発環境の構築をサポートします。テストを効率的かつ継続的に行うためのビルド支援ツールや継続的インテグレーションなどの周辺技術についても、ユニットテストからの視点で説明します。近年、発展の著しい生成AIについても、本書で紹介するツール類でどのように活用できるのかを紹介していきます。
こんな方にオススメ
- Javaの最新のテスト環境や、それらの連携方法を押さえておきたいJavaエンジニア
 
目次
第1章 ソフトウェアテストの全体像
1.1 ソフトウェアテストの概要
- 1.1.1 ソフトウェアテストの基本的な考え方
- テストの定義と本書のスコープ
 - 「ソフトウェアテストの7原則」
 - ソフトウェアテストの目的と意義
 - ソフトウェアテストの限界
 
 - 1.1.2 開発プロセスにおけるテストの位置付けと種類
- ソフトウェア開発における2つのプロセス
 - ウォーターフォール開発における工程とV字モデル
 
 - 1.1.3 テストケースの作成とテスト技法
- テストケースの構成要素
 - ホワイトボックステストとブラックボックステスト
 - カバレッジ基準
 - 同値分割法
 - 境界値テスト
 
 - 1.1.4 テスト技法の具体例
- 「特殊電卓」を題材にしたそれぞれのテスト技法
 - 「特殊電卓」に対するホワイトボックステスト
 - 「特殊電卓」に対するブラックボックステスト
 - 「特殊電卓」に対する同値分割法
 - 「特殊電卓」に対する境界値テスト
 
 
1.2 単体テストの手法と戦略
- 1.2.1 テストの分類と定義
- テストを分類・定義する目的
 - 単体テストと結合テストを分類する基準
 - 単体テスト or 結合テスト?
 
 - 1.2.2 単体テストの目的と要件
- 単体テストの目的
 - 単体テストの要件
 
 - 1.2.3 単体テストにおける基本的なプログラム構成と処理フロー
- 単体テストにおけるプログラム構成
 - テストケースの3つのフェーズ
 - テストの「成功」と「失敗」
 - テストケースの粒度
 - 単体テストの独立性
 - 前処理と後処理
 
 - 1.2.4 テストダブルと「依存」
- テストダブルとその分類
 - プログラムにおける「依存」とは
 - 呼び出し先への「依存」の解決
 - 単体テストにおける「依存性注入」
 
 - 1.2.5 単体テストにおける検証パターン
- 出力値ベースの検証
 - 状態ベースの検証
 - コミュニケーションベースの検証
 
 - 1.2.6 単体テストの実行時間と自動化
- 単体テストの実行時間
 - 迅速なフィードバック
 - 単体テストによる保守性・拡張性の確保
 - 単体テストの自動化とテストランナー
 
 - 1.2.7 単体テストとブランチ戦略
- Git Flow戦略の概要
 - 単体テスト戦略とブランチ戦略の関係
 
 - 1.2.8 単体テストの評価とアプローチ
- 単体テストにおける正確性の評価
 - 単体テストにおけるテスト技法
 
 - 1.2.9 テスト駆動開発
 - コラム "ロンドン学派"と"古典学派"
 
1.3 結合テストとシステムテスト
- 1.3.1 結合テスト
- 結合テストの分類と特徴
 - 結合テストと他システム接続
 - 結合テストの自動化
 
 - 1.3.2 システムテスト
- システムテストとは
 - E2Eテスト
 - テストピラミッド
 
 - 1.3.3 パフォーマンステスト
- パフォーマンステストとは
 - 負荷テスト
 - ストレステスト
 - 耐久テスト
 
 
1.4 テスティングフレームワーク
- 1.4.1 テスティングフレームワークの全体像
- xUnitテスティングフレームワークとは
 - テスティングフレームワークのプログラム構成
 
 
1.5 CI/CD
- 1.5.1 CI/CDとテスト自動化
- CI/CDとパイプライン
 - CI/CDツール
 - CI/CDパイプラインとテスト自動化
 - Git起点のCI/CDパイプライン
 
 
第2章 JUnit 5による単体テスト
2.1 JUnit 5のさまざまな機能
- 2.1.1 JUnit5の概要
- JUnit4からJUnit5へ
 - JUnit5の主要な機能
 
 - 2.1.2 JUnit5におけるプログラム構成
- テストクラスとテスト対象クラスの関係性
 - テストクラスの作成と配置
 - テストメソッドの作成方法
 - テストメソッドの基本的な処理
 - テストクラスの実行
 - テストのスキップ
 
 - 2.1.3 アサーションAPIとテストの成否
- アサーションAPIの全体像
 - テストの成否
 - 等価性の検証
 - 真偽値の検証
 - null値かどうかの検証
 - インスタンスの型の検証
 - 同一性の検証
 - コレクションや配列の検証
 
 - 2.1.4 テストコードのドキュメンテーション
- ドキュメンテーションとしての側面
 - テストクラスとテストメソッドのネーミング
 - @DisplayNameアノテーション
 
 - 2.1.5 テストクラスのライフサイクルとテストフィクスチャ
- ライフサイクルメソッド
 - テストフィクスチャ
 
 - 2.1.6 テストクラスのグループ化と階層化
- テストスイート
 - ネステッドクラス
 
 - 2.1.7 パラメータ化テスト
- パラメータ化テスト
 - パラメータ化テストの対象クラス
 - リテラル配列からのパラメータ取得
 - CSVファイルからのパラメータ取得
 - スタティックメソッドからのパラメータ取得
 
 - 2.1.8 エラー発生有無のテスト
- エラー発生時のテスト成否
 - fail()による明示的なテスト失敗
 - assertThrows()による例外のアサーション
 
 - 2.1.9 その他の高度なテスト
- タイムアウトのテスト
 - アサンプションAPI
 
 
2.2 単体テストにおける「依存性注入」とテストダブルの利用
- 2.2.1 「荷物配送サービス」の仕様とコード
- 「荷物配送サービス」の仕様とクラス構成
 - ShippingServiceクラスの仕様
 - CostCalculatorクラスの仕様
 
 - 2.2.2 荷物配送サービスのテストコード
- ShippingServiceを対象にしたテストクラス
 
 - 2.2.3 テストダブルの利用
- テストダブルの作成
 - 「依存性注入」によるテストダブルへの置き換え
 
 
2.3 JUnitの開発環境
- 2.3.1 Gradleからのビルドテスト
- Gradleとは
 - GradleとCI/CD
 - JUnit Platformの設定方法
 - ログ出力の設定方法
 - レポート出力の設定方法
 - ビルドテストにおけるグループ分け
 
 - 2.3.2 JaCoCoによるカバレッジレポート
- JaCoCoの設定
 - JaCoCoのレポート
 
 
第3章 モッキングフレームワークの活用
3.1 Mockitoによるモッキング
- 3.1.1 Mockitoの基本
- Mockitoの概要
 - テストダブルとモック
 - Mockitoによるモッキング手順
 - Mockitoの主要なAPI
 
 - 3.1.2 モックの作成と振る舞いの設定
- モックの作成
 - 疑似的な振る舞いを設定するための2つの方式
 - when-then方式
 - do-when方式
 - スタティックメソッドのモック化
 
 - 3.1.3 引数マッチングと動的な振る舞い
- 引数マッチングAPIとは
 - 引数マッチングの挙動
 - argThat()による汎用的なマッチング条件指定
 - Answerによる動的な振る舞い設定
 
 - 3.1.4 コミュニケーションベース検証
- コミュニケーションベース検証の基本
 - 順番を意識したコミュニケーションベース検証
 
 - 3.1.5 スパイの作成と振る舞いの設定
- スパイとは
 - スパイの作成
 - 振る舞いの設定とスパイの挙動
 - 副作用の発生抑止と検証
 
 - 3.1.6 JUnitテストコードにおけるMockitoの活用事例
- サービスとテストの全体像
 - Mockito導入前
 - Mockito導入後の変更点
 
 
第4章 データベーステストの効率化
4.1 DBUnitによるデータベーステスト
- 4.1.1 DBUnitの基本
- DBUnitの概要と主要な機能
 - DBUnitリソースの単位と配置
 - DBUnitのテストフィクスチャ
 - テスト対象のDAO
 
 - 4.1.2 DBUnitテストフィクスチャとデータの初期化
- DBUnitテストフィクスチャのセットアップ
 - 初期データのセットアップ
 
 - 4.1.3 CRUD操作のテスト
- 読み込み系操作(検索)のテスト
 - 書き込み系操作(挿入/削除/更新)のテスト
 
 - 4.1.4 DBUnitの活用事例
- サービスとテストの全体像
 
 
第5章 Spring Bootアプリケーションの単体テスト
5.1 Spring Boot Testによる単体テスト
- 5.1.1 Spring BootとSpring Boot Test
- Spring Bootとは
 - Spring BootによるWebアプリケーションのシステム構成
 - Spring Boot Testの概要と主要な機能
 - Spring Boot Testが提供するアノテーション
 
 - 5.1.2 サービスの単体テスト
- サービスの単体テスト概要
 - サービス単体テストの具体例
 
 - 5.1.3 MockMVCによるコントローラの単体テスト
- MockMVCの概要と主要な機能
 - MockMVCによるテストクラスの構造
 - 疑似的なリクエストの構築
 - レスポンス検証項目の設定
 
 - 5.1.4 MockMVCによるテストクラス実装の具体例
- テスト対象アプリケーションのページ遷移
 - テスト対象コントローラクラス
 - MockMVCを利用したテストクラス
 
 - 5.1.5 テスト用プロファイルとプロパティ
- テスト用プロファイルの切り替え
 - テスト用プロパティの設定
 
 
第6章 REST APIのテスト
6.1 RestAssuredによるREST APIのテスト
- 6.1.1 RestAssuredの基本
- REST APIのテスト概要
 - RestAssuredの概要と主要なAPI
 - テスト対象RESTサービスのURL設定(全体)
 
 - 6.1.2 RestAssuredとGiven-When-Thenパターン
- Given-When-Thenパターン
 - リクエストの設定(Given)
 - テスト対象RESTサービスへのリクエスト送信(When)
 - レスポンスの検証と抽出(Then)
 
 - 6.1.3 RestAssuredによるテストクラス実装の具体例
- GETメソッドによる主キー検索APIのテスト
 - GETメソッドによる条件検索APIのテスト
 - POSTメソッドによる新規作成APIのテスト
 - PUTメソッドによる置換APIのテスト
 - DELETEメソッドによる削除APIのテスト
 
 
6.2 WireMockによるモックサーバー構築
- 6.2.1 WireMockによるHTTPサーバーのモッキング
- WireMockの基本的なクラス構成
 - WireMockの主要なAPI
 
 - 6.2.2 WireMockによるモックサーバー構築の具体例
- 具体例1:リクエストボディを持つREST API
 - 具体例2:Person(人物)を操作するためのREST API
 - 具体例3:静的ファイルを返すREST API
 
 
第7章 UIテストの自動化
7.1 SelenideによるWebブラウザのUIテスト
- 7.1.1 Seleniumの概要
- SeleniumとWebDriverの仕組み
 - SeleniumによるUI操作
 
 - 7.1.2 Selenideの基本
- Selenideの主要なAPI
 - Webブラウザを操作するためのAPI
 - Webページ情報取得のためのAPI
 - UI要素を取得するためのAPI
 - UIを操作するためのAPI
 - UI要素を検証するためのAPI
 - スクリーンショット取得のためのAPI
 - その他のAPI
 
 - 7.1.3 Selenideによるテストクラス実装の具体例
- 「テックブックストア」
 
 
第8章 負荷テストの自動化
8.1 Gatlingによる負荷テスト
- 8.1.1 Gatlingの基本
- 負荷テストの概要と負荷テストツールの機能
 - Gatlingの概要
 - シミュレーションとシナリオ
 - シミュレーションクラスの基本的なクラス構成
 
 - 8.1.2 シミュレーションクラスの作成方法
- Gatlingの主要なAPI
 - HTTP共通情報設定API
 - フィーダー設定API
 - シナリオ構築API
 - アクション構築API
 - レスポンス検証API
 - シミュレーション設定API
 
 - 8.1.3 シミュレーションの実行方法と結果レポート
- 「テックブックストア」の負荷テスト
 - 負荷テストの実行
 - 負荷テストの結果レポート
 
 
Appendix
A.1 GitHub Actionsとコンテナを活用したCI/CD
- A.1.1 コンテナとCI/CDパイプライン
- コンテナとDocker
 - コンテナイメージとコンテナレジストリ
 - コンテナ管理プラットフォームKubernetes
 - CI/CDツール+コンテナ環境の組み合わせ
 
 - A.1.2 GitHub Actions+Amazon EKSによるパイプライン構築例
- GitHub ActionsとGHCR
 - GitHub Actionsにおけるアクション
 - ワークフローの全体像
 - ワークフローファイルの概要
 - ジョブにおける各ステップの処理
 
 
A.2 生成AIのテストへの活用
- A.2.1 本書で取り上げる生成AI
- 生成AIをテストに活用するためのアプローチ
 
 - A.2.2 JUnit単体テストでの活用
- テスト仕様からテストコード生成(アプローチ①)
 - プロダクションコードからテストコード生成(アプローチ②)
 
 - A.2.3 REST APIテストでの活用
- RestAssuredによるテストコード生成
 - WireMockによるモックサーバーのコード生成
 
 - A.2.4 SelenideによるUIテストでの活用
 - A.2.5 Gatlingによる負荷テストでの活用
 
プロフィール
斉藤賢哉
1970年生まれ。一橋大学経済学部を卒業後、1994年に金融機関に入社。4年目よりシステム部門に配属となり、今日まで25年以上に渡って企業システムの開発に従事。専門分野はJavaによるシステム開発で、アーキテクトとして重要システムの技術設計やソリューション選定、もしくは社内標準のフレームワーク開発といった、豊富な経験を有する。
現在はグループのシステム関連会社にて、先進技術による機能開発や横断的な施策を担う部門を本部長として統括する傍ら、生成AI活用によるDXの推進についてもテクニカルリード的な役割を担当。
外部向けには、さまざまなセミナーでの登壇や雑誌への技術記事寄稿の実績あり。著書に『マスタリングJava EE 5』(2007年、翔泳社)、『アプリケーションアーキテクチャ設計パターン』(2017年、技術評論社)がある。
2023年よりUdemy講師にも挑戦。本書執筆時点では「現役アーキテクトが教える『Java Basic編』/『Java Advanced編』/『Javaテスト基礎&実践』」の3コースを運営中。今後も拡大予定で、「企業アプリケーション開発に必要なコース」をコンプリートすることが目標。
趣味は野球観戦と音楽鑑賞。横浜ベイスターズファン。ワインとチーズをこよなく愛する。最近では愛犬と遊ぶことが最大の楽しみ。