3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ReactアプリをPlaywrightでテストする〜レポート機能〜

Last updated at Posted at 2022-04-28

今回は、テスト結果を成果物として残すことを意識して、レポート機能をやってみます。
playwrightにもともとあるレポーターの他に、Third Partyとして紹介されているAllureも少し試そうと思います。

環境

  • macOS Monterey 12.2.1
  • Visual Studio Code 1.66.2
  • Node.js 16.13.0
  • React 18.0.0
  • playwright 1.21.1
  • Allure 2.17.2
  • java 1.8.0_211
  • allure-playwright 2.0.0-beta.16

前回書いた実装でのレポート

前回の簡単なテストコードはこうでした。

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

test('basic test', async ({ page, context }) => {   // ①
  await page.goto('http://localhost:3000/');   // ③
  await expect(page).toHaveTitle(/React App/); // ④

  const text = page.locator('p');
  await expect(text).toHaveText(/Edit src\/App.js and save to reload./);  // ⑤

  const [newPage] = await Promise.all([
    context.waitForEvent('page'),
    page.click('a[target="_blank"]')  // ⑥
  ]);
  await newPage.waitForLoadState();   // ⑦
  await expect(newPage).toHaveURL('https://reactjs.org/');  // ⑧
  await expect(newPage).toHaveTitle(/React/);   // ⑨
});

これをデフォルトのレポート機能で表示するとこのように出力されます。

playwright-report.png

ぱっと見、何のテストをしているのかわかりにくいので、test.step()を書き足してみます。

ステップ内容を書いてみる

最初の2行分を、test.step()でまとめてみます。

test('reactデモページをテストする', async ({ page, context }) => {
  await test.step('Topページにアクセスすると、タイトルにReactAppと表示されること', async () => {
    await page.goto('http://localhost:3000/');
    await expect(page).toHaveTitle(/React App/);
  });
   ...
});

ひとまずテストを再実行して、レポートを再度出力してみます。
image.png
テストのタイトルと、テストの手順が記載した通り、出力されました。
こんなふうに残りのテスト手順も追記していきます。

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

test('reactデモページをテストする', async ({ page, context }) => {
  await test.step('Topページにアクセスすると、タイトルにReactAppと表示されること', async () => {
    await page.goto('http://localhost:3000/');
    await expect(page).toHaveTitle(/React App/);
  });

  await test.step('"Edit src/App.js and save to reload."と表示されること', async () => {
    const text = page.locator('p');
    await expect(text).toHaveText(/Edit src\/App.js and save to reload./);
  });

  await test.step('リンクをクリックすると別タブが開かれること', async () => {
    const [newPage] = await Promise.all([
      context.waitForEvent('page'),
      page.click('a[target="_blank"]')
    ]);
    await test.step('別タブにReactサイトが表示されること', async() => {
      await newPage.waitForLoadState();
      await expect(newPage).toHaveURL('https://reactjs.org/');
      await expect(newPage).toHaveTitle(/React/);
    });
  });
});

test.step() は入れ子で書けます。
出力されるレポートはこういうふうに出力されました。
image.png

これでも十分わかりやすいレポートになったかと思います。
次はAllureを導入してみることにします。

Allure Reportで出力する

playwright のドキュメントにも、Third Party製レポートとして唯一紹介されてるものです。
こちらを参考に、インストールしてみます。

yarn add -D allure-playwright

また、Allure自体はHomebrewでインストールします。(実行に必要なJavaのランタイムも一緒にインストールされます)詳しくは本家サイトを参照ください。

brew install allure

テストコードに、epicとstoryを書いてみます。

test('reactデモページをテストする', async ({ page, context }) => {
  allure.epic('reactデモページをテストする');
  allure.story('初期表示の確認');
  ...
});

Allureのレポートとして出力するには、reporterオプションを追加してテストを実行します。

yarn playwright test --reporter=line,allure-playwright 

Allureのレポート出力は以下のコマンドを実行します。

allure generate ./allure-results --clean && allure open ./allure-report

以下のようなWebページが表示されます。
image.png
FEATURES BY STORIESの「reactでもページをテストする」がリンクになってるので、そちらをクリックするとPlaywrightのレポートのような構造のテストステップが出力されたページに移動します。
image.png

左側はallureの機能で記載した内容で出力されて、右側はPlaywrightのレポートとほぼ同様の内容が出るようです。とてもきれいなレポートが出力されるので、成果物としてはこちらの方が良さそうだな、と個人的には思ってます。

今回は簡単にレポート機能を試してみました。
次は、Playwrightの機能をもっと試していこうと思ってます。

リンク

Playwright レポート機能 https://playwright.dev/docs/test-reporters
Allure Framework https://docs.qameta.io/allure/
allure-playwright(npm) https://www.npmjs.com/package/allure-playwright

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?