目次
第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による負荷テストでの活用