自動テストの作成は、開発者にとって楽しい作業ではありません。デベロッパーは、機能を作成し、バグを修正し、世界を改善したいと考えています。ただし、ワークフローに自動テストが組み込まれていないと、長期的にはバグが非常に多くなる可能性があります。そのため、自動テストの作成も重要だと考えています。
Chrome DevTools の [Recorder] パネルで、ユーザーフローを記録して再生したり、さまざまなサードパーティの拡張機能やライブラリを使用してさまざまな形式(テスト スクリプトなど)にエクスポートしたり、Puppeteer Replay ライブラリでユーザーフローをカスタマイズしたり、既存のワークフローに統合したりできます。
このブログ投稿では、次の内容について説明します。
- ユーザーフローをプログラムでエクスポートして再生する方法。
- Puppeteer Replay を利用してユーザーフローをカスタマイズする方法。
- CI / CD ワークフローと統合する方法。
このブログ投稿は、レコーダーの基本をすでにご存じであることを前提としています。レコーダーを初めて使用する場合は、こちらの簡単な紹介チュートリアルと動画ガイドをご覧ください。
ユーザーフローをエクスポートしてプログラムで再生する
デフォルトでは、レコーダーで録音を Puppeteer または Puppeteer Replay スクリプトとして、またはプレーン JSON ファイルとしてエクスポートできます。
ユーザーフローを JSON ファイルとしてエクスポートしたら、[Recorder] パネルにインポートして再生したり、外部ライブラリを使用して再生したりできます。使用可能なライブラリの 1 つに Puppeteer Replay ライブラリがあります。
Puppeteer でもう一度プレイ
リポジトリの手順に沿って Puppeteer Replay をインストールします。
JSON ユーザーフローを recordings
フォルダ(デモ プロジェクトなど)に保存した場合は、次のコマンドを使用して 1 つ以上のユーザーフローを実行できます。
# replay one user flow
npx @puppeteer/replay ./recordings/order-a-coffee.json
# replay all user flows under recordings folder
npx @puppeteer/replay ./recordings/*.json
必要に応じて、録音を実行する npm スクリプトを追加できます。package.json
の scripts
フィールドに次の行を追加します。
"replay-all": "replay recordings"
これにより、コマンドラインで npm run replay-all
を実行すると、すべての録音を再生できます。
デフォルトでは、ユーザーフローは UI なしでリプレイされます(ヘッドレス モードとも呼ばれます)。UI を表示する場合は、コマンドを実行する前に PUPPETEER_HEADLESS
環境変数を false に設定します。
PUPPETEER_HEADLESS=false npm run replay-all
サードパーティ ライブラリで再現する
Chrome ブラウザ以外で再生するために使用できるサードパーティ ライブラリもあります。ライブラリの一覧をご覧ください。
たとえば、TestCafe はエンドツーエンドのテスト フレームワークです。Safari などでの JSON ユーザーフローのリプレイをサポートします。
npm install -g testcafe
# replay with selected browsers
testcafe safari ./recordings/order-one-coffee.json
testcafe firefox ./recordings/order-one-coffee.json
testcafe chrome ./recordings/order-one-coffee.json
# replay with all browsers
testcafe all ./recordings/order-one-coffee.json
一方、Saucelabs はクラウドベースのテスト プラットフォームです。クラウド上でさまざまなブラウザとバージョンで JSON ユーザーフローの再生をサポートしています。
Saucelabs の構成ファイルの例を示します。デモ リポジトリをご確認ください。
apiVersion: v1alpha
kind: puppeteer-replay
suites:
- name: "order a coffee"
recordings: [ "recordings/order-a-coffee.json" ]
…
さまざまな拡張機能を使用してユーザーフローをエクスポートする
デフォルトのオプションとは別に、拡張機能をインストールして、ユーザーフローをさまざまな形式でエクスポートすることもできます。
たとえば、ユーザーフローを WebPageTest カスタム スクリプトとして記録してエクスポートできます。このスクリプトを使用すると、アプリ内のマルチステップ ユーザーフローのパフォーマンスをテストできます。ただし、スクリプトの作成は難しい場合があります。
また、すでにテストツールを導入している場合は、Cypress、Nightwatch、WebdriverIO、Testing Library などのさまざまなテスト スクリプトにユーザーフローをエクスポートする拡張機能もあります。一覧をご確認ください。そうすることで、チームでより迅速にテストの作成を開始できます。
プログラムで別のテスト スクリプトに変換する
これらのテスト プロバイダの多くは、拡張機能に加えて、複数の JSON ユーザーフローをプログラムによって変換するためのライブラリを公開しています。
たとえば、@cypress/chrome-recorder ライブラリを使用して、ユーザーフローを Cypress テストにエクスポートします。
npm install -g @cypress/chrome-recorder
npx @cypress/chrome-recorder ./recordings/*.json
拡張機能によるユーザーフローの再現
Chrome 112 以降では、拡張機能を使用して録画を再生することでエクスペリエンスを向上できます。これらの拡張機能を使用すると、DevTools を離れることなく録音を再生するために、サードパーティのサービスとインフラストラクチャをシームレスに統合できます。
使用を開始するには、利用可能な拡張機能のリストをご覧ください。また、独自のカスタム拡張機能を作成する方法もご確認ください。
独自の拡張機能またはライブラリを作成する
すべての拡張機能とライブラリは、バックグラウンドで Puppeteer Replay ライブラリ上に構築されています。Puppeteer Replay には、ユーザーフローのリプレイが可能な API のほかに、ユーザーフローのリプレイをカスタマイズまたは変換できる API が用意されています。
ユーザーフローのリプレイをカスタマイズする
スクリーンショット プラグインを作成しましょう。ユーザーフローごとに、以下が必要です。
- 各ステップの最後にスクリーンショットを撮って
_screenshots
フォルダに保存します。 - ユーザーフローの実行が完了したときにメッセージを出力する。
コード スニペットを以下に示します。このデモをダウンロードして試すこともできます。
/* screenshot-plugin.mjs */
import { mkdirSync } from "fs";
import { PuppeteerRunnerExtension } from "@puppeteer/replay";
// create folder if not exist
let screenshotFolder = "_screenshots";
mkdirSync(screenshotFolder, { recursive: true });
export default class ScreenshotPlugin extends PuppeteerRunnerExtension {
count = 0;
async afterEachStep(step, flow) {
await super.afterEachStep(step, flow);
this.count = this.count + 1;
const path = `${screenshotFolder}/${flow.title}-${this.count}.png`;
await this.page.screenshot({ path });
console.log(`Saved screenshot as ${path}`);
}
async afterAllSteps(step, flow) {
await super.afterAllSteps(step, flow);
console.log("Operation completed successfully.");
}
}
コード自体がかなり充実しています。ここでは、PuppeteerRunnerExtension
API を拡張して、各ステップの後にスクリーンショットを保存し、すべてのステップの後にメッセージをログに記録します。
ファイルを保存します。この拡張機能を使用すると、次のコマンドを使用してユーザーフローを実行できます。
# replay one user flow with plugin
npx @puppeteer/replay --extension ./screenshot-plugin.mjs ./recordings/order-a-coffee.json
# replay all user flows with plugin under recordings folder
npx @puppeteer/replay --extension ./screenshot-plugin.mjs ./recordings/*.json
出力は次のとおりです。
Saved screenshot as _screenshots/order-a-coffee-1.png
Saved screenshot as _screenshots/order-a-coffee-2.png
Saved screenshot as _screenshots/order-a-coffee-3.png
…
Operation completed successfully.
ユーザーフローを変換する
ユーザーフローをカスタマイズするもう 1 つの方法は、ユーザーフローを別の形式(Cypress や Nightwatch のテスト スクリプトなど)に変換することです。
たとえば、ユーザーフローに URL に移動するステップが含まれているとします。JSON ファイルは次のようになります。
{
"title": "order-a-coffee",
"steps": [
{
"type": "navigate",
"url": "https://coffee-cart.netlify.app/"
},
…
]
}
ステップを JavaScript に変換するための stringify プラグインを作成できます。他の既存のライブラリを表示して方法を確認することもできます。
たとえば、次のコード スニペットは、WebdriverIO がナビゲーション ステップを変換する方法を示しています。
export class StringifyPlugin extends PuppeteerStringifyExtension {
#appendStepType(out: LineWriter, step: Step, flow: UserFlow) {
switch (step.type) {
case 'navigate':
return out.appendLine(`await browser.url(${formatAsJSLiteral(step.url)})`)
…
}
ユーザーフローでプラグインを実行すると、ナビゲーション ラインは await browser.url(‘https://coffee-cart.netlify.app/’)
に変換されます。
DevTools のリプレイ エクスペリエンスをカスタマイズする
リプレイ拡張機能を使用すると、DevTools レコーダーを離れることなく、サードパーティのサービスとインフラストラクチャを使用して録画を再生できます。
独自のリプレイ拡張機能を作成するには、リプレイ拡張機能のドキュメントを参照し、拡張機能の例をご確認ください。
Chrome 拡張機能を公開する
ユーザーフローをカスタマイズして変換したら、Chrome 拡張機能としてパッケージ化して Chrome ウェブストアに公開できます。
ローカルでデバッグして Chrome 拡張機能を公開する方法については、こちらのデモと手順をご覧ください。
CI/CD パイプラインと統合する
これを行う方法は複数あり、世の中には多くのツールがあります。GitHub Actions でこのプロセスを自動化する例を次に示します。
# .github/node.js.yml
name: Replay recordings
on:
push:
branches: [ "main" ]
schedule:
- cron: '30 12 * * *' # daily 12:30pm
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 18.x
cache: 'npm'
- run: npm install puppeteer
- run: npm run replay-all
- run: npm run start
この例では、次の場合のユーザーフローを再生します。
- 新しい変更が
main
ブランチに push される - 毎日午後 12 時 30 分
GitHub Actions 以外にも、お気に入りのクラウド プロバイダと統合できます。こちらのデモで、Google Cloud Run ジョブを使用して最大 10,000 個のユーザーフローを並行して実行する方法をご確認ください。
まとめ
このブログ投稿では、ユーザーフローを JSON ファイルとしてエクスポートする方法、PuppeteerReplayExtension
でリプレイをカスタマイズする方法、PuppeteerStringifyExtension
でユーザーフローを変換する方法、CI ワークフローに統合する方法について説明しました。
このブログ投稿で、レコーダー パネルと提供されているツールを使用して、プロジェクトにテスト ワークフローを簡単に統合する方法についてのアイデアをご紹介いただけたら幸いです。皆様が構築されるソリューションを楽しみにしております。
プレビュー チャンネルをダウンロードする
デフォルトの開発ブラウザとして Chrome の Canary、Dev、または Beta を使用することを検討してください。これらのプレビュー チャンネルを使用すると、DevTools の最新機能にアクセスしたり、最先端のウェブ プラットフォーム API をテストしたり、ユーザーに先駆けてサイトの問題を検出したりできます。
Chrome DevTools チームへの問い合わせ
以下のオプションを使用して、投稿の新機能や変更点、または DevTools に関連するその他のことについて話し合います。
- ご提案やフィードバックは、crbug.com からお送りください。
- DevTools で [その他] > [ヘルプ] > [DevTools の問題を報告] を使用して、DevTools の問題を報告します。
- @ChromeDevTools にツイートします。
- DevTools の新機能に関する YouTube 動画または DevTools のヒントに関する YouTube 動画にコメントを残してください。