debugging-codeceptjs-tests について
debugging-codeceptjs-testsは、CodeceptJS 4のテスト失敗を調査するスキルです。開発者やAIエージェントが問題を再現し、トレースとブラウザー状態を調べ、編集前に修正案を試して再実行で確認する手順を示します。MCPツールがあればその利用を優先します。
主な機能
- 01最小構成のテストで失敗を再現
- 02MCPで実行中のブラウザー状態を確認
- 03トレースと保存済みページスナップショットを調査
- 04編集前に修正案を検証
- 05認証、待機、ヘルパーの問題を診断
活用シーン
- 01失敗したCodeceptJSテストの調査
- 02一時停止中のブラウザーテストセッションの確認
- 03保存済みスナップショットから安定したロケーターを特定
- 04CIとローカル実行の差異を調査
MCP 対応
AIエージェント向けにMCPを優先する手順を説明し、run_test、run_code、snapshot、run_step_by_stepなどで実行中のテストセッションを操作・確認します。代替手段としてCLIコマンドも示します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ codeceptjs/ skills --skill debugging-codeceptjs-testsインストール後、Claude Code で/debugging-codeceptjs-testsを入力して読み込まれたか確認します。
詳細
CodeceptJS 4 テストのデバッグ
失敗の原因は誤解を招くことがあります。エラーはたいてい、それ以前の何か(認証の期限切れ、フレームの切り替え漏れ、ネットワークリクエストの保留など)による副作用として発生したステップを指しています。再現し、状態を取得して確認してから、修正します。
方法
- MCP 優先(AI エージェント向け):
run_test/テスト内のpause()を使うと、テストが使用するのと同じI/ブラウザーで、エージェントに制御が渡されます。run_code/snapshotで調査し、run_step_by_step+continueでステップごとに実行します。 - CLI による代替手段(人間/CI/フレームワーク内部向け):
--debug→--verbose→DEBUG="codeceptjs:*"の順に試します。DEBUG の切り札を使うのは、レコーダーのハング、プラグインの競合、イベントの漏れ、「ステップが実行されない」など、フレームワーク内部に原因があると疑われる場合のみです。名前空間:codeceptjs:recorder、codeceptjs:pause、codeceptjs:ai、codeceptjs:plugin:<name>。
pause() は操作する側に応じて動作を切り替えます。TTY では readline REPL を起動し、MCP ではエージェントに制御を渡し、TTY でも MCP でもないサブプロセスでは通知を出力して処理を完了します(CI のデッドロックを防ぎます)。
ワークフロー
-
基本事項 —
codeceptjs-fundamentalsを実行します。ヘルパー、プラグイン(aiTrace、screenshot、pageInfo、retryFailedStep、pause、auth)、環境変数、MCP の利用可否を確認します。aiTraceが宣言されていない場合は、plugins: { aiTrace: { enabled: true } }を一度だけ追加します。このスキルの大半は、その出力を活用します。- 一度だけ宣言し、トリガーを変更するために設定を編集しないでください。
-p aiTrace:on=step|fail|test|file|urlで実行ごとに上書きします(fundamentals § Plugins from CLI)。簡潔な CI 再現にはon=fail、診断中はon=stepを使います。設定のon:を切り替えると、リポジトリに不要な変更が発生し、ほかの実行にも影響します。
- 一度だけ宣言し、トリガーを変更するために設定を編集しないでください。
-
最小限の手順で再現する:
npx codeceptjs run --grep '<scenario>' --stepsを実行します。CI 固有の場合は-c codecept.ci.conf.jsを追加します。計測を始める前に、再現できることを確認します。 -
ツールを選ぶ:
- MCP
run_test <test>— プロセス内で実行します。レポーターの結果、または{ status: 'paused', pausedAfter, page, suggestions }を返します。 - MCP
run_step_by_step+continue— 各ステップの後で一時停止します。フロー全体を確認する場合に使います。 - MCP
run_code— ライブセッションで任意のコードを実行します。新規セッションでも一時停止中でも動作し、生成された値、コンソール出力、最終状態のスナップショットを返します。 - MCP
snapshot— 操作を行わずに現在のブラウザー状態を取得します(URL、Cookie、ストレージ、HTML、ARIA、スクリーンショット、コンソール)。 - MCP
list_actions—I.*メソッドが存在するか確認します。 - CLI
npx codeceptjs run --grep '<scenario>' --debug— MCP を使わない場合の最初の手段です。--verboseを追加すると、プロミスキュー、リトライ、タイムアウトのログも表示されます。
- MCP
-
ブレークポイント:
- テスト内の
pause()— すでに編集している場合や、within/ループ/フックの中で停止する場合に最適です。 run_testのpauseAt: N— テストを編集せずに、N 番目のリーフステップの後で一時停止します。- N の特定方法:
npx codeceptjs dry-run --debug --grep '<scenario>' --numbers --no-ansiを実行します(テストごとに 1 から採番され、停止する行の番号です)。 - 一時停止中:
run_codeで調査し、snapshotでクリーンな状態を取得します。output/trace_<TestName>_<hash>/trace.mdで前のステップを確認し、continueで再開します。
- テスト内の
-
トレースを読む —
codeceptjs-run-analysisに引き継ぎ、最初の失敗ステップに注目します。後の失敗は、先に見逃された問題の副作用であることがほとんどです。このスキルでは、大きな HTML の grep、複数のトレースにまたがるエラーの分類、再実行の比較についても扱います。 -
仮説を立てる:
症状 考えられる原因 要素が見つからず、ページが /login認証:セッションキャッシュが古い、環境変数がない 要素は HTML にあるが display: nonewaitForElementではなくwaitForVisibleを使うロケーターが 2 件以上に一致する(strict モード) 範囲を指定します:context 引数、次に ARIA ロール、次に step.opts({ elementIndex })スクリーンショット N+1 では要素があり、N ではない アニメーション/遅延読み込み → waitForVisible(loc, t)console.jsonに 401/403API トークンの期限切れ、または環境変数がない ステップは成功するが、次の I.seeが失敗するフレームの切り替え漏れ → within({ frame })CI とローカルで結果が異なる setHeadlessWhen(CI)、ビューポート、タイミング、環境変数レコーダーが停止し、ステップが実行されない DEBUG="codeceptjs:recorder"プラグインが正しく動作しない DEBUG="codeceptjs:plugin:<name>" -
ライブページで修正を検証する — ファイルを編集する前に、候補の置き換えステップを
run_codeで試します(一時停止中に、同じIを使って動作します)。TTY を使う場合も、テスト内のpause()で同じことができます。 -
修正して再実行する:編集後、
npx codeceptjs run --grep '<scenario>' --stepsを実行します。codeceptjs-run-analysisで確認し、失敗箇所が別のステップに移っていないことを確かめます。修正でwaitFor*またはstep.optsを追加する場合は、1 行のWhy:コメントを残してください。こうしたコメントは残しておく価値があります。
codeceptq でクエリトレースの HTML を調べる
aiTrace は、ステップごとの <NNNN>_<step>_page.html スナップショットを出力します(1 行に 1 要素で、行番号は要素と 1 対 1 で対応します)。codeceptq は、保存済みスナップショットに対して CodeceptJS のロケーターを解決します。
- ページ HTML を手動でコンテキストに読み込まないでください。スナップショットは数千行に及びますが、
codeceptqは一致した要素とその行番号だけを返します。 run_codeで適用する前に、候補のロケーターをオフラインでテストしてください。一致すれば実環境で試す目安になりますが、保証ではありません(表示状態、再レンダリングなど)。- 複数一致した場合は、より壊れやすい XPath を書かず、
codeceptqが出力した順序に従ってstep.opts({ elementIndex })で区別してください。
npx codeceptq '#submit-btn' --file output/trace_*/0007_*_page.html # CSS
npx codeceptq 'Email' --field --file output/trace_*/0003_*_page.html # semantic field
npx codeceptq 'Save' '.modal' --click --file output/trace_*/0005_*_page.html # scoped clickable
npx codeceptq 'Username' --field --json --file ... # machine-readable
主なフラグ:--field/--click/--checkable/--select はセマンティックな方法を強制します。--xpath/--css は自動判定を上書きします(select.foo のようなタグ名だけの指定は、あいまいなテキストとして扱われます)。終了コードは、一致が 0、なしが 1、入力が無効な場合が 2 です。
⚠ 2 番目の位置引数
[context]ではスコープを指定できません(CodeceptJS 4.1.0)。N matches within '<ctx>'と表示されますが、返されるのはページ全体の結果です。lib/command/query.jsはコンテキストノードに対して絶対 XPath(//…)を評価し、//fooはドキュメントを起点にし直すためです。要素を含まないコンテナー内の一致も報告されます。オフラインでスコープ付きロケーターを確認するには、セレクターを 1 つにまとめて(codeceptq '.modal button[aria-label="Save"]')、スコープなしの形式と一致件数を比較してください。コンテキストに依存するロケーターを本当に検証できるのは、ステップを実行した場合だけです。
さらに詳しく調べる
トレースで失敗した内容は分かっても、ページの状態をさらに詳しく知る必要がある場合(「このボタンは実際に無効になっているか?」「Save ボタンは本当に 2 つあるか?」)は、codeceptjs-exploration に引き継いでください。デバッグ時に役立つ方法は次のとおりです。
- ボタンは描画されているのにクリックが効かない →
grabWebElement('Submit')+isEnabled()+getBoundingBox()(無効になっているか? 画面外にあるか?) - Strict モードで複数一致 → exploration の、広い XPath を反復して一致を絞り込むパターン
- Iframe のコンテンツ → 失敗するステップを
within({ frame })で囲む
調査には usePlaywrightTo/useWebDriverTo よりもこちらを優先してください。ヘルパー間で同じコードが使え、定型コードも少なくなります。
ネイティブヘルパーでの回避策
I.* の機能では本当に対応できない場合(ネットワークのインターセプト、ストレージの操作、ヘルパー専用 API)に限り、次を使ってください。
- Playwright:
I.usePlaywrightTo('label', async ({ browser, browserContext, page }) => { ... }) - Puppeteer:
I.usePuppeteerTo('label', async ({ page }) => { ... }) - WebDriver:
I.useWebDriverTo('label', async ({ browser }) => { ... })
ラベルはステップの出力とトレースに表示されます。MCP の run_code 内でも動作します。これらを使うとテストが特定のヘルパーに依存するため、最終手段としてください。
ヘルパーの注意点
- Playwright:
strict: trueは複数一致時にエラーをスローします。'networkidle'より'load'/'domcontentloaded'を優先してください。trace: 'on'→output/trace.zip(npx playwright show-trace) - Puppeteer:長時間ポーリングするページでは
'networkidle0'が停止するため、'networkidle2'または'domcontentloaded'を使ってください - WebDriver:
smartWaitが対象とするのはアクションのみで、アサーションは対象外です。executeScriptの引数は JSON でシリアライズ可能である必要があります
認証関連の失敗
テスト中に /login へリダイレクトされたり、コンソールに 401/403 が表示されたりする場合は、失敗したステップではなく認証を修正してください。プラグインの check、認証情報の環境変数、output/<role>_session.json にある古いキャッシュ済みセッションを確認してください(削除すると再ログインが強制されます)。全体的なパターンについては codeceptjs-auth を参照してください。
不安定な動作と待機
「断続的な」失敗の多くは、待機の見落としが原因です。汎用的な遅延を追加するのではなく、トレース HTML/ARIA を使って実際に処理を妨げている要素を特定してください(基本事項 § Waiting に対応関係があります)。デバッグ中の I.wait(N) はタイミングに関する仮説の確認には使えますが、コミット前に具体的な waitFor* に置き換えてください。
避けること
- トレースを読まずに、エラーメッセージだけを見て修正すること。
run_codeで修正を検証する前にテストを編集すること。pause()の呼び出しをコミットすること。デバッグ専用です。- 実際のゲーティング要素を特定せず、むやみに
waitFor*を使うこと。 - コミットするテストに
I.wait(N)を残すこと。 - 実行のたびに設定ファイルの
aiTraceのon:を編集すること。一度だけ宣言し、実行ごとに上書きしてください。 - 設定の確認を省略すること。
setHeadlessWhen(CI)や環境変数による URL 設定が、「ローカルでは動くのに CI では失敗する」問題の原因であることは少なくありません。 - 原因を修正せず、
retriesで失敗を隠すこと。
関連スキル
codeceptjs-fundamentals— 効果、CLI からのプラグイン、待機ルールcodeceptjs-exploration— WebElement の検査、広範な XPath の曖昧さの解消codeceptjs-run-analysis— trace.md の読み進め方、エラーの分類、再実行の比較codeceptjs-auth— 認証失敗のパターン