プロジェクト

全般

プロフィール

バグ #229

未完了

[Task6] 統合テストとマイグレーション実行

Redmine Admin さんが4日前に追加.

ステータス:
新規
優先度:
高め
担当者:
-
開始日:
2025-06-04
期日:
進捗率:

0%

予定工数:

説明

Task 6: 統合テストとマイグレーション実行

概要

ニュース機能統合の最終段階として、統合テスト実行とtask.call2arm.comからの段階的マイグレーションを実施する

作業ディレクトリ

/home/ito/task2-service/

実装ファイル構成

├── tests/
│   ├── integration/
│   │   ├── api.test.js         # API統合テスト
│   │   ├── ui.test.js          # UI統合テスト
│   │   └── redmine.test.js     # Redmine統合テスト
│   ├── e2e/
│   │   └── news-flow.test.js   # E2Eテスト
│   └── fixtures/
│       └── news-data.json      # テストデータ
├── scripts/
│   ├── migration.sh           # マイグレーションスクリプト
│   ├── backup.sh              # データバックアップ
│   └── rollback.sh            # ロールバック
└── docs/
    ├── migration-plan.md      # マイグレーション計画
    └── testing-report.md      # テストレポート

実装仕様

1. API統合テスト

// tests/integration/api.test.js
const request = require('supertest');
const app = require('../../api/server');

describe('News API Integration', () => {
  test('GET /api/news - ニュース一覧取得', async () => {
    const response = await request(app)
      .get('/api/news')
      .expect(200);
    
    expect(response.body.success).toBe(true);
    expect(Array.isArray(response.body.data)).toBe(true);
  });

  test('GET /api/news/:id - ニュース詳細取得', async () => {
    const response = await request(app)
      .get('/api/news/1')
      .expect(200);
    
    expect(response.body.data).toHaveProperty('title');
    expect(response.body.data).toHaveProperty('description');
  });

  test('POST /api/news/:id/redmine - Redmineチケット作成', async () => {
    const response = await request(app)
      .post('/api/news/1/redmine')
      .expect(200);
    
    expect(response.body.data.ticket).toHaveProperty('id');
  });
});

2. UI統合テスト

// tests/integration/ui.test.js  
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom';
import NewsPage from '../../ui/src/pages/NewsPage';

describe('News UI Integration', () => {
  test('ニュース一覧表示', async () => {
    render(
      <BrowserRouter>
        <NewsPage />
      </BrowserRouter>
    );

    await waitFor(() => {
      expect(screen.getByText('ニュース一覧')).toBeInTheDocument();
    });
  });

  test('フィルター機能動作', async () => {
    render(
      <BrowserRouter>
        <NewsPage />
      </BrowserRouter>
    );

    const filterButton = screen.getByText('テクノロジー');
    fireEvent.click(filterButton);

    await waitFor(() => {
      expect(screen.getByText('テクノロジー')).toHaveClass('filter-button--active');
    });
  });
});

3. E2Eテスト

// tests/e2e/news-flow.test.js
const { chromium } = require('playwright');

describe('News Flow E2E', () => {
  let browser, page;

  beforeAll(async () => {
    browser = await chromium.launch();
    page = await browser.newPage();
  });

  test('ニュース表示→Redmineチケット作成フロー', async () => {
    // ニュースページアクセス
    await page.goto('http://localhost:3000/news');
    
    // ニュース一覧表示確認
    await page.waitForSelector('.news-card');
    
    // 最初のニュースカードクリック
    await page.click('.news-card:first-child');
    
    // Redmine統合ボタンクリック
    await page.click('text=チケットを作成');
    
    // 成功メッセージ確認
    await page.waitForSelector('text=チケット #', { timeout: 10000 });
  });

  afterAll(async () => {
    await browser.close();
  });
});

4. マイグレーションスクリプト

#!/bin/bash
# scripts/migration.sh

set -e

echo "🚀 Task2 Service ニュース機能マイグレーション開始"

# 1. 現在の環境確認
echo "📋 現在の環境確認..."
docker-compose ps

# 2. バックアップ作成
echo "💾 データバックアップ作成..."
./scripts/backup.sh

# 3. 新環境ビルド
echo "🔨 新環境ビルド..."
docker-compose down
docker-compose pull
docker-compose build --no-cache

# 4. 新環境起動
echo "🚀 新環境起動..."
docker-compose up -d

# 5. ヘルスチェック
echo "🏥 ヘルスチェック..."
sleep 30
./healthcheck.sh

# 6. 統合テスト実行
echo "🧪 統合テスト実行..."
npm run test:integration

# 7. E2Eテスト実行
echo "🎭 E2Eテスト実行..."
npm run test:e2e

# 8. Nginx設定更新 (task2.call2arm.com)
echo "🌐 Nginx設定更新..."
sudo cp task2.call2arm.com.conf /etc/nginx/sites-available/
sudo nginx -t && sudo systemctl reload nginx

echo "✅ マイグレーション完了!"
echo "🔗 https://task2.call2arm.com でアクセス確認してください"

5. データバックアップスクリプト

#!/bin/bash
# scripts/backup.sh

BACKUP_DIR="/home/ito/backups/task2-$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"

echo "📦 バックアップ作成: $BACKUP_DIR"

# Docker データボリューム
docker run --rm -v task2-service_task2_data:/data -v "$BACKUP_DIR":/backup alpine tar czf /backup/task2_data.tar.gz -C /data .

# 設定ファイル
cp -r /home/ito/task2-service "$BACKUP_DIR/source"

# Docker Compose設定
docker-compose config > "$BACKUP_DIR/docker-compose-current.yml"

echo "✅ バックアップ完了: $BACKUP_DIR"

テスト計画

Phase 1: 単体テスト (1日)

  • API単体テスト
  • React コンポーネント単体テスト
  • Redmine統合テスト

Phase 2: 統合テスト (1日)

  • API ↔ UI統合テスト
  • Redmine統合テスト
  • Docker環境テスト

Phase 3: E2Eテスト (1日)

  • ユーザーフロー完全テスト
  • パフォーマンステスト
  • セキュリティテスト

Phase 4: マイグレーション (1日)

  • 段階的マイグレーション実行
  • ダウンタイム最小化
  • ロールバック手順確認

成果物

  • 統合テストスイート実装
  • E2Eテスト実装
  • マイグレーションスクリプト
  • バックアップ・ロールバックスクリプト
  • テストレポート作成
  • マイグレーション実行

品質基準

テストカバレッジ

  • API: 90%以上
  • UI Components: 80%以上
  • 統合フロー: 100%

パフォーマンス

  • API応答時間: 500ms以下
  • UI初期表示: 2秒以下
  • Redmine統合: 3秒以下

信頼性

  • アップタイム: 99.9%以上
  • エラー率: 0.1%以下
  • ロールバック時間: 5分以内

完了条件

  • 全テスト成功 (Pass率100%)
  • マイグレーション成功
  • task2.call2arm.com 正常動作
  • task.call2arm.com からの移行完了
  • パフォーマンス基準達成
  • ドキュメント整備完了

参照: 親チケット #223, 全関連チケット #224-#228
実装目標: 4日
優先度: 高

表示するデータがありません

他の形式にエクスポート: Atom PDF