テストが1本だけ通っていた
CIの結果を見ると成功している。でも、よく見るとテストが1本しか実行されていない。
Playwrightを使っていると、開発中に書いた test.only() を消し忘れることがあります。ローカルでは便利なのですが、そのままコミットすると他のテストが実行されません。
test.onlyは何をしているのか
test.only() は、指定したテストだけを実行するための機能です。
import { test, expect } from '@playwright/test';
test.only('プロフィールを表示する', async ({ page }) => {
await page.goto('/profile');
await expect(page.getByRole('heading', { name: 'プロフィール' })).toBeVisible();
});
test('設定を表示する', async ({ page }) => {
await page.goto('/settings');
});
この状態では、後ろの設定テストは実行されません。テストを絞り込む目的では正しい動作です。
ただし、開発が終わってから消し忘れると話が変わります。CIが成功しても、実際には一部のテストしか確認できていないからです。
forbidOnlyをCIで有効にする
Playwrightには、test.only() や test.describe.only() が残っていたら失敗させる設定があります。playwright.config.ts に追加しましょう。
import { defineConfig } from '@playwright/test';
export default defineConfig({
forbidOnly: !!process.env.CI,
});
ローカルでは test.only() を使えますが、CIでは残っているだけで失敗します。Playwright公式もCI向けの設定例として forbidOnly: !!process.env.CI を示しています。
実行時だけ指定したい場合は、次のオプションでもいけます。
npx playwright test --forbid-only
設定ファイルに書く方法を基本にして、手元で確認するときにコマンドラインを使うのが分かりやすいと思います。
絞り込みたい時はtest.only以外も使える
調査中に1本だけ実行したいだけなら、test.only() をソースへ残さない方法もあります。
npx playwright test tests/profile.spec.ts
npx playwright test --grep "プロフィール"
npx playwright test --project=chromium
ファイル名、タイトル、projectをコマンドラインで絞り込めます。コードを書き換えないので、消し忘れが起きません。
既存テストの絞り込みには、--grep と --project の使い分けも便利です。テストを速く確認したいだけなら、まずこちらを使ってみてください。
消し忘れを見つける順番
CIが急に「onlyがある」と言い始めたら、まずテストファイルを検索します。
rg "test\.only|test\.describe\.only|describe\.only" tests
それでも見つからない場合は、別ディレクトリのテストや共通ヘルパーから読み込んでいないかを確認します。検索結果が0件でも、CIで使っているブランチや生成済みファイルが同じとは限りません。
逆に、ローカルの確認だけで一時的に絞り込みたいなら、test.only() を使っても大丈夫です。CI側の forbidOnly が最後に止めてくれます。
まとめ
test.only() は調査中には便利ですが、CIに残すと「1本だけ通っている」状態を作ります。
設定はこれだけです。
export default defineConfig({
forbidOnly: !!process.env.CI,
});
テストを絞る時はコマンドライン、消し忘れを防ぐ時は forbidOnly。役割を分けると、CIの成功を信じやすくなります。簡単ですね。
Playwrightのテストを増やしている方は、まず設定ファイルに入れておいてください。


コメント