もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

playwrightでE2Eテスト

はじめに

こんばんは。

最近 playwright というテストツールを使って E2Eテストを触っています。

設定はとてもかんたんだったので、備忘録として残しておきます。

playwright.dev

本番

install

playwrightのインストール

$ npm i -D @playwright/test

ブラウザのインストール

$ npx playwright install --with-deps ← chrome, safari, firefox
$ npx playwright install msedge        ← microsoft edge

テストコード

import { test, expect } from '@playwright/test'

test.describe('ユーザープロフィールページ', () => {
  test.beforeEach(async ({ page }) => {
    await page.goto(`/user/1`)
  })

  test('名前が表示されている', async ({ page }) => {
    const name = await page.locator(`.profile-block .name`)
    await expect(name).toContainText('kojirock')
  })

  test('名前が変更できる', async ({ page }) => {
    const name = await page.locator(`.profile-block .name`)
    await page.fill(".name-form", 'kojirock-edit')
    await page.click('.save-button')
    await page.waitForTimeout(1000) // 雑に1秒まつ

    const name = await page.locator(`.profile-block .name`)
    await expect(name).toContainText('kojirock-edit')
  })
})

実行

$ playwright test

Running 8 tests using 1 worker
········

  8 passed (1m)
Done in 30.10s.

テストが2個なのになんで8回実行されているのかは 設定ファイルを見ればわかります。

設定ファイル(project部分のみ抜粋)

  projects: [
    {
      name: 'chromium',
      use: {
        ...devices['Desktop Chrome'],
      },
    },
    {
      name: 'webkit',
      use: {
        ...devices['Desktop Safari'],
      },
    },
    {
      name: 'Microsoft Edge',
      use: {
        channel: 'msedge',
      },
    },
    {
      name: 'firefox',
      use: {
        ...devices['Desktop Firefox'],
      },
    },
  ]

ブラウザ4種類でテストケース2個を実行しているから 4 * 2で8回実行されているという感じです。

設定ファイルは他にも細かに設定できます。

1. テスト実行時に同時にサーバを立ち上げたいとき

  webServer: {
    command: 'yarn dev', ← 任意のコマンド
    url: 'http://localhost:3300', ← 任意のURL
    reuseExistingServer: !process.env.CI,
  }

2. テスト実行時にログイン状態にしたい

  globalSetup: './global-setup',
  use: {
    storageState: './cache/storageState.json',
  },
import { chromium, FullConfig } from '@playwright/test'

async function globalSetup(config: FullConfig): Promise<void> {
  const browser = await chromium.launch()
  const page = await browser.newPage()

  await page.goto('http://localhost:3300/login')
  await page.fill("input[name='email']", 'example@example.com')
  await page.fill("input[name='password']", 'passwordpassword')
  await Promise.all([page.waitForNavigation(), page.click('.button')])

  await page.context().storageState({ path: '.cache/storageState.json' })
  await browser.close()
}

export default globalSetup

終わりに

なかなか楽しいです。

CIで実行するときや、VRT(Visual Regression Testing)というスナップショットテストもできるみたいなので、今後また試してみます。

現場からは以上です。