game-qa
Playwrightを使用したブラウザゲームのQAテストスキルで、ビジュアルリグレッション、ゲームプレイ検証、パフォーマンス、アクセシビリティのテストに対応します。ゲームテストの作成・実行、テスト失敗のデバッグ、QAインフラの構築時に使用してください。これはリファレンススキルです。ユーザー向けコマンドにはqa-gameを使用してください。
description の原文を見る
Game QA testing with Playwright — visual regression, gameplay verification, performance, and accessibility for browser games. Use when writing or running game tests, debugging test failures, or building QA infrastructure. This is the reference skill — use qa-game for the user-facing command.
SKILL.md 本文
Playwrightを使用したゲームQA
あなたはブラウザゲームのQAエンジニアの専門家です。Playwrightを使用して、ビジュアルの正確性、ゲームプレイの動作、パフォーマンス、アクセシビリティを検証する自動テストを作成します。
パフォーマンスに関する注意
- 各ステップに時間をかけてください。速度よりも品質が重要です。
- 検証ステップをスキップしないでください。早期に問題を発見します。
- 変更を加える前に、各ファイルの完全なコンテキストを読んでください。
- ページの読み込みだけでなく、ゲームプレイを検証するテストを書いてください。
リファレンスファイル
詳細なリファレンスについては、このディレクトリの関連ファイルを参照してください:
test-patterns.md— カスタムフィクスチャコード、ブートテスト、ゲームプレイ検証テスト、スコアテストgameplay-invariants.md— 7つのコアゲームプレイ不変パターン(スコア、死亡、ボタン、render_game_to_text、デザイン意図、エンティティ監査、ミュート)visual-regression.md— スクリーンショット比較テスト、動的要素のマスキング、パフォーマンス/FPSテスト、アクセシビリティテスト、確定的テストパターンclock-control.md— Playwright Clock APIパターン(フレーム精度テスト用)playwright-mcp.md— MCPサーバーセットアップ、MCPとスクリプトテストの使い分け、検査フローiterate-client.md— スタンドアロンiterateクライアント使用法、アクションJSON形式、出力解釈mobile-tests.md— モバイル入力シミュレーションとレスポンシブレイアウトテストパターン
テックスタック
- テストランナー: Playwright Test (
@playwright/test) - ビジュアルリグレッション: Playwrightビルトイン
toHaveScreenshot() - アクセシビリティ:
@axe-core/playwright - ビルドツール統合:
webServerconfig経由のVite開発サーバー - 言語: JavaScript ESモジュール
プロジェクトセットアップ
ゲームプロジェクトにPlaywrightを追加する場合:
npm install -D @playwright/test @axe-core/playwright
npx playwright install chromium
package.json scriptsに追加:
{
"scripts": {
"test": "npx playwright test",
"test:ui": "npx playwright test --ui",
"test:headed": "npx playwright test --headed",
"test:update-snapshots": "npx playwright test --update-snapshots"
}
}
必須ディレクトリ構造
tests/
├── e2e/
│ ├── game.spec.js # コアゲームテスト(ブート、シーン、入力、スコア)
│ ├── visual.spec.js # ビジュアルリグレッションスクリーンショット
│ └── perf.spec.js # パフォーマンスとFPSテスト
├── fixtures/
│ ├── game-test.js # ゲームヘルパーを持つカスタムテストフィクスチャ
│ └── screenshot.css # ビジュアルテスト用に動的要素をマスクするCSS
├── helpers/
│ └── seed-random.js # 確定的なゲーム動作のための種付きPRNG
playwright.config.js
Playwrightコンフィグ
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
reporter: [['html', { open: 'never' }], ['list']],
use: {
baseURL: 'http://localhost:3000',
trace: 'on-first-retry',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
expect: {
toHaveScreenshot: {
maxDiffPixels: 200,
threshold: 0.3,
},
},
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },
],
webServer: {
command: 'npm run dev',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI,
timeout: 30000,
},
});
重要なポイント:
webServerはテスト前にViteを自動起動しますreuseExistingServerはローカルで実行中の開発サーバーを再利用しますbaseURLはvite.config.jsで設定されたViteポートと一致します- スクリーンショット許容度は寛容です(ゲームはマイナーなレンダリング変動があります)
テスト可能性要件
Playwrightがゲーム状態を検査するには、ゲームが main.js の window にこれらのグローバルを公開する必要があります:
1. コアグローバル(必須)
// Playwright QA用に公開
window.__GAME__ = game;
window.__GAME_STATE__ = gameState;
window.__EVENT_BUS__ = eventBus;
window.__EVENTS__ = Events;
2. render_game_to_text()(必須)
現在のゲーム状態の簡潔なJSON文字列を返します。AIエージェントがピクセルを解釈せずにゲームについて推論できるようにします。座標系、ゲームモード、スコア、プレイヤー状態を含める必要があります。
window.render_game_to_text = () => {
if (!game || !gameState) return JSON.stringify({ error: 'not_ready' });
const activeScenes = game.scene.getScenes(true).map(s => s.scene.key);
const payload = {
coords: 'origin:top-left x:right y:down', // 座標系
mode: gameState.gameOver ? 'game_over' : 'playing',
scene: activeScenes[0] || null,
score: gameState.score,
bestScore: gameState.bestScore,
};
// ゲームプレイ中にプレイヤー情報を追加
const gameScene = game.scene.getScene('GameScene');
if (gameState.started && gameScene?.player?.sprite) {
const s = gameScene.player.sprite;
const body = s.body;
payload.player = {
x: Math.round(s.x), y: Math.round(s.y),
vx: Math.round(body.velocity.x), vy: Math.round(body.velocity.y),
onGround: body.blocked.down,
};
}
// エンティティを追加する際に拡張:
// payload.entities = obstacles.map(o => ({ x: o.x, y: o.y, type: o.type }));
return JSON.stringify(payload);
};
render_game_to_text() のガイドライン:
- ペイロードを簡潔に保ってください — 現在、目に見える、インタラクティブな要素のみ
- 座標系メモ(原点と軸の方向)を含めてください
- プレイヤーの位置/速度、アクティブな障害物/敵、収集アイテム、タイマー、スコア、モードフラグを含めてください
- 大きな履歴は避けてください。現在関連性のあるものだけを含めてください
- iterateクライアントとAIエージェントはこれを使用して、スクリーンショットなしでゲーム動作を検証します
3. advanceTime(ms)(必須)
テストスクリプトがゲームを正確な期間だけ進める必要があります。ゲームループはRAFを経由して通常実行されます。これは実時間の経過を待機します。
window.advanceTime = (ms) => {
return new Promise((resolve) => {
const start = performance.now();
function step() {
if (performance.now() - start >= ms) return resolve();
requestAnimationFrame(step);
}
requestAnimationFrame(step);
});
};
@playwright/test でのフレーム精度制御については、page.clock.install() + page.clock.runFor() を推奨します。advanceTime フックは主にスタンドアロンiterateクライアント (scripts/iterate-client.js) で使用されます。
Three.jsゲームの場合、Game オーケストレータインスタンスを同様に公開してください。
カスタムフィクスチャコード、ブートテスト、ゲームプレイ検証テスト、スコアテストについては test-patterns.md を参照してください。
7つのコアゲームプレイ不変パターン(スコア、死亡、ボタン、render_game_to_text、デザイン意図、エンティティ監査、ミュート)については gameplay-invariants.md を参照してください。
ゲームにQAを追加する場合
- Playwrightをインストール:
npm install -D @playwright/test @axe-core/playwright && npx playwright install chromium - ゲームの開発サーバーポートで
playwright.config.jsを作成 main.jsでwindow.__GAME__、window.__GAME_STATE__、window.__EVENT_BUS__を公開tests/fixtures/game-test.jsにgamePageフィクスチャを持つカスタムテストを作成tests/helpers/seed-random.jsで確定的な動作のためのヘルパーを作成tests/e2e/にテストを作成:game.spec.js— ブート、シーンフロー、入力、スコア、ゲームオーバーvisual.spec.js— 各シーンのスクリーンショットリグレッションperf.spec.js— 読み込み時間、FPSバジェット
- npmスクリプトを追加:
test、test:ui、test:headed、test:update-snapshots - 初期ベースラインを生成:
npm run test:update-snapshots
自動テストしないこと
- アニメーション化されたオブジェクトの正確なピクセル位置(クロック制御がなければ非確定的)
- アクティブなゲームプレイスクリーンショット — 移動するオブジェクトが安定したスクリーンショットを不可能にします。代わりにMCPを使用してください
- オーディオ再生(Playwrightはオーディオ検査ができません。evaluate経由でオーディオオブジェクトが存在することをテスト)
- 外部APIコール(モックされていない場合、例えばPlay.fun SDK —
page.route()でモック) - 主観的なビジュアル品質 — MCPを使用して「これは良く見えますか?」評価に使用
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- opusgamelabs
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/opusgamelabs/game-creator / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。