目次
- はじめに
第1章 ソフトウェアテストの変遷
- 1.1 1990年代までと2000年代のソフトウェアテスト
- 目視確認が普通だった
- 自動テストの普及
- 手動によるテストでは,ソフトウェアが腐る
- 1.2 フィードバックループを短くする
- テストとフィードバックループ
- テストファースト開発
- 1.3 ビッグバンインテグレーションから継続的インテグレーションへ
- ビッグバンインテグレーション
- 夜間ビルド
- 継続的インテグレーション
- 1.4 まとめ
第2章 API仕様
- 2.1 APIとは
- フレームワークや標準ライブラリのAPI仕様
- 企業内でのAPI仕様
- 2.2 優れたAPI仕様とは
- 理解が容易
- 変更が容易
- テストが容易
- 2.3 API仕様でよくある問題点
- API仕様が記述されていない
- エラーの説明が記述されていない
- API仕様に基づく自動テストコードが存在しない
- 2.4 API仕様に書くべきこと
- サービスの概要の説明
- 個々のエンドポイントの説明
- エラーの説明
- 2.5 API仕様とE2Eテスト
- 2.6 まとめ
第3章 gRPCにおけるAPI仕様の書き方
- 3.1 gRPCとは
- 3.2 API仕様をどこに書くか
- 3.3 サービスの概要の説明
- 3.4 個々のエンドポイント(RPC)の説明
- 3.5 エラーの説明
- パラメータの不正
- 誤った順序での呼び出し
- 認証や認可のエラー
- サービスの概要に書くべきそのほかのエラー
- 個々のエンドポイントに書くべきそのほかのエラー
- 書く必要がないエラー
- 3.6 リストオプションの説明
- 3.7 まとめ
第4章 API仕様ファースト開発
- 4.1 開発順序
- API仕様の記述
- E2Eテストフレームワークの検討と実装
- テストコードの作成と機能の実装
- リファクタリングとカバレッジの確認
- Pull Requestのレビュー
- 4.2 不具合の修正順序
- 再現テストの作成と実装の修正
- リファクタリングとカバレッジの確認
- 4.3 既存のエンドポイントの修正と新たなエンドポイントの追加
- 4.4 API仕様のエンドポイントを呼び出すE2Eテストの利点
- 4.5 まとめ
第5章 E2Eテストフレームワークの構築
- 5.1 テストフレームワークの基本的な考え方
- 本番環境と同じバイナリ
- カバレッジの取得
- 5.2 マイクロサービス構成でのテストフレームワーク
- 書きたいテスト
- E2Eテストフレームワークのプロセス
- 依存サービスが外部サービスの場合の解決方法
- エラーのテストは簡単
- 5.3 非マイクロサービス構成でのテストフレームワーク
- 5.4 E2Eテストフレームワークの骨格
- Test Suiteプロセスの骨格
- テスト対象マイクロサービスの骨格
- フェイクマイクロサービスの骨格
- テストコードの骨格
- そのほかの考慮項目
- 5.5 まとめ
第6章 API仕様の技術的負債の返済
- 6.1 APIの技術的負債とは
- E2Eテストフレームワークの構築が重要
- ソフトウェアエンジニアとしても重要
- ソフトウェア開発組織としての強い目標
- 6.2 API仕様の負債の返済
- 既存のエンドポイントを修正するケース
- 新たなエンドポイントを追加するケース
- 既存のエンドポイントの不具合を修正するケース
- 6.3 返済順序のまとめ
- 6.4 E2Eテストのもう1つの利点:リファクタリング
- 6.5 E2Eテストと単体テスト
- E2Eテストは必須
- テストデータの準備
- データの準備でつまずく
- 6.6 API仕様ファースト開発が定着した組織
- 6.7 まとめ
第7章 Go言語によるE2Eテストフレームワークの実装
- 7.1 E2Eテストの基本的な流れ
- Test Suiteプロセスの流れ
- 7.2 courierライブラリの構成とインストール
- インストールと動作確認
- 7.3 サンプルサービスの構成と定義
- サンプルサービスの構成
- Shopサービスの.protoファイル
- .protoファイルのコンパイル
- サンプルサービスで実現したいテスト
- 7.4 E2Eテストコードの例
- InvalidArgumentエラーのテストコード
- newShopClient()関数の実装
- テストの実行
- 7.5 E2Eテストフレームワークの流れ
- フェイクサービスの実行
- テスト対象サービスの起動
- テスト対象サービスの準備待ち
- テストの実行
- テスト対象サービスの終了
- 7.6 フェイクサービスの構築
- フェイクサービスの自動生成
- 自動生成されたフェイクサービスのコード
- 7.7 テスト実行までの流れとテストコードの実装
- TestMain関数
- テスト対象サービスが依存する環境変数
- テスト対象サービスの呼び出しとテストの実行
- Makefile
- テスト関数の実行
- テスト終了の通知
- カバレッジの表示
- 7.8 テストの並列化サポート
- TIDの伝搬
- 7.9 ほかのテスト関数の例
- DeadlineExceededエラー/Canceledエラー
- 正常ケース
- SetListProductInventoriesResponseCreator
- 7.10 テスト関数に合格するサーバ実装
- 7.11 外部サービスのフェイクサービス
- Google PubSubのPublisherサービス
- REST APIのサービス
- 7.12 E2Eテストでのデータの準備
- エンドポイント経由でのデータ準備の利点
- 7.13 ステージング環境や本番環境に対するE2Eテスト
- 7.14 まとめ
付録A Goのテストの並列化
- 複数パッケージのテストを並列に実行する
- t.Parallel()メソッド
- 並列化での注意点
- まとめ
付録B 長時間夜間ランニングテスト
- 過去の経験
- 長時間ランニングテスト
- まとめ
付録C 防御的プログラミング
- 防御的プログラミングとは
- 防御的プログラミングとAPI仕様