Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C#でのPlaywrightを使ったE2Eテストの実際

tomokusaba
February 23, 2024

 C#でのPlaywrightを使ったE2Eテストの実際

C#でのPlaywrightを使ったE2Eテストの実際
.NETラボ勉強会2024年2月
https://dotnetlab.connpass.com/event/309012/

tomokusaba

February 23, 2024
Tweet

More Decks by tomokusaba

Other Decks in Programming

Transcript

  1. Playwrightの導入方法 • NUnitのテンプレートでプロジェクトを作成します。 • 次のパッケージをNugetします。またはNUnit Playwright TestProjectでプロジェクトを作成。パッケージを最新にする。 Microsoft.Playwright.NUnit • プロジェクトをビルドします。

    • NUnitのプロジェクトのディレクトリで以下のPowerShellを実 行します。 pwsh bin/Debug/netX/playwright.ps1 install netXの部分はnet8.0など実際のフォルダ名(.NETのバージョン)に置き換 えます。
  2. システム要件 • .NET Standard 2.0(.NET 8推奨) • Windows10以降、Windows Server2016以降またはWSL •

    MacOS12、MacOS13、MacOS14 • Debian11、debian12、Ubuntu20.04、Ubuntu22.04
  3. テストの基底クラス テスト 説明 PageTest 独自のBrowserContextで作成されたWebページの新しいコピーを取得しま す。このクラスを拡張することは完全に機能するPlaywrightテストを記述する最 も簡単な方法です。(推奨) 各テストファイルのContextOptionをoverrideしてコンテキストオプションを 制御することができます。 ContextTest

    各テストはBrowserContextの新しいコピーを取得します。このテストは複数の タブが必要な複数ページのシナリオをテストする簡単な方法です。 BrowserTest 各テストはブラウザーを取得して好きなだけコンテキストを作成できます。 PlaywrightTest 各テストに、Playwrightオブジェクトが与えられ、テストは必要なだけのブラウザ を開始及び停止できます。
  4. ロケーター • ページ上の要素を見つける方法を表す。 ロケーター 説明 GetbyRole() アクセシビリティ属性で検索します GetbyText() テキストコンテンツで検索します GetbyLabel()

    ラベルのテキストでフォームコントロールを検索します。 GetbyPlaceholder() プレースホルダーで入力を検索します。 GetbyAltText() 代替テキストで要素を見つけます。 GetbyTitle() title属性で要素を検索します。 GetbyTestId() data-testidに基づいて要素を検索します。(推奨)
  5. 主なアサーション アサート 説明 ToBeChackedAsync() チェックボックスがオンになっている。 ToBeDesabledAsync() 要素が無効になっている。 ToBeEditableAsync() 要素が編集可能である。 ToBeEnabledAsync()

    要素が有効である。 ToBeVisibleAsync() 要素が表示されている。 ToBeHiddenAsync() 要素が表示されていない。 ToBeContainTextAsync() 要素にテキストが含まれている。 ToHaveAttirbuteAsync() 要素にDOM属性がある。 ToHaveClassAsync() 要素にクラスプロパティがある。 ToHaveIdAsync() 要素にIDがある。 ToHaveCSSAsync() 要素にCSSプロパティがある。
  6. モックAPI • HTTPとHTTPSのネットワークトラフィックをモック及び変更するためのAPI • ページが行うすべての要求はモックできる。 • データベースの状態を抜きにしてUIをテストしたいときに有効 // Intercept the

    route to the fruit API await page.RouteAsync("*/**/api/v1/fruits", async route => { var json = new[] { new { name = "Strawberry", id = 21 } }; // fulfill the route with the mock data await route.FulfillAsync(new() { Json = json }); }); // Go to the page await page.GotoAsync("https://demo.playwright.dev/api-mocking"); // Assert that the Strawberry fruit is visible await Expect(page.GetByTextAsync("Strawberry")).ToBeVisibleAsync();
  7. GitHub Actions ワークフロー • ユースケースとして、GitHubにプッシュ→アプリケーションビル ド→UnitTest→デプロイ→E2Eテストというフローがある。 E2Eテストのところに着目したワークフローとしては以下の通り name: Playwright Tests

    on: deployment_status: jobs: test: timeout-minutes: 60 runs-on: ubuntu-latest if: github.event.deployment_status.state == 'success' steps: - uses: actions/checkout@v3 - name: Setup dotnet uses: actions/setup-dotnet@v3 with: dotnet-version: 8.0.x - run: dotnet build - name: Ensure browsers are installed run: pwsh bin/Debug/net8.0/playwright.ps1 install --with-deps - name: Run tests run: dotnet test env: # This might depend on your test-runner PLAYWRIGHT_TEST_BASE_URL: ${{ github.event.deployment_status.target_url }}
  8. で、何をテストしますか??問題。 • ユースケース① ユーザーからみたUIの反応が壊れてないかテストしたい。 • ブラウザーのアップデートによってUIが壊れてないか? • ユースケース② インフラの変更・障害を検知テストしたい。 •

    アプリケーションの動作に影響を及ぼすようなインフラの変更・障害 などもE2Eテストで検出できるのでは? 例)初期表示時にデータベースをSELECTしてるがデータベース接続 に失敗してコンテンツが全く表示されていなかった。 →データベースの接続確認は正常性チェックでもするべきだがより実 際的なアプリケーションの応答としてのテスト。
  9. 参考文献 • Playwright for .NET Docs https://playwright.dev/dotnet/docs/intro • Scale Playwright

    .NET tests with Microsoft Playwright Testing https://github.com/microsoft/playwright-testing- service/blob/main/samples/.NET/NUnit/README.m d