【Playwright⑥】適切なアサーション: 検証タイプ

適切なアサーションを使いこなすことは、テストの精度と信頼性を高める。本記事では、自動リトライアサーションと非リトライアサーションの違いや、否定マッチャー、ソフトアサーション、カスタムメッセージの活用方法など、テストの幅を広げるさまざまなアサーションの使い方を解説する。

公式ドキュメント: https://playwright.dev/docs/test-assertions

アサーションの基礎と種類

この章では、Playwrightにおけるアサーションの基本的な概念と、その種類について解説する。

自動リトライアサーション(Auto-retrying assertions)

自動リトライアサーションは、指定された条件が満たされるまで、アサーションを繰り返し実行する機能を持つ。そのため、動的に変化する要素や、時間がかかる処理を検証する際に有効。例えば、要素が表示されるまで待機する、あるいは特定のテキストが要素内に現れるまで待つといったケースで役立つ。

以下に、自動リトライアサーションの種類と役割について記載する。

私がよく使うものだけ紹介するため、
より詳しく知りたい方は公式ドキュメントを参照することをお勧めする。

https://playwright.dev/docs/test-assertions#auto-retrying-assertions

アサーション説明
await expect(locator).toBeAttached()要素がDOMにアタッチされていることを確認する。
await expect(locator).toBeChecked()チェックボックスがチェックされていることを確認する。
await expect(locator).toBeDisabled()要素が無効化されていることを確認する。
await expect(locator).toBeEditable()要素が編集可能であることを確認する。
await expect(locator).toBeEmpty()コンテナが空であることを確認する。
await expect(locator).toBeEnabled()要素が有効化されていることを確認する。
await expect(locator).toBeFocused()要素がフォーカスされていることを確認する。
await expect(locator).toBeHidden()要素が非表示であることを確認する。
await expect(locator).toBeInViewport()要素がビューポート内に存在することを確認する。
await expect(locator).toBeVisible()要素が表示されていることを確認する。
await expect(locator).toContainText()要素が指定されたテキストを含んでいることを確認する。
await expect(locator).toHaveAttribute()要素が指定されたDOM属性を持っていることを確認する。
await expect(locator).toHaveClass()要素が指定されたクラスを持っていることを確認する。
await expect(locator).toHaveCount()リストが指定された数の子要素を持っていることを確認する。
await expect(locator).toHaveCSS()要素が指定されたCSSプロパティを持っていることを確認する。
await expect(locator).toHaveId()要素が指定されたIDを持っていることを確認する。
await expect(locator).toHaveRole()要素が指定されたARIAロールを持っていることを確認する。
await expect(locator).toHaveScreenshot()要素のスクリーンショットを取得し、それが期待通りであることを確認する。
await expect(locator).toHaveText()要素のテキストが指定された内容に一致することを確認する。
await expect(locator).toHaveValue()入力フィールドが指定された値を持っていることを確認する。
await expect(locator).toHaveValues()選択ボックスが指定されたオプションを選択していることを確認する。
await expect(page).toHaveScreenshot()ページ全体のスクリーンショットを取得し、それが期待通りであることを確認する。
await expect(page).toHaveTitle()ページが指定されたタイトルを持っていることを確認する。
await expect(page).toHaveURL()ページが指定されたURLに一致することを確認する。
await expect(response).toBeOK()APIレスポンスがOKステータス(200)であることを確認する。

非リトライアサーション(Non-retrying assertions)

非リトライアサーションは、指定された条件を一度だけチェックするアサーションであり、自動的にリトライしない。これらのアサーションは、ページの情報が同期的に表示されることを前提としており、タイミングに依存するテストでは不安定になる可能性がある。たとえば、非同期に読み込まれる要素や、時間差で表示される情報を検証する場合、非リトライアサーションを使用するとテストが失敗することがある。

以下に、非リトライアサーションの種類と役割について記載する。

私がよく使うものだけ紹介するため、
より詳しく知りたい方は公式ドキュメントを参照することをお勧めする。

https://playwright.dev/docs/test-assertions#non-retrying-assertions

アサーション説明
expect(value).toBe()値が指定されたものと一致していることを確認する。
expect(value).toBeCloseTo()数値が指定された値に近いことを確認する。
expect(value).toBeDefined()値がundefinedではないことを確認する。
expect(value).toBeFalsy()値がfalsy(false、0、nullなど)であることを確認する。
expect(value).toBeGreaterThan()数値が指定された値より大きいことを確認する。
expect(value).toBeGreaterThanOrEqual()数値が指定された値以上であることを確認する。
expect(value).toBeLessThan()数値が指定された値より小さいことを確認する。
expect(value).toBeLessThanOrEqual()数値が指定された値以下であることを確認する。
expect(value).toBeNaN()値がNaNであることを確認する。
expect(value).toBeNull()値がnullであることを確認する。
expect(value).toBeTruthy()値がtruthy(false、0、nullではない)であることを確認する。
expect(value).toBeUndefined()値がundefinedであることを確認する。
expect(value).toContain()文字列が指定されたサブストリングを含んでいることを確認する。
expect(value).toContainEqual()配列やセットが指定された要素を含んでいることを確認する。
expect(value).toEqual()値が指定されたものと深いレベルで等しいことを確認する。
expect(value).toHaveLength()配列や文字列が指定された長さであることを確認する。
expect(value).toMatch()文字列が指定された正規表現と一致することを確認する。
expect(value).closeTo()数値が指定された値に近いことを確認する。
expect(value).stringMatching()文字列が指定された正規表現と一致することを確認する。

その他のアサーション機能

ここでは、Playwrightが提供するその他のアサーション機能について解説する。
よく使用するものだけ解説するので、
より詳しく知りたい方は公式ドキュメントを参照することをお勧めする。

公式ドキュメント: https://playwright.dev/docs/test-assertions#negating-matchers

否定マッチャー(Negating Matchers)

Playwrightでは、マッチャーに.notを追加することで、条件が「満たされない」ことをアサートできる。たとえば、ある値が特定の値と等しくないことや、特定のテキストが要素に含まれていないことを確認する場合に使用する。

例:

expect(value).not.toEqual(0); // 値が0でないことを確認
await expect(locator).not.toContainText('some text'); // 要素が指定されたテキストを含んでいないことを確認

ソフトアサーション(Soft Assertions)

通常、アサーションが失敗するとテストの実行は中断されるが、Playwrightは「ソフトアサーション」もサポートしている。ソフトアサーションは、失敗してもテストの実行を中断せず、テストを継続させるが、失敗として記録される。

ソフトアサーションを使うと、複数の条件を一度にチェックでき、失敗があっても次の検証を続けられる。

例:

await expect.soft(page.getByTestId('status')).toHaveText('Success');
await expect.soft(page.getByTestId('eta')).toHaveText('1 day');

また、テスト実行中にソフトアサーションの失敗を確認することも可能。

カスタムメッセージ(Custom Expect Message)

expect関数にカスタムメッセージを追加することができる。
このメッセージは、アサーションが成功した場合や失敗した場合のデバックに役立つ。

await expect(page.getByText('Name'), 'should be logged in').toBeVisible();

アサーションが成功した場合、レポートには「should be logged in」というメッセージが表示され、失敗した場合にはエラーメッセージとして表示される。

ポーリング機能(expect.poll)

expect.pollを使うと、任意の同期的なexpectを非同期のポーリング機能に変換できる。このメソッドは、条件が満たされるまで指定された関数を繰り返し実行する。

例:

await expect.poll(async () => {
  const response = await page.request.get('https://api.example.com');
  return response.status();
}).toBe(200);

ブロックの再試行(expect.toPass)

expect.toPassを使用すると、特定のコードブロックが成功するまで再試行できる。この機能は、複数の検証が含まれる場合に便利だ。

例:

await expect(async () => {
  const response = await page.request.get('https://api.example.com');
  expect(response.status()).toBe(200);
}).toPass();

まとめ

Playwrightが提供するアサーション機能を理解し、適切に活用することで、テストの信頼性と精度を大幅に向上させることができる。あなたのテスト構築の参考になれば幸いだ。次回の記事では、Playwrightで非同期処理を扱う方法とイベント(リクエスト)待機について解説する。

関連記事

コメント

この記事へのトラックバックはありません。