writing-codeceptjs-tests について
ライブブラウザーでの探索を通じて CodeceptJS 4 のテストを作成するスキルです。開発者が CodeceptJS MCP サーバーでロケーターと手順を検証してからテストを確定できるよう案内します。
主な機能
- 01段階的作成と骨組み先行のモード
- 02ブラウザーでのライブページ探索
- 03ページ要素に基づくロケーター検証
- 04ページオブジェクトとカスタムステップの再利用
- 05aiTrace を有効にした最終テスト実行
活用シーン
- 01既知のユーザーフローのテスト拡張
- 02未知のフローを調べてからテストを作成
- 03ライブページでセレクターと手順を検証
MCP 対応
ワークフローでは CodeceptJS MCP サーバーを使い、`run_test` と `run_code` でテスト実行やブラウザー操作を行います。クライアントから接続するための設定要件も説明します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ codeceptjs/ skills --skill writing-codeceptjs-testsインストール後、Claude Code で/writing-codeceptjs-testsを入力して読み込まれたか確認します。
詳細
CodeceptJS 4 のテスト作成
作成中に一度も実行されなかったテストは信頼できません。CodeceptJS MCP サーバーを介して実際のブラウザーを操作し、すべてのロケーターを実際のページで検証して、成功したステップだけをコミットしてください。
フローをどの程度把握しているかに応じて、2 つのモードから選びます。
- モード A — 段階的な
run_code:1 回の呼び出しにつきI.*の行を 1~2 行送り、応答を読み取って繰り返します。既存のテストの拡張、既知のフロー、手動プランの移植に適しています。 - モード B — スキャフォールドして一時停止(新規作成/未知のフローに推奨):
I.amOnPage('/...'); pause();を含むスタブの Scenario を作成し、MCP のrun_testで実行します。ブラウザーが開き、pause()で制御が戻ります。run_codeを使って実際のページを操作し、その後pause()を検証済みのシーケンスに置き換えます。
どちらも、同じ探索/ロケーター/コミットの手順を共有します。異なるのは、進行中の探索をどこで行うかです。
ワークフロー
- まずは基礎を確認 —
codeceptjs-fundamentalsを実行します。必要なものは、有効な Web ヘルパー、ベース URL、プラグイン(aiTrace、auth)、AI プロバイダー、ページオブジェクト、環境変数です。 - 既存のものを把握 —
check/list/dry-run(fundamentals § Discover を参照)を実行します。重複を検出し、予定しているフローをすでにカバーするカスタムステップやページオブジェクトのメソッドがないことを確認します。- ⚠
dry-runではプラグインが初期化されません。Before(({ login }) => login('admin'))は、実行時には動作しても、dry-run では「login is not a function」エラーになります。--stepsで形状を確認し、プラグインの注入エラーは無視します。認証は実際に実行して確認してください。
- ⚠
- 認証 — ログインが必要な経路では、
codeceptjs-authスキルを呼び出します。既存のロールが設定済みの場合は、Before(({ login }) => login())を使います。未設定の場合は、認証スキルの手順に沿って追加します。公開経路の場合はスキップします。 - 類似するテストとページオブジェクト — 該当する機能領域の Scenario、
include配下の PO、アクターファイルのカスタムステップ、データファクトリーを確認します。PO のメソッドにこの領域のロケーターがすでに定義されている場合は、生のI.clickの連鎖ではなく、そのメソッドを使って操作します。 - 開始ページ — 認証後の実在する URL を使い、推測で指定しないでください。不明な場合はユーザーに確認します。相対 URL のみを指定します。ホストは設定(
helpers.Playwright.urlなど)にあります。 - aiTrace と MCP の接続設定:
- MCP 経由の場合:
aiTraceは MCP サーバーによって強制的に有効化されるため、設定は不要です。 - CLI 実行の場合:自動では有効化されません。設定で宣言するか、
-p aiTraceを渡してください。有効化しないと、手順 11 で実行分析に必要なoutput/trace_*/アーティファクトが生成されません。 - デフォルトではヘッドレスで実行します(
CI=1をエクスポートしてsetHeadlessWhen(CI)を使うか、show: falseを指定します)。 - MCP クライアントが
node_modules/codeceptjs/bin/mcp-server.jsを参照し、CODECEPTJS_CONFIGとCODECEPTJS_PROJECT_DIRが設定されていることを確認します。
- MCP 経由の場合:
- ライブセッションを開始(モードを選択):
- モード A:
run_codeでひな形を実行します。必要に応じてlogin(<role>)を呼び出し、その後I.amOnPage(<start URL>)を実行します。返された情報(URL、ARIA スナップショット、スクリーンショット、コンソール)が、以降のすべての作業の根拠になります。 - モード B:テストファイルに最小限ながら実際に動作する下書きを記述します。
MCP のBefore(({ login }) => login('admin')) // if needed Scenario('draft - feature exploration', ({ I }) => { I.amOnPage('/dashboard') pause() })run_testから実行すると、{ status: 'paused', pausedAfter, page, suggestions }が返されます。これで、テスト自体のI/ブラウザーをrun_codeから操作できる状態になります。
- モード A:
- ページを調査 —
codeceptjs-explorationに引き継ぎます。まず ARIA スナップショットを使い、次に必要であれば HTML に切り替えます。候補を列挙して区別し、run_codeでロケーターが要素 1 つだけに一致することを確認してから確定します。モード B では、これは一時停止中に行います。 - Scenario を作成 — スクラッチパッドで
run_codeを使い、一度に 1~2 個のコマンドを実行します。各実行後に、URL/ARIA が想定どおり変化したか、新たなコンソールエラーがないか、取得した値が想定と一致するかを確認します。- ステップが失敗した場合は、別のロケーターを試す、具体的な
waitFor*を追加する、またはフローを見直します。 - 本当に判断が難しい場合(Save ボタンが 2 つある、空の状態が不明確、機能フラグの可能性があるなど)は、作業を止めてユーザーに確認します。
- Cookie バナーなどの任意の UI 要素には、
ifではなくawait tryTo(...)(fundamentals § Effects)を使います。Scenario を直線的に保てます。
- ステップが失敗した場合は、別のロケーターを試す、具体的な
- 検証済みの手順を確定:
- 既存の命名規則に合わせ、ファイルごとに
Featureを 1 つだけ記述します。 - 適切な場合はページオブジェクトのメソッド/カスタムステップを使い、セレクターを重複させないようにします。
- すべてのロケーターを読みやすい形式に置き換えます(優先順位は以下を参照)。確定コードでの厳密な
{ css }/{ xpath }の使用は、他に適切な方法がない場合を除き、レビュー上の警告サインです。 - 認証情報には環境変数のみを使い、
secret(...)でラップします。 - モード B:
pause()の行を一連の手順に置き換え、draft - ...を実際の目的を表す名前に変更します。
- 既存の命名規則に合わせ、ファイルごとに
- 最終確認:aiTrace を有効にして
npx codeceptjs run --grep '<scenario>' --stepsを実行し、出力をcodeceptjs-run-analysisに渡して、output/trace_*/でフローが問題なく実行されたことを確認します。そこで成功した場合にのみ完了です。
ロケーターの優先順位(作成時)
常にコンテキストを渡してください。理由については codeceptjs-fundamentals § ロケーターを参照してください。優先度の高い順です。
- セマンティック文字列 — 表示テキスト、ラベル、プレースホルダー、
name、aria-label:I.click('Save', '.toolbar') - ARIA ロール — コンテキスト内でテキストが曖昧な場合(「Delete」のリンクとボタンの両方がある場合)、またはロールがアサーションの一部である場合:
I.click({ role: 'button', name: 'Sign In' }, '#login-form') customLocatorを使った$name— アプリがdata-testid/data-qaを広範に提供している場合locate()ビルダー — 構造条件を指定する場合。構造に関する条件は、多くの場合コンテキスト側に含められます:I.click('Edit', locate('tr').withText('Acme Corp'))- 厳密な
{ id }/{ name }/{ css }— 上記の方法を使い尽くした場合の最終手段 { xpath }— ビルダーで表現できない軸やテキスト述語を使う場合
基礎ルールに加え、作成時に適用される具体的なルール:
- 通常の文字列はすでに
aria-labelに一致します。'aria-label=Save'や{ css: '[aria-label="Save"]' }は決して記述しないでください。 - 安定したコンテキストを優先してください。ランドマーク(
nav、main、{ role: 'dialog' })、アプリシェルのコンテナー(.sidebar、.modal)、データで識別される行やカードを使います。 I.see/I.dontSeeにはコンテキストが必要です — 最初の引数はページ全体から照合される通常のテキストです。スコープを指定しないと、ナビゲーションやフッターの内容で誤ってパスすることがあります。- 複数の要素に一致する場合は、
step.opts({ elementIndex: N })(1始まり、負の値、'first'/'last')またはstep.opts({ exact: true })を使います。codeceptjs/stepsからstepをインポートしてください。
作成中の待機
- 自動待機はインタラクションをカバーします。MCP ステップの間に、ライブ HTML/ARIA からゲート要素(スピナーのオーバーレイ、フェッチ後のレンダリング)を検出し、安定したセレクターと具体的な
waitFor*を選んでください。 I.wait(N)は 作成中 に、タイミングに関する仮説を確認する目的で使用してもかまいません。スリープを入れるとステップがパスするなら、原因はタイミングです。コミットする前に、具体的なwaitFor*に置き換えてください。
避けるべきこと
- 想像上のロケーターやルートを使ってテストを書くこと。すべてライブページから取得してください。
- セマンティックな方法/ARIA/
locate()が適している場面で、厳密なロケーターを使うこと。 - 短いロケーターとコンテキストを使わず、スコープを指定しない長いロケーターを使うこと。
- アクセシブル名を明示したり、呼び出し箇所ごとに
[data-testid=...]を繰り返したりすること。 - ハードコードされた認証情報をどこかに記述すること。
- 類似テスト/ページオブジェクトの調査を省略すること。
- 通常のアクションステップに
awaitを使うこと(基礎ルールの await 規則)。また、自動待機を確認する前にwaitFor*を推測で使うこと。 - コミットするテストに
I.wait(N)やpause()を残すこと。 - 実際に未知のフローに Mode A を使うこと。Mode B より遅く、状態を失いやすくなります。
- エンドツーエンドの aiTrace 実行をせずに完了とすること。
関連スキル
codeceptjs-fundamentals— ルール、効果、調査(最初に実行)codeceptjs-exploration— ページの調査、WebElement APIcodeceptjs-auth— ログイン/セッションの再利用codeceptjs-run-analysis— トレースの検証debugging-codeceptjs-tests— コミットしたテストが正常に動作しない場合
コメント
Markdown 対応