T-CREATOR

Playwright MCP でクロスリージョン同時テストを実現する

Playwright MCP でクロスリージョン同時テストを実現する

グローバルな Web サービスを運営する際、各リージョンでのユーザー体験を一貫して提供することは極めて重要です。しかし、従来のテスト手法では単一リージョンでのテストが主流で、リージョン固有の問題を事前に検出することが困難でした。

そこで注目されているのが、**Playwright MCP(Model Context Protocol)**を活用したクロスリージョン同時テストです。この新しいアプローチにより、複数のリージョンで並行してテストを実行し、グローバルサービスの品質を大幅に向上させることができるようになりました。

背景

グローバルサービスにおけるテスト課題

現代の Web アプリケーションは、世界中のユーザーにサービスを提供するため、複数のリージョンにデプロイされることが一般的です。特に Next.js アプリケーションを Vercel や AWS で運用する場合、各リージョンでのパフォーマンスやネットワーク特性が大きく異なります。

従来のテスト手法では、以下のような課題がありました:

#課題影響
1リージョン間の遅延差異ユーザー体験の不一致
2CDN 配信の挙動差静的コンテンツの表示問題
3データベース同期遅延データ整合性の問題
4地域固有の規制対応コンプライアンス違反リスク

MCP プロトコルと Playwright の組み合わせメリット

**MCP(Model Context Protocol)**は、AI ツールとアプリケーション間の標準化されたプロトコルです。Playwright と MCP を組み合わせることで、テストシナリオの動的生成や結果の分析が可能になります。

この組み合わせにより、以下のメリットが得られます:

  • インテリジェントなテスト実行:リージョン特性に応じたテスト戦略の自動調整
  • リアルタイム分析:テスト結果の即座な分析と改善提案
  • 効率的なリソース管理:必要な時に必要なリージョンでのテスト実行

課題

単一リージョンでのテスト限界

従来の Playwright テストは、単一のリージョンまたはローカル環境で実行されることが多く、以下のような限界がありました:

typescript// 従来の単一リージョンテスト例
import { test, expect } from '@playwright/test';

test('シンプルなページテスト', async ({ page }) => {
  await page.goto('https://example.com');
  await expect(page.locator('h1')).toBeVisible();
  // ローカル環境でのみ実行され、グローバルな問題を検出できない
});

このアプローチでは、実際のユーザーが体験するネットワーク条件やリージョン固有の問題を再現できませんでした。

ネットワーク遅延やリージョン固有問題の検出不足

特に深刻な問題は、以下のようなエラーが本番環境でしか発見されないことでした:

bash# よく発生するリージョン固有のエラー例
TimeoutError: Timeout 30000ms exceeded.
  Call log:
    navigating to "https://api.example.com/data",
    waiting for load state "networkidle"

Error: ERR_NETWORK_CHANGED
  at navigate (playwright-core/lib/page.js:89:31)

Error: ERR_INTERNET_DISCONNECTED
  The internet connection has been lost.

これらのエラーは、特定のリージョンのネットワーク特性や接続品質に依存するため、単一環境でのテストでは検出困難でした。

解決策

MCP Server を活用した分散テスト設計

MCP Server を活用することで、複数のリージョンでのテスト実行を効率的に管理できます。以下は、基本的な MCP サーバーの実装例です:

typescript// src/mcp-server/playwright-mcp-server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

interface RegionConfig {
  name: string;
  endpoint: string;
  timezone: string;
}

class PlaywrightMCPServer {
  private server: Server;
  private regions: RegionConfig[] = [
    {
      name: 'us-east-1',
      endpoint: 'https://us-api.example.com',
      timezone: 'America/New_York',
    },
    {
      name: 'eu-west-1',
      endpoint: 'https://eu-api.example.com',
      timezone: 'Europe/London',
    },
    {
      name: 'ap-southeast-1',
      endpoint: 'https://asia-api.example.com',
      timezone: 'Asia/Singapore',
    },
  ];

  constructor() {
    this.server = new Server(
      {
        name: 'playwright-cross-region-tester',
        version: '1.0.0',
      },
      {
        capabilities: {
          tools: {},
        },
      }
    );

    this.setupTools();
  }

  private setupTools() {
    // リージョン別テスト実行ツールの設定
    this.server.setRequestHandler(
      ListToolsRequestSchema,
      async () => ({
        tools: [
          {
            name: 'run_cross_region_test',
            description:
              '複数リージョンで並行してPlaywrightテストを実行',
            inputSchema: {
              type: 'object',
              properties: {
                testSuite: { type: 'string' },
                regions: {
                  type: 'array',
                  items: { type: 'string' },
                },
              },
            },
          },
        ],
      })
    );
  }
}

この MCP サーバーは、複数のリージョンでのテスト実行を統一的に管理し、結果を集約して分析します。

TypeScript での Playwright MCP クライアント実装

次に、MCP クライアントを実装してテストの実行制御を行います:

typescript// src/test-runner/cross-region-client.ts
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import { PlaywrightTestConfig } from '@playwright/test';

export class CrossRegionTestClient {
  private client: Client;
  private config: PlaywrightTestConfig;

  constructor(config: PlaywrightTestConfig) {
    this.config = config;
    this.client = new Client(
      {
        name: 'cross-region-test-client',
        version: '1.0.0',
      },
      {
        capabilities: {},
      }
    );
  }

  async connectToMCPServer() {
    const transport = new StdioClientTransport({
      command: 'node',
      args: ['dist/mcp-server/playwright-mcp-server.js'],
    });

    await this.client.connect(transport);
    console.log('✅ MCP Server に接続しました');
  }

  async runCrossRegionTests(
    testSuite: string,
    regions: string[]
  ) {
    try {
      const result = await this.client.request({
        method: 'tools/call',
        params: {
          name: 'run_cross_region_test',
          arguments: { testSuite, regions },
        },
      });

      return this.parseTestResults(result);
    } catch (error) {
      console.error(
        '❌ クロスリージョンテスト実行エラー:',
        error
      );
      throw error;
    }
  }

  private parseTestResults(rawResults: any) {
    // テスト結果の解析とレポート生成
    return {
      summary: rawResults.summary,
      regionResults: rawResults.regions,
      performanceMetrics: rawResults.metrics,
    };
  }
}

具体例

Docker 環境でのマルチリージョンテスト構築

実際の Docker 環境でのセットアップでは、各リージョンをシミュレートするコンテナを構築します:

dockerfile# Dockerfile.multi-region
FROM mcr.microsoft.com/playwright:v1.40.0-focal

# 各リージョンの設定
ARG REGION=us-east-1
ARG TIMEZONE=America/New_York
ARG API_ENDPOINT=https://us-api.example.com

ENV REGION=${REGION}
ENV TZ=${TIMEZONE}
ENV API_ENDPOINT=${API_ENDPOINT}

WORKDIR /app

# Yarnを使用した依存関係のインストール
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile

COPY . .

# リージョン固有の設定ファイルをコピー
COPY config/regions/${REGION}.json ./playwright.config.ts

# テスト実行
CMD ["yarn", "test:cross-region"]

Docker Compose を使用して複数リージョンのテスト環境を同時に起動します:

yaml# docker-compose.cross-region.yml
version: '3.8'

services:
  mcp-server:
    build:
      context: .
      dockerfile: Dockerfile.mcp-server
    ports:
      - '3001:3001'
    environment:
      - NODE_ENV=production

  test-us-east:
    build:
      context: .
      dockerfile: Dockerfile.multi-region
      args:
        REGION: us-east-1
        TIMEZONE: America/New_York
        API_ENDPOINT: https://us-api.example.com
    depends_on:
      - mcp-server
    environment:
      - MCP_SERVER_URL=http://mcp-server:3001

  test-eu-west:
    build:
      context: .
      dockerfile: Dockerfile.multi-region
      args:
        REGION: eu-west-1
        TIMEZONE: Europe/London
        API_ENDPOINT: https://eu-api.example.com
    depends_on:
      - mcp-server
    environment:
      - MCP_SERVER_URL=http://mcp-server:3001

  test-ap-southeast:
    build:
      context: .
      dockerfile: Dockerfile.multi-region
      args:
        REGION: ap-southeast-1
        TIMEZONE: Asia/Singapore
        API_ENDPOINT: https://asia-api.example.com
    depends_on:
      - mcp-server
    environment:
      - MCP_SERVER_URL=http://mcp-server:3001

Yarn を使ったテスト環境のセットアップ

Yarn ワークスペースを活用して、効率的なテスト環境を構築します:

json// package.json
{
  "name": "playwright-cross-region-testing",
  "version": "1.0.0",
  "workspaces": ["packages/*"],
  "scripts": {
    "install:all": "yarn install",
    "build": "yarn workspaces run build",
    "test:cross-region": "yarn workspace @app/test-runner cross-region",
    "test:single-region": "yarn workspace @app/test-runner single",
    "mcp:server": "yarn workspace @app/mcp-server start",
    "docker:up": "docker-compose -f docker-compose.cross-region.yml up -d",
    "docker:test": "docker-compose -f docker-compose.cross-region.yml up --abort-on-container-exit"
  },
  "devDependencies": {
    "@playwright/test": "^1.40.0",
    "@modelcontextprotocol/sdk": "^0.4.0",
    "@types/node": "^20.10.0",
    "typescript": "^5.3.0"
  }
}

テストランナーパッケージの設定:

json// packages/test-runner/package.json
{
  "name": "@app/test-runner",
  "version": "1.0.0",
  "scripts": {
    "cross-region": "npx playwright test --config=playwright.cross-region.config.ts",
    "single": "npx playwright test",
    "report": "npx playwright show-report"
  },
  "dependencies": {
    "@app/mcp-server": "workspace:*",
    "@playwright/test": "^1.40.0"
  }
}

実際のクロスリージョンテストの実装例:

typescript// packages/test-runner/tests/cross-region.spec.ts
import { test, expect } from '@playwright/test';
import { CrossRegionTestClient } from '../src/cross-region-client';

test.describe('クロスリージョン同時テスト', () => {
  let client: CrossRegionTestClient;

  test.beforeAll(async () => {
    client = new CrossRegionTestClient({
      testDir: './tests',
      timeout: 60000,
      retries: 2,
    });

    await client.connectToMCPServer();
  });

  test('全リージョンでのホームページ表示テスト', async () => {
    const regions = [
      'us-east-1',
      'eu-west-1',
      'ap-southeast-1',
    ];

    const results = await client.runCrossRegionTests(
      'homepage',
      regions
    );

    // 各リージョンでの成功を確認
    expect(results.summary.passed).toBeGreaterThanOrEqual(
      regions.length
    );

    // パフォーマンスメトリクスの確認
    for (const region of regions) {
      const regionResult = results.regionResults[region];
      expect(regionResult.loadTime).toBeLessThan(3000); // 3秒以内
      expect(regionResult.errorRate).toBeLessThan(0.01); // エラー率1%未満
    }
  });

  test('API呼び出しの地域別レスポンス時間テスト', async () => {
    const regions = ['us-east-1', 'eu-west-1'];

    const results = await client.runCrossRegionTests(
      'api-performance',
      regions
    );

    // リージョン間のレスポンス時間差を確認
    const usTime =
      results.regionResults['us-east-1'].apiResponseTime;
    const euTime =
      results.regionResults['eu-west-1'].apiResponseTime;

    expect(Math.abs(usTime - euTime)).toBeLessThan(1000); // 1秒以内の差
  });
});

この実装により、以下のようなエラーも適切に捕捉できるようになります:

bash# リージョン固有のエラーの例
[eu-west-1] ❌ Test failed: ERR_NETWORK_CHANGED
  Expected response time < 2000ms, got 4500ms
  GDPR compliance check failed

[us-east-1] ✅ Test passed: 1200ms response time
  All performance metrics within acceptable range

[ap-southeast-1] ⚠️  Test warning: Slow image loading
  CDN cache miss detected for static assets
  Response time: 2800ms (acceptable but suboptimal)

まとめ

分散テストの効果と今後の展望

Playwright MCP を活用したクロスリージョン同時テストにより、以下の効果を実現できました:

即座に得られる効果:

  • リージョン固有の問題の早期発見
  • ユーザー体験の一貫性向上
  • テスト実行時間の大幅短縮(並行実行により)

長期的なメリット:

  • グローバルサービスの信頼性向上
  • デプロイメント後の問題発生率の減少
  • 運用コストの削減

今後の展望として、AI を活用したより高度な分析機能や、自動的なテストケース生成、リアルタイムでのパフォーマンス最適化提案などが期待されます。MCP プロトコルの標準化により、さまざまなツールとの連携も容易になり、より包括的なテスト環境の構築が可能になるでしょう。

特に Next.js アプリケーションのような現代的な Web アプリケーションでは、このようなクロスリージョンテストが品質向上の重要な要素となります。Docker、Kubernetes、そして Yarn を活用した効率的な開発・テスト環境により、グローバルスケールでのサービス提供がより安全で確実なものになります。

関連リンク