skip to content
me nonoakij

App Router で experimental playwright を使って E2E テストをやってみる

/ 3 min read

はじめに

experimental/testmode/playwright を試そうと思ったのですが、断片的な情報が多く、Next.js のリポジトリにも Example がなかったので、一通り試してみました。

この記事は、上記リポジトリの内容を振り返られるようにまとめたものです。 従って、playwrightやmswの使い方の説明など触れていません。

具体的な実装は下記のリポジトリを参照してください。
https://github.com/nonoakij/next-experimental-playwright
! nsw の実装も含まれていますが、現状うまく動かすことができなかったのでコメントアウトされています。

今回やった内容は、以下のようなものです。

  • Next の Example (with-playwright) をベースに単純な E2E テストができることを確認する
  • snapshot をとって Visual Regression Test を行う
  • experimental/testmode/playwright を使って、API を Mock して E2E テストを行う

ディレクトリとファイル構成

tree
.
├── app
│   ├── about
│   │   └── page.tsx
│   ├── api
│   │   └── product
│   │       └── [name]
│   │           └── route.ts
│   ├── layout.tsx
│   ├── page.tsx
│   └── product
│       ├── [name]
│       │   └── page.tsx
│       └── page.tsx
├── e2e
│   ├── app.spec.ts
│   └── testmode-playwright.spec.ts
└── playwright.config.ts

! 重要な部分のみ抜粋してます

基本的には Example の構成をそのまま使っています。
これから追記した部分の説明をします。

app/product/[name]/page.tsx

ページ内で route handler (app/api/product/[name]/route.tsx) から、タイトルを取得して表示するようにしています。

app/api/product/[name]/route.tsx

npm run dev で、Next を立ち上げているときに、/product/:name にアクセスすると、name に応じたタイトルを返すようにしています。E2E テストの際に、testmode-playwright.spec.ts で、この API を Mock しています。

e2e/testmode-playwright.spec.ts

API を Mock して E2E テストを行う部分のテストを書いています。

e2e/app.spec.ts

基本的に Example のままですが、snapshot をとる部分を追記しています。

まとめ

experimental/testmode/playwright を使わなくても、snapshot をとることで、Visual Regression Test を行うことができる。 experimental/testmode/playwright を使うことで、API を Mock して E2E テストを行うことができる。

Reference

ベースにした Example は以下のリンクから参照できます

https://github.com/vercel/next.js/tree/canary/examples/with-playwright

snapshot をとる部分は、以下のリンクを参考にしました

https://blog.cybozu.io/entry/2022/03/18/100000

experimental/testmode/playwright については、以下のリンクを参考にしました

https://github.com/vercel/next.js/tree/canary/packages/next/src/experimental/testmode/playwright

そのほか、参考にしたリンクなどはこちら