テスト: 全体テストを並列・2 分割で回し、重複した競合試験と繰り返しを減らす(#882 #884) - #891
Conversation
- 継続的統合の全体テストを -n auto で回す。release/** の push 契機を外し、同じテストの 2 重実行をやめる - 全体テストを案内するコマンドを並列の形にする(CONTRIBUTING.md・PR テンプレート・開発ガイド・確定仕様 2 件) - 臨界区間の競合試験を共通実装への 1 通り(並列 12・試行 3)へ寄せる - test_records_at_once_never_skip_a_stage の試行を 8 → 4 回、test_lock_held_passes を 4 → 3 回にする Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G5uEPdcjhFR1Aerv5JMfpP
並列にした後もジョブが 2 分 6 秒で 2 分を超えたため、#882 の段 2 を行う。 根の conftest.py が SHARD_TOTAL / SHARD_INDEX からファイルのパスの剰余で自分の分を選び、 まとめジョブ pytest が ruleset の必須の検査として 1 つの結果を返す。 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G5uEPdcjhFR1Aerv5JMfpP
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
CI の分割でテスト欠落を起こさないことを自動検証する必要があります。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | kiro | APPROVE
テスト高速化(#882 / #884)の変更を確認した。CI のシャード分割・集約ゲート・conftest のシャード選別・競合試験の集約・試行回数の削減のいずれも、根拠が揃っており修正を要する欠陥は見つからなかった。シャード分割は 245 テストファイルで排他かつ網羅(重複・欠落なし)であること、env 検証が total=0 / index>=total / 負数を拒否することを実測で確認した。競合試験の集約は wf_lock_acquire / wt_lock_acquire がともに ndf_lock_acquire への 1 行委譲であることを確認済みで、カバレッジの実質的な欠落はない。
SHARD_TOTAL=2 の各 shard と未分割の収集を実際に比べ、和の一致・重複なし・ 同一ファイルが複数 shard に割れないことを検証する(#891 のレビュー指摘)。 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G5uEPdcjhFR1Aerv5JMfpP
🔧 /ndf:fix サマリ | round 1 | commit 08540b2対応件数: critical=0 / major=1 / minor=0(合計 1 件) |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正が必要な指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | kiro | APPROVE
テスト高速化(#882 shard 分割 + -n auto 並列化、#884 重複競合試験の集約と繰り返し削減、release/** の push 契機除去)。変更範囲は PR の目的と一貫しており、指摘すべき修正アクションは検出されなかった。安全性の核となる主張(AC5: de-parametrize した競合試験が排他破壊を検出する)を実機で確認済み: lock-common.sh の 2 段目の関門 _ndf_lock_hold を無効化した状態で test_many_at_once_never_share_the_critical_section(parallel=12, trials=3)が overlap 3 件で失敗、その後ファイルは git clean に復元。shard + xdist の組合せ実行で 2086+3248=5334 件が未分割の全件と一致し、CI 集約ジョブ(needs.pytest-shard.result = success + if: always())の判定も GitHub の matrix 集約仕様に沿って正しい。
🔧 /ndf:fix サマリ | commit (なし)対応件数: critical=0 / major=0 / minor=0(合計 0 件) |
Summary
全体テストの待ちを縮める(マイルストーン 26 の 2')。モードは
light(テスト・継続的統合の設定・テストを案内する文書だけ。本番のスクリプトは変えない)。要求と受け入れ条件はissues/issue-882-884-test-speedup.mdにある。-n autoで回す(pytest-xdistは--projectが指すplaywright-kit-opsの依存に既にある)。案内するコマンドを並列の形にした(CONTRIBUTING.md・PR テンプレート・docs/plugin-development-guide.md・確定仕様 2 件)。並列で壊れたテストは無かった(-n 4/-n auto/ 4 コアに絞った-n 4のすべてで全件合格)wt_lock_acquire・並列 12・試行 3)へ寄せた。入口 × 並列数の 4 通りとtest_lock_common.pyの A7 は同じndf_lock_acquireを試していた。入口が共通実装へ届くことはtest_the_existing_names_take_and_release_the_lockが見ているtest_records_at_once_never_skip_a_stageを 8 → 4 回、test_lock_held_passesを 4 → 3 回(3 回目が排他を取れれば拒否される回数)branchesからrelease/**を外した。release/**からの Pull Request は pull_request の側が必ず回る-n autoだけではジョブが 2 分 6 秒(テスト 1 分 53 秒)で 2 分を超えたため、ファイル単位で 2 つのジョブへ分けた。根のconftest.pyがSHARD_TOTAL/SHARD_INDEXを読み、ファイルのパスの剰余(zlib.crc32)で自分の分だけを残す。まとめジョブの名前をpytestにしたため、ruleset の必須の検査は変えていない。手元で指定しなければ分けないscripts/tests/test_root_conftest.pyに、SHARD_TOTAL=2の 2 つの shard がどちらも空でなく、重ならず、合わせると分けない収集と一致し、同じファイルを割らないことを確かめるテストを足した。分け方が項目を落としても各ジョブとまとめジョブは成功しうるため、継続的統合の外から見る所要の実測(手元・9 コア・別の作業と並行)
-n 4-n auto-n 4(taskset -c 0-3、4 vCPU の runner 相当)継続的統合の所要(
ubuntu-latest)-n autoの 1 ジョブ(22d12293、run 35824147678)件数の減少 4 件は、寄せた競合試験(4 通り → 1 通り、A7 の 1 件を削除)の分である。
#884 の残り(本番のスクリプトの変更が要るため、この PR では行わない)
#884 の受け入れ条件「0.5 秒以上の合計が 40 秒以下」はこの PR だけでは満たさない。#884 は開いたまま残す。
test_git_facts.pyの猶予待ちtest_bg_wait.pyのsleep 1ポーリングbg-wait.shの間隔の注入(本番のスクリプト)test_testenv.py2 件・test_the_timeout_override_reaches_only_the_stage_state)関連する issue: Fixes #882 / Refs #884
Test plan
uv run --project plugins/playwright-kit/skills/playwright-kit-ops --with pytest pytest . -q -n 4→ 5333 passed / exit=0uv run --project plugins/playwright-kit/skills/playwright-kit-ops --with pytest pytest . -q -n auto→ 5333 passed / exit=0uv run --project plugins/playwright-kit/skills/playwright-kit-ops --with pytest pytest . -q(順)→ 5333 passed / exit=0uv run --with pytest --with pytest-xdist pytest scripts/tests plugins/ndf -q -n 4→ 5149 passed / exit=0--with pytest-xdistを省いて-nを渡すとunrecognized arguments: -nで exit=4(開発ガイドに書いた挙動の確認)検出力の確認:
ndf_lock_acquireの排他を外すと、寄せたtest_many_at_once_never_share_the_critical_section(重なり 3 件)とtest_records_at_once_never_skip_a_stageが落ちる。排他を無視させるとtest_lock_held_passesが落ちる(確認後に元へ戻した)python3 scripts/check-markdown-links.py --root .→ exit=0python3 scripts/check-doc-staleness.py --root .→ exit=0SHARD_TOTAL=2 SHARD_INDEX=0/1と-n 4(taskset -c 0-3)→ 2085 + 3248 = 5333 passed / 各 exit=0、各 28〜30 秒SHARD_TOTAL=2 SHARD_INDEX=2→ 範囲の誤りを示して exit=4CI の
pytest (0/2)/pytest (1/2)/pytestが合格し、全検査 17 件が pass。所要は変更前の約 24%実装レビュー(cross-review、codex / kiro): round 1 で codex が分割の検査の不足を指摘(08540b27 で対応)、round 2 で両者 APPROVE。未解決の指摘 0 件
uv run --with pytest --with pytest-xdist pytest scripts/tests/test_root_conftest.py -q→ 18 passed。分け方を壊すと追加したテストが落ちることを確かめた(確認後に元へ戻した)08540b2 で
uv run --with pytest --with pytest-xdist pytest scripts/tests plugins/ndf -q -n 4→ 5150 passed / exit=0(2026-09-23 06:12)python3 scripts/check-skill-frontmatter.py/python3 plugins/ndf/scripts/instructions-check.py --root ./claude plugin validate .→ 各 exit=008540b2 の CI(run 35825281051)で全検査 17 件が pass
🤖 Generated with Claude Code
https://claude.ai/code/session_01G5uEPdcjhFR1Aerv5JMfpP