はじめに
こんにちは!
以前、BashでE2Eテスト的なことを試みた話を書いたのですが、今回はその続編(というか応用編)になります!
前回の記事はこちら👇
👉 BashでE2Eテストっぽいことをやってみた話
今回の舞台:APIのまとめテストプロジェクト
某プロジェクト群(仮に「Aプロジェクト群」と呼びます)では、複数のAPI群が開発されています。
それらのAPIエンドポイントの疎通チェックや構成確認を手軽に行えるよう、
とある Bash + JSON + Redis で構成されたテストユーティリティが作られていました。
今回はそのユーティリティ(以下、API Test Shell)について紹介します!
目指したゴール
- ローカル環境で、Redisキャッシュを考慮しながらAPIのレスポンス検証ができる
- JSONファイルからテスト対象を切り替えられる(stg/prdなど)
- CI/CDに載せなくても1コマンドで一通りの確認が済む
- フロントエンドの疎通確認もAPIと一緒に実行し、サービス全体の整合性をチェック
つまり、「雑に壊れてないかをサッと見たい」ときにめちゃくちゃ便利なやつです。
ディレクトリ構成(ざっくり)
api-test/
├── config/
│ └── service-a/
│ ├── stg.json
│ └── prd.json
├── redis/
│ └── prepare_redis_cache.sh
├── helpers/
│ ├── api/
│ ├── front/
│ └── common.sh
├── execute.sh
└── Makefile
-
config/
配下の JSON に、対象サービス・環境ごとのエンドポイント一覧が記載されています -
redis/prepare_redis_cache.sh
は内部的にキャッシュの操作を担います(ユーザーが直接叩くことは想定されていません) -
execute.sh
がメインのテストランナーで、API・フロント・Redisの一連のテストフローを一括実行します -
Makefile
を使えばmake run
などで楽に操作できます
Redisも考慮してる!?
このツールの特徴は、ただのAPI疎通確認ではない点です。
テストの各ステップでRedisキャッシュを細かく制御していることがポイント!
具体的には、
- 各APIエンドポイントやフロントエンドのURLに対してアクセスする前に、関連するRedisキーのバックアップを実施
- テストの実行中に変更されたRedisの状態をロールバックまたはクリアできるよう設計
- 想定外の状態が検出された場合でも、環境を壊さずに即復元可能!
この制御は全て execute.sh
内部で行われるため、開発者は ただコマンドを叩くだけ でOK🙆♀️
Makefileでのお手軽実行
実際にテストを実行する際には
make run
# → ./execute.sh service-a
とか、
テストの結果を分析するなら
make analyze
# → ./execute.sh service-a analyze
のように、複雑な構成のわりに操作感はスッキリしています。
こういうの、個人開発でも見習いたい……!
フロントエンドの疎通チェックも自動で!
APIの確認だけでなく、フロントエンド側の動作確認もAPIテストとセットで実行されます。
つまり make run
を実行すると、以下の流れが自動で進みます👇
- エンドポイント単位でRedisキーをバックアップ
- APIに対するリクエスト送信&レスポンス検証
- フロントエンドの対象URLにアクセスし、ステータスや構成をチェック
- テスト成功時:キャッシュのクリーンアップ
- テスト失敗時:キャッシュのロールバック
すべてが統一されたログフォーマットで出力されるため、ログを見て「どこで失敗したか」がすぐ分かるのも地味に嬉しいポイントです!
工夫ポイント
-
set -euo pipefail
でBashらしい堅牢性確保 - ログを
log.sh
経由で出力し、ステージごとの状況を追いやすく - Redisへのバルク操作は
--pipe
モードで高速化+並列制御(xargs -P
)なども検討
実装済みの強み
すでに以下のような実装も進んでおり、安定運用が見込める状態になっています。
- Redisクラスタ環境への対応済み
- 各ステージにおける統一的なログ出力
- Makefile経由の直感的な操作体系
- APIとフロントエンドの疎通確認をまとめて実行
- 各エンドポイント・URLごとにRedisキャッシュの自動バックアップ・ロールバックに対応!
Bashとは思えないほど整った構成で、チーム内での開発効率も向上しました!
最後に
この記事が役に立ったら、ぜひ「LGTM」してくれると嬉しいです! 💖
では、また次回の記事でお会いしましょう👋