AWSサービスを活用した視覚的回帰テストツールの実装

# AWSサービスを活用した視覚的回帰テストツールの実装

## はじめに

Webサイトのリニューアルや機能追加において、既存ページの見た目に意図しない変更が発生していないかを確認する作業は、品質保証の観点から極めて重要です。しかし、数百から数千のページを持つ大規模なWebサイトにおいて、これらを手動で目視確認することは現実的ではありません。

このような課題を解決するために、視覚的回帰テスト（Visual Regression Testing）という手法が注目されています。これは、Webページのスクリーンショットを自動的に取得し、リニューアル前後の画像を比較することで、視覚的な差分を検出する技術です。

本記事では、AWSの各種サービスを組み合わせて構築した視覚的回帰テストツールについて、その設計思想から実装アプローチ、運用方法まで詳しく解説します。このツールは、Playwright、OpenCV、AWS ECS、AWS Lambdaなどの技術を活用し、スケーラブルで高精度な視覚的回帰テストを実現しています。

## ツールの機能要件

本ツールは、以下の機能要件を満たすよう設計されています。

### 基本機能

- **自動スクリーンショット取得**: 指定されたURLリストに基づいて、Webページのスクリーンショットを自動取得
- **高精度画像比較**: OpenCVを使用したピクセルレベルでの差分検出と、差分パーセンテージの算出
- **視覚的レポート生成**: 差分箇所をハイライトした画像と、詳細な分析結果を含むHTMLレポートの生成
- **複数システム対応**: 異なるWebシステムを並行してテスト可能な設計

### 運用面での要件

- **スケーラビリティ**: 数百から数千のURLを効率的に処理できる並列実行機能
- **柔軟な実行モード**: 参照画像の取得（キャプチャモード）と比較テスト（比較モード）の切り替え
- **統合レポート機能**: 複数回のテスト結果をマージしたサマリーレポートの生成
- **クラウドネイティブ**: AWSサービスを活用したサーバーレス・コンテナベースの実行環境

### セキュリティ・品質要件

- **認証対応**: Basic認証やセッション認証が必要なページへの対応
- **エラーハンドリング**: ネットワークエラーやページ読み込みエラーに対する適切な処理
- **監査証跡**: 全ての実行ログとテスト結果の永続化
- **アクセス制御**: テスト結果へのアクセス制御とセキュアな配信

## 構成概要
本ツールの構成は以下イメージ図のようになっています。
![全体構成イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645488/0f0011e5-a512-4745-8323-40e0e7ae0e96.png)



本ツールは、AWSの複数のサービスを組み合わせたクラウドネイティブなアーキテクチャを採用しています。以下の表に、各AWSサービスの役割を示します。

| AWSサービス | 役割 | 具体的な機能 |
|------------|------|-------------|
| **Amazon ECS (Fargate)** | テスト実行エンジン | ・Dockerコンテナでの視覚的回帰テスト実行<br>・Playwrightによるスクリーンショット取得<br>・OpenCVによる画像比較処理<br>・並列実行によるスケーラビリティ確保 |
| **AWS Lambda** | サマリーレポート生成 | ・複数のテスト結果の収集・解析<br>・HTMLパーサーによるデータ抽出<br>・統合レポートの生成<br>・定期実行スケジューリング |
| **Amazon S3** | データストレージ | ・テスト結果（画像・HTMLレポート）の永続化<br>・設定ファイル（URLリスト）の保存<br>・静的Webサイトホスティング<br>・ライフサイクル管理による自動アーカイブ |
| **Amazon CloudFront** | コンテンツ配信 | ・レポートの高速配信<br>・アクセス制御とセキュリティ<br>・キャッシュによるパフォーマンス向上<br>・カスタムドメインでのアクセス提供 |
| **Amazon CloudWatch** | 監視・ログ管理 | ・ECSタスクとLambda関数の実行ログ収集<br>・メトリクス監視とアラート<br>・EventBridgeによるスケジュール実行<br>・ログの長期保存と検索 |
| **AWS IAM** | アクセス制御 | ・各サービス間の権限管理<br>・最小権限の原則に基づいたロール設計<br>・クロスアカウントアクセスの制御<br>・セキュリティポリシーの実装 |

このアーキテクチャにより、高い可用性とスケーラビリティを持ちながら、運用コストを最適化したテスト環境を実現しています。

## 技術的な特徴・アーキテクチャ設計

### システム全体構成

本ツールは、3つの主要機能を組み合わせることで、包括的な視覚的回帰テストソリューションを提供しています。

#### ①視覚回帰テストを行う機能：Amazon ECS (Fargate)により実現

**アーキテクチャの特徴**

Amazon ECS (Fargate)を基盤とした視覚回帰テスト実行エンジンは、以下の構成要素から成り立っています：

- **コンテナ化されたテスト環境**: DockerコンテナにPlaywright、OpenCV、Pythonランタイムを含む完全な実行環境をパッケージ化
- **動的リソース割り当て**: テスト規模に応じてCPUとメモリリソースを動的に調整
- **並列処理機構**: 複数のタスクを同時実行することで、大量のURLを効率的に処理

**処理フロー**

1. **初期化フェーズ**: S3から設定ファイル（URLリスト）を取得し、実行パラメータを設定
2. **スクリーンショット取得フェーズ**: Playwrightブラウザエンジンを使用して、指定されたURLのスクリーンショットを取得
3. **画像比較フェーズ**: OpenCVライブラリを使用して、参照画像とテスト画像の差分を検出
4. **レポート生成フェーズ**: 差分結果を基に、HTMLレポートと差分画像を生成
5. **結果保存フェーズ**: 生成されたレポートと画像をS3に保存

**スケーラビリティの実現**

- **水平スケーリング**: 処理対象URL数に応じて、複数のECSタスクを並列実行
- **リソース最適化**: URLの特性（ページサイズ、読み込み時間等）に応じたリソース割り当て
- **エラー隔離**: 個別URLの処理エラーが全体の実行に影響しない設計

#### ②複数回のテスト結果をまとめて1つのレポートとして出力する機能：AWS Lambdaにより実現

**アーキテクチャの特徴**

AWS Lambdaを基盤としたサマリーレポート生成機能は、サーバーレスアーキテクチャの利点を活用しています：

- **イベント駆動実行**: CloudWatch Eventsによる定期実行、または手動トリガーによる実行
- **軽量な処理エンジン**: HTMLパーシングとデータ集約に特化した軽量な処理
- **コスト効率**: 実行時のみの課金により、運用コストを最小化

**処理フロー**

1. **データ収集フェーズ**: S3から指定期間内の複数のテスト結果を収集
2. **データ解析フェーズ**: BeautifulSoup4を使用してHTMLレポートからテスト結果データを抽出
3. **データ統合フェーズ**: 同一URLの複数回テスト結果をマージし、最新結果を優先
4. **統計計算フェーズ**: 全体の合格率、差分分布、傾向分析等の統計情報を算出
5. **レポート生成フェーズ**: Jinja2テンプレートエンジンを使用してサマリーHTMLレポートを生成
6. **配信準備フェーズ**: 生成されたサマリーレポートをS3に配置し、CloudFront経由でアクセス可能に設定

**データ処理の最適化**

- **増分処理**: 前回実行以降の新しいテスト結果のみを処理対象とする効率的な更新
- **メモリ管理**: 大量のテスト結果を扱う際のメモリ使用量の最適化
- **タイムアウト対策**: 処理時間が長い場合の適切な分割処理

#### ③レポートをWebブラウザから閲覧する機能：Amazon CloudFront及びAmazon S3により実現

**アーキテクチャの特徴**

Amazon S3とAmazon CloudFrontを組み合わせたレポート配信基盤は、以下の特徴を持ちます：

- **静的Webサイトホスティング**: S3の静的Webサイト機能を活用したレポートの配信
- **グローバル配信**: CloudFrontのエッジロケーションを活用した高速なコンテンツ配信
- **セキュリティ統合**: WAFとの統合によるアクセス制御とセキュリティ強化

**配信アーキテクチャ**

1. **ストレージ層（S3）**:
   - HTMLレポート、画像ファイル、CSS/JavaScriptファイルの保存
   - バージョニング機能による履歴管理
   - ライフサイクルポリシーによる自動アーカイブ

2. **配信層（CloudFront）**:
   - エッジキャッシュによる高速配信
   - カスタムドメインでのアクセス提供
   - HTTPS通信の強制
  
### システム間連携

3つの主要機能は、以下のように連携してエンドツーエンドの視覚的回帰テストワークフローを実現します：

**データフロー**

1. **ECS → S3**: テスト実行結果（HTMLレポート、画像）の保存
2. **S3 → Lambda**: 保存されたレポートの読み込みと解析
3. **Lambda → S3**: 生成されたサマリーレポートの保存
4. **S3 → CloudFront**: レポートの配信準備
5. **CloudFront → ユーザー**: Webブラウザでのレポート閲覧

**イベント連携**

- **S3イベント**: 新しいテスト結果の保存をトリガーとしたLambda関数の自動実行
- **CloudWatchイベント**: 定期的なサマリーレポート生成のスケジューリング
- **SNS通知**: テスト完了やエラー発生時の関係者への通知

この統合されたアーキテクチャにより、個別のテスト実行から結果の可視化まで、一貫したワークフローを自動化できます。

## ツールの使い方

### 基本的な実行フロー

#### 1. 事前準備

**URLリストの格納**
テスト対象となるURLを記載したテキストファイルをS3バケットに格納します。

#### 2. 実行モードの選択

ECSタスクのタスク定義において以下2つのいずれのモードを実行するか環境変数で設定します。

**キャプチャモード**
リニューアル前のサイトから基準となるスクリーンショットを取得するモードです。このモードでは、指定されたURLリストの各ページのスクリーンショットを取得し、将来の比較テストで使用する参照画像として保存します。

**比較モード**
参照サイトとテストサイトを比較するモードです。このモードでは、両方のサイトからスクリーンショットを取得し、画像比較を実行して差分レポートを生成します。

#### 3. テスト実行

ECSタスクとして実行されるコンテナが、以下の処理を順次実行します：

1. **設定読み込み**: S3からURLリストと設定パラメータを取得
2. **スクリーンショット取得**: Playwrightを使用してWebページの画像を取得
3. **画像比較**: OpenCVによる高度な差分検出処理
4. **レポート生成**: HTMLレポートと差分画像の生成
5. **結果保存**: S3への実行結果のアップロード

### 複数システムの並行実行

本ツールは、複数のWebシステムを同時にテストする機能を提供しています。各システムごとに独立した設定を行うことで、以下のメリットを実現できます：

- **並行処理**: 複数システムのテストを同時実行し、全体の実行時間を短縮
- **独立性**: システムごとに異なる設定（閾値、URLリスト等）を適用
- **結果分離**: システムごとに独立したレポートを生成し、混在を防止

### サマリーレポートの活用

Lambda関数により生成されるサマリーレポートは、以下の価値を提供します：

- **全体把握**: 複数回のテスト実行結果を統合し、全体的な傾向を把握
- **差分分析**: 差分パーセンテージの分布を円グラフで視覚化
- **効率的な確認**: 検索・フィルタリング機能により、問題のあるページを迅速に特定

サマリレポートサンプル：
![サマリレポートサンプル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645488/2fb1a21e-967b-4606-a615-d88297dd54d4.png)


## 実装時の注意点・ベストプラクティス

### 差分閾値の設定指針

差分検出の精度を最適化するため、コンテンツの特性に応じた閾値設定が重要です。

| コンテンツタイプ | 推奨閾値 | 理由 |
|----------------|----------|------|
| 静的コンテンツページ | 1-2% | レイアウト崩れを確実に検出 |
| 動的コンテンツ含有ページ | 3-5% | 広告やタイムスタンプの変動を考慮 |
| ECサイト商品ページ | 5-8% | 在庫状況や価格変動を考慮 |
| ニュースサイト | 8-10% | 頻繁なコンテンツ更新を考慮 |

### URLリストの効果的な選定方法

テスト効果を最大化するため、以下の観点でURLを選定することを推奨します：

**高優先度（必須テスト対象）**
- トップページ
- 主要なランディングページ
- コンバージョンに直結するページ
- 法的に重要なページ

**中優先度（推奨テスト対象）**
- カテゴリページ
- 検索結果ページ
- ユーザーマイページ

**低優先度（リソースに余裕がある場合）**
- 個別の商品・記事ページ
- アーカイブページ
- エラーページ

### パフォーマンス最適化のポイント

#### バッチサイズの最適化

ECSタスクのリソース設定（CPU・メモリ）に応じて、適切なバッチサイズを設定することで、処理効率を最大化できます。一般的には、CPU 1024単位あたり5URL程度が目安となります。

#### ネットワーク最適化

- **リクエスト間隔**: サーバー負荷を考慮し、1-2秒の間隔を設定
- **タイムアウト設定**: ページの特性に応じて15-30秒のタイムアウトを設定
- **リトライ機構**: 一時的なネットワークエラーに対する適切なリトライ処理


#### 実際のコスト例
以下はあくまで参考ですが、継続的にこのツールを利用した場合のコストは以下程度となる試算です。

月間1000URL、週1回実行の場合の概算コスト：
- ECS Fargate: $15-$25/月
- Lambda: $2-$5/月  
- S3・CloudFront: $5-$10/月
- **合計: $22-$40/月**

### セキュリティ考慮事項

#### アクセス制御の実装

**IAMロールの最小権限設定**
各サービスに必要最小限の権限のみを付与し、セキュリティリスクを最小化します。

**レポートアクセスの制御**
CloudFrontとWAFを組み合わせることで、IP制限やBasic認証などの多層的なアクセス制御を実装できます。

#### 機密情報の保護

- **認証情報**: AWS Systems Manager Parameter Storeでの安全な管理
- **ネットワーク**: VPC内でのプライベート通信
- **暗号化**: S3での保存時暗号化とCloudFrontでの転送時暗号化
- **監査**: CloudTrailによる全API呼び出しの記録

## 商用製品と比較した本ツールのメリット

### 機能面での比較

| 比較項目 | 本ツール | 商用製品 |
|----------|----------|--------------------------------|
| **初期導入コスト** | AWS利用料のみ | 月額数万円以上 |
| **スケーラビリティ** | AWS基盤による無制限スケーリング | プランによる制限あり |
| **カスタマイズ性** | 完全なソースコード制御 | GUIでカスタマイズ可だがソースコードでの制御と比較して制約あり |
| **データ保持** | 自社AWS環境内で完全制御 | ベンダー環境での保存 |
| **セキュリティ** | 企業セキュリティポリシーに完全準拠 | ベンダーのセキュリティに依存 |

### 技術的優位性

#### 1. 高度な画像比較アルゴリズム

商用製品の多くが単純なピクセル比較を採用している中、本ツールでは以下の高度な技術を実装しています：

- **ノイズ除去**: ガウシアンブラーによる前処理
- **モルフォロジー処理**: 孤立ノイズの除去と差分領域の強調
- **適応的閾値**: コンテンツ特性に応じた柔軟な閾値設定
- **差分可視化**: 重要な差分のみを赤色でハイライト

※この点については生成AIに助けてもらうことで短時間に実装できました。

#### 2. 柔軟なアーキテクチャ

本ツールは拡張可能な設計を採用しており、将来的な機能追加や技術変更に柔軟に対応できます。比較アルゴリズムの変更、新しい認証方式の追加、AI機能の統合など、ビジネス要件の変化に応じた拡張が容易です。

#### 3. 企業レベルのセキュリティ

- **データ保護**: 全データが自社AWS環境内に保存されます
- **暗号化**: 保存時・転送時の両方で暗号化されています
- **アクセス監査**: CloudTrailにより監査証跡を取得しています
- **レポートの閲覧制限**: IP制限やWAF等各種制限によりレポート閲覧できる関係者を限定可能です

### 運用面でのメリット

#### 1. コスト効率性

有償製品の場合に月額で3~5万円程度必要と仮定すると半額以下で利用できることが期待されます。

特にWebシステムの移行PJにおいて一時的にテストツールが必要となった場合など、素早く導入してすぐに使い終わる、という時にコスト効率を最大限高めたい、という時に効果を発揮すると考えています。

#### 2. 運用の自動化

CI/CDパイプラインとの統合により、以下の自動化が可能です：

- **自動実行**: コードデプロイ時の自動テスト実行
- **結果通知**: Slackやメールでの結果通知
- **品質ゲート**: 差分が閾値を超えた場合のデプロイ停止

#### 3. 組織への適合性

- **既存インフラとの統合**: 既存のAWS環境との完全な統合
- **セキュリティポリシーへの準拠**: 企業のセキュリティ要件への完全な適合
- **スキル活用**: 既存のAWS運用スキルの活用
- **ベンダーロックイン回避**: オープンソース技術による自由度の確保

### 長期的な価値

#### 1. 技術的負債の回避

商用製品では、ベンダーの技術的判断に依存するリスクがありますが、本ツールでは：

- **技術選択の自由**: 新しい技術への移行が容易
- **機能拡張の柔軟性**: ビジネス要件に応じた機能追加
- **バージョン管理**: 自社のリリーススケジュールに合わせた更新

#### 2. データ活用の可能性

蓄積されたテスト結果データを活用することで、以下の高度な分析が可能になります：

- **品質予測**: 過去のデータに基づく品質リスクの予測
- **最適化指針**: テスト対象の優先度付けと効率化
- **開発プロセス改善**: 回帰が発生しやすい箇所の特定と対策

## まとめ

本記事では、AWSサービスを活用した視覚的回帰テストツールの設計から実装、運用まで包括的に解説しました。このツールは、企業レベルでの視覚的回帰テストに求められる要件を満たす特徴を持っています。

AWSの各種サービスを活用することでスケーリングと高い費用対効果を実現し、Webシステムの移行PJにおけるテストの効率を高めることが可能です。
また、ベンダーロックインを回避することにより必要に応じて新たな機能追加を容易に行うことが可能です。
例えば今回私が担当したPJでは主に静的コンテンツを中心としたサイトであったため、単純な画像比較をメインの機能としましたが、会員サイト等動的コンテンツが中心となる場合にはシナリオに基づいた比較ができるような機能を盛り込むことも可能です。
そういった点で各PJにおいて”必要十分”な機能を盛り込むことができるというのがAWSサービス群を用いてテストツールを実装するメリットであるといえます。

視覚的回帰テストの導入により、人的ミスによる見落としの削減と一貫した品質基準の維持による品質向上、手動テストの大幅な削減による開発リソースの最適化、確実な品質保証による安心したリリース実行、そして高品質なWebサイトによる顧客満足度の向上という価値を組織にもたらすことができます。本ツールが、読者の皆様の開発プロセス改善と品質向上に貢献し、より良いWebサービスの提供に寄与できれば幸いです。

## 参考資料

- [Playwright Documentation](https://playwright.dev/docs/intro)
- [OpenCV Python Documentation](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html)
- [AWS ECS Developer Guide](https://docs.aws.amazon.com/ecs/)
- [AWS Lambda Developer Guide](https://docs.aws.amazon.com/lambda/)
- [Visual Regression Testing Best Practices](https://www.browserstack.com/guide/visual-regression-testing)
- [Container-based CI/CD with AWS](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/)
- [AWS Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/)
- [AWS Cost Optimization Best Practices](https://aws.amazon.com/aws-cost-management/aws-cost-optimization/)