Table of Contents
はじめに
Nuxt.jsをDockerで開発するにあたって、E2Eテスト環境を用意するまでの軌跡です。 テストフレームワークには Jest 、ブラウザ操作には Puppeteer を利用します。
手順
- DockerでNuxtアプリをつくる
- Dockerコンテナ内でブラウザを起動できるようにする
- Jest+PuppeteerでE2Eテストできるようにする
DockerでNuxtアプリをつくる
アプリの前提の意味で、こんな感じでNuxt on Dockerを作っています紹介です。
yarn create nuxt-app
はターゲットのディレクトリ(今回はカレントディレクトリ)が空でないとエラーになるので要注意。初期設定は特に何も入れてません。
これでローカルにNuxtアプリのファイルが生成されるので、このアプリを動かすためのDockerfile
とdocker-compose.yml
をつくっていきます。
これをビルドして起動してみます。
http://localhost:3000
にアクセスできていればOKです。
Dockerコンテナ内でブラウザを起動できるようにする
PuppeteerをDockerで使う場合、コンテナ内でブラウザを起動させられるようにする必要があります。 Puppeteerのトラブルシューティング にやり方が載っているので、それに合わせてDockerfileを更新します。
これでHeadless Chromeを使ってPuppeteerでブラウザ操作をする環境ができます。
Jest+PuppeteerでE2Eテストできるようにする
最後にJest+Puppeteerの環境を整えていきます。 JestでPuppeteerを利用する手順は 公式ドキュメント にも載っています。
まず、Jest、Puppeteer、そしてその2つの設定をいい感じにやってくれるjest-puppeteer
のライブラリをインストールします。jest-puppeteer
のおかげで、page
やbrowser
などのPuppeteerのAPIが特に意識することなくGlobalに扱えたりします。
package.json
に追加されるのでコンテナを再ビルドしてコンテナイメージにも適用してきます。
次にconfigファイルをつくります。まずはjestの設定から。
これでjest-puppeteer
を活用できるようになります。次はjest-puppeteer
の設定をします。
Headless chromeの設定と、サーバー(アプリの起動)についての設定をします。
最後に、package.json
でテスト実行コマンドを定義します。
-i
オプションは--runInBand
オプションの省略形で、テストスイートを並列でテストしないオプションです。並列でテストしたときにそれぞれのテストスイートが影響しあってしまったのか、うまく行かないことがあったのでつけてます。
テストしてみる
では実際にテストが動作するか確認してみます。 まずはテストファイルを格納するディレクトリを作成し、テストファイルをつくりましょう。 Jestではデフォルトでtests
ディレクトリ次のファイルを読み込みます。( 参考 )
トップページにアクセスして、「app」の文字列がh1.title
要素に表示されていることをチェックするテストです。 では、実行。
パスしました。 コマンドの後ろにファイルパスを付けてもOKですし、つけない場合は対象のファイルを全部実行します。
テストの設定から動作確認まで、完了です。
結論
本記事では、Nuxt on DockerにおけるJest + PuppeteerのE2Eテスト環境のセットアップをしました。 Dockerコンテナ内でHeadless Chromeを操作できるようにするところが厄介ですが、公式のトラブルシューティングがありますのでご安心ください。 jest-puppeteerの利用についてもJestの公式サイトで言及されています。ソースをたどればそんなに難しくないかもです。