BackstopJSで行うビジュアルリグレッションテスト


こんにちは、Gaji-Labo 石垣です。

今回は Gaji-Labo が使っている BackstopJS というビジュアルリグレッションテストツールをご紹介します。

BackstopJSとは

ビジュアルリグレッションテスト (ある変更を加える前後でスクリーンショットを作成し、それらを比較することで意図しない挙動が無いかを検証するテスト手法) を行うことが出来る npm パッケージです。

Gaji-Labo では主に CSS に関する作業で、意図しない崩れをチェックし、問題がないことを担保するのに使用しています。

とにかく手軽で、すぐに導入し、撮る URL を設定し、ローカルでコマンドを叩くだけでテストが実行できるのが特徴です。

BackstopJSのテスト結果画面。テストしたページの見た目の差分が色で表示されています。
BackstopJSのテスト結果画面。このようにテストしたページの見た目の差分が色で表示されています。

使い方

導入

$ npm install backstopjs

yarn の場合は $ yarn add backstopjs で導入します。

この時 backstop と入れるとダミーファイルが入った別のライブラリが導入されるので注意します。

設定

導入後、$ backstop init を叩くことで設定用ファイルとキャプチャを格納するフォルダ /backstop_data が作成されます。

設定は生成された設定用ファイル backstop.json に記述します。

最低限の設定として、id, viewports, scenariosの設定が必要です。

{
  "id": "backstop_default", // 生成されるスクリーンショット名に使用されるテストの id です
  "viewports": [ // キャプチャを撮る画面サイズを設定します。複数を設定可能ですが1つは必須です
    {
      "label": "tablet", // 画面サイズのラベルです
      "width": 1024, // 画面幅です
      "height": 768 // 画面高さです
    }
  ],
  "scenarios": [ // キャプチャを撮るURLを設定します。複数を設定可能ですが1つは必須です
    {
      "label": "index", // URLのラベルです
      "url": "http://localhost:8000/", // キャプチャ対象のURLです
    }
  ]
}

変更前のキャプチャを撮影

$ backstop reference で変更前のURLのキャプチャを撮影し、/backstop_data/backstop_reference フォルダに格納します。

変更後のキャプチャを撮影し、差分比較

作業を追加した後、$ backstop test を叩いて変更後のURLのキャプチャを取得します。

ここで $ backstop reference を叩くと先程取得した reference が全部消えるので注意します。

テストが終わった後、結果画面がターミナルとブラウザに表示されます。

設定したビューポートとシナリオ毎に差分が表示されます。前述の設定の場合だと、tablet で設定した画面サイズで http://localhost:8000/ の差分が表示されます。

差分を確認した後、変更に問題がなければ $ backstop approve を叩くと reference のキャプチャを test で取得した方のキャプチャに置き換えます。

細かい設定

backstop.json の設定を書き換えることで、キャプチャの待機時間や撮影のトリガーとなる要素を設定したり、テストする上で不要な要素(例えばランダムでアクセスの度に表示が変わる要素など)を非表示にしてからキャプチャを撮影するように設定することもできます。

詳しい設定方法は公式ドキュメントをご覧ください。

また、 BackstopJS ではキャプチャにヘッドレスブラウザの puppeteer を使用しており(デフォルト。設定で chromy にも変更可能です)、puppeteer の機能を使ってキャプチャ前にWebサイトのインタラクションを作動させたり、ログインをさせることも可能です。

まとめ

今回は BackstopJS というツールを紹介しました。

Gaji-Labo ではこのようなツールを導入してチェックを効率化しています。

Gaji-Laboでは、JavaScriptフレームワーク経験が豊富なパートナーさんを募集しています

Gaji-Laboでは、開発チームの一員としてプロジェクトに一緒に取り組んでくれる業務委託のパートナーさんを募集しています。

現在は特にJavaScriptフレームワーク実践と業務経験が豊富なWebフロントエンドエンジニアを必要としています。React + TypeScript、Vue.js、Next.js、Nuxt.js など、あなたの得意なフレームワークを教えて下さい!

パートナー契約へのお問い合わせもお仕事へのお問い合わせも、どちらもいつでも大歓迎です。まずはオンラインでのリモート面談からはじめましょう。ぜひお気軽にお問い合わせください!

お問い合わせしてみる!

関連リンク


投稿者 Ishigaki Shotaro

未経験から Gaji-Labo に入社。現在は React/TypeScript/Next.js の案件で MUI を使ったコンポーネント組み込みを担当。プロジェクトチームのリードとして共に組み込み作業をしているメンバーの進行管理も行っています。休日はだいたい家で音楽を聴いており、たまにライブに出かけています。