操作
バグ #229
未完了[Task6] 統合テストとマイグレーション実行
ステータス:
新規
優先度:
高め
担当者:
-
開始日:
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 からの移行完了
- パフォーマンス基準達成
- ドキュメント整備完了
表示するデータがありません
操作