qe-test-automation-strategy について
テスト自動化の設計や改善に取り組む人向けのスキルです。テストピラミッド、F.I.R.S.T. 原則、設計パターン、CI/CD 統合に加え、不安定なテストの管理方法も扱います。
主な機能
- 01テストピラミッドに沿った層の計画
- 02F.I.R.S.T. 原則の適用
- 03Page Object Model などのパターン活用
- 04CI/CD との統合
- 05不安定なテストの分離と管理
活用シーン
- 01新しいテスト自動化フレームワークの設計
- 02テストスイートの実行時間短縮
- 03不安定なテストの影響軽減
- 04CI/CD のテストフィードバック改善
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ proffesor-for-testing/ agentic-qe --skill qe-test-automation-strategyインストール後、Claude Code で/qe-test-automation-strategyを入力して読み込まれたか確認します。
詳細
テスト自動化戦略
<default_to_action> テスト自動化を設計または改善するときは、次のことを行います。
- テストピラミッドに従います:70%をユニットテスト、20%を統合テスト、10%をE2Eテストにします
- F.I.R.S.T.の原則を適用します:Fast(高速)、Isolated(独立)、Repeatable(再現可能)、Self-validating(自己検証可能)、Timely(適時)
- パターンを使用します:ページオブジェクトモデル、ビルダーパターン、ファクトリーパターン
- CI/CDに統合します:すべてのコミットでテストを実行し、早期に失敗させ、明確なフィードバックを返します
- 不安定なテストを管理します:隔離して修正するか、削除します。決して無視しません
よくあるアンチパターンをすばやく検出する方法:
- アイスクリームコーン型(E2Eテストが多く、ユニットテストが少ない)→ ピラミッド型に反転します
- 遅いテスト(スイートの実行に10分超)→ 並列化し、外部依存をモックします
- 不安定なテスト → タイミングを修正し、データを分離するか、隔離します
- テストの重複 → フィクスチャを共有し、ページオブジェクトを使用します
- 壊れやすいセレクター → data-testidやセマンティックロケーターを使用します
成功に欠かせない要素:
- 迅速なフィードバックを目指します(全スイートで10分未満)
- 自動化はテストを支援するものであり、判断に取って代わるものではありません
- テストインフラストラクチャにも、本番コードと同じように投資します </default_to_action>
クイックリファレンスカード
使用する場面
- 新しい自動化フレームワークを構築するとき
- 既存のテスト効率を改善するとき
- 不安定なテストの負担を軽減するとき
- CI/CDパイプラインの速度を最適化するとき
テストピラミッド
| 層 | 割合 | 速度 | 分離性 | 例 |
|---|---|---|---|---|
| ユニット | 70% | < 1ms | 完全 | 純粋関数、ロジック |
| 統合 | 20% | < 1s | 部分的 | API、データベース |
| E2E | 10% | < 30s | なし | ユーザージャーニー |
F.I.R.S.T.の原則
| 原則 | 意味 | 方法 |
|---|---|---|
| Fast | すばやく実行 | 外部依存をモックします |
| Isolated | 共有状態がない | テストごとに新しいフィクスチャを使います |
| Repeatable | 毎回同じ結果 | ランダムデータを使いません |
| Self-validating | 合否が明確 | 出力ではなくアサーションを使います |
| Timely | コードと同時に作成 | 後回しにせず、TDDを行います |
アンチパターン
| 問題 | 症状 | 解決策 |
|---|---|---|
| アイスクリームコーン型 | E2Eテストが80%、ユニットテストが10% | ピラミッド型に反転します |
| 遅いスイート | CIに30分以上かかる | 並列化し、不要なテストを削減します |
| 不安定なテスト | 失敗がランダムに発生 | 隔離し、タイミングを修正します |
| 結合したテスト | 実行順序に依存 | データを分離します |
| 壊れやすいセレクター | CSSの変更で壊れる | data-testidを使用します |
ページオブジェクトモデル
// pages/LoginPage.js
class LoginPage {
constructor(page) {
this.page = page;
this.emailInput = '[data-testid="email"]';
this.passwordInput = '[data-testid="password"]';
this.submitButton = '[data-testid="submit"]';
this.errorMessage = '[data-testid="error"]';
}
async login(email, password) {
await this.page.fill(this.emailInput, email);
await this.page.fill(this.passwordInput, password);
await this.page.click(this.submitButton);
}
async getError() {
return this.page.textContent(this.errorMessage);
}
}
// Test uses page object
test('shows error for invalid credentials', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.login('[email protected]', 'wrong');
expect(await loginPage.getError()).toBe('Invalid credentials');
});
CI/CD統合
name: Test Pipeline
on: [push, pull_request]
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run test:unit -- --coverage
timeout-minutes: 5
- uses: codecov/codecov-action@v3
integration-tests:
needs: unit-tests
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15
steps:
- run: npm run test:integration
timeout-minutes: 10
e2e-tests:
needs: integration-tests
runs-on: ubuntu-latest
steps:
- run: npx playwright test
timeout-minutes: 15
不安定なテストの管理
// Quarantine flaky tests
describe.skip('Quarantined - INC-123', () => {
test('flaky test awaiting fix', () => { /* ... */ });
});
// Agent-assisted stabilization
await Task("Fix Flaky Tests", {
tests: quarantinedTests,
analysis: ['timing-issues', 'data-isolation', 'race-conditions'],
strategies: ['add-waits', 'isolate-fixtures', 'mock-externals']
}, "qe-flaky-test-hunter");
エージェント支援による自動化
// Generate tests following pyramid
await Task("Generate Test Suite", {
sourceCode: 'src/',
pyramid: { unit: 70, integration: 20, e2e: 10 },
patterns: ['page-object', 'builder', 'factory'],
framework: 'jest'
}, "qe-test-generator");
// Optimize test execution
await Task("Optimize Suite", {
algorithm: 'johnson-lindenstrauss',
targetReduction: 0.3,
maintainCoverage: 0.95
}, "qe-regression-risk-analyzer");
// Analyze flaky patterns
await Task("Flaky Analysis", {
testHistory: 'last-30-days',
detectPatterns: ['timing', 'data', 'environment'],
recommend: 'stabilization-strategy'
}, "qe-flaky-test-hunter");
エージェント連携のヒント
メモリ名前空間
aqe/automation/
├── test-pyramid/* - Coverage by layer
├── page-objects/* - Shared page objects
├── flaky-registry/* - Quarantined tests
└── execution-metrics/* - Suite performance data
フリート連携
const automationFleet = await FleetManager.coordinate({
strategy: 'test-automation',
agents: [
'qe-test-generator', // Generate pyramid-compliant tests
'qe-test-executor', // Parallel execution
'qe-coverage-analyzer', // Coverage gaps
'qe-flaky-test-hunter', // Flaky detection
'qe-regression-risk-analyzer' // Smart selection
],
topology: 'hierarchical'
});
関連スキル
- tdd-london-chicago - ユニットテスト向けTDD
- api-testing-patterns - 統合パターン
- cicd-pipeline-qe-orchestrator - パイプライン統合
- shift-left-testing - 早期の自動化
覚えておくこと
ピラミッド:ユニットテスト70%、統合テスト20%、E2Eテスト10%。 すべてのテストでF.I.R.S.T.の原則に従います。E2Eテストにはページオブジェクトモデルを使用します。速度を上げるために並列化します。不安定なテストは無視せず、隔離します。テストコードは本番コードと同じように扱います。
エージェントを活用する場合: エージェントは、ピラミッドに準拠したテストを生成し、不安定なパターンを検出し、実行時間を最適化して、テストインフラストラクチャを保守します。自動化の品質を高めるためにエージェントを活用します。
コメント
Markdown 対応