Nightwatchを使用したビジュアルリグレッションテスト(VRT)
概要
ビジュアルリグレッションテスト(VRT)は、アプリケーションに変更が加えられる前と後のユーザーインターフェイスのスクリーンショットまたは画像を比較するソフトウェアテスト手法の一種です。 VRTの目標は、レイアウト、色、タイポグラフィ、その他の視覚要素の変更など、開発中に意図せずに導入された可能性のある視覚的な変更を検出することです。
ビジュアルリグレッションテストには通常、次の手順が含まれます。
- 変更が加えられる前と後のアプリケーションまたはWebページのスクリーンショットをキャプチャします。
- スクリーンショットをピクセル単位で比較して、違いを特定します。
- 違いをレビューおよび分析して、意図的なものか意図的でないものかを判断します。
- 変更が意図的な場合は承認します。
仕組み
Nightwatchは、ネイティブな依存関係がないJavaScript画像処理ライブラリであるJIMPを使用して、画像比較を実行します。
Nightwatchロジック
- 要素が存在するのを待ちます
- スクリーンショットを撮ります
- スクリーンショットをベースラインと比較します
- 現在のスクリーンショットとベースライン間の視覚的な違いをVRTレポートに表示します
インストール
ステップ1
このコマンドを使用してプラグインをインストールします
npm i @nightwatch/vrt --save-dev
ステップ2
Nightwatch構成を更新して、プラグインをリストに追加します
module.exports = {
plugins: ['@nightwatch/vrt']
// other nightwatch settings...
}
ビジュアルリグレッションテストの作成
nightwatch-vrt
を使用するには、screenshotIdenticalToBaseline
アサーションを呼び出し、比較するDOM要素のCSSセレクターを渡すだけです。カスタムファイル名、visual_regression_settings
オーバーライド、およびカスタムログメッセージを渡すこともできます。
screenshotIdenticalToBaseline
は、入力として4つのパラメーターを受け取ります。
selector
- スクリーンショットでキャプチャされる要素を識別しますfileName
- このスクリーンショットのオプションのファイル名。デフォルトはセレクターですsettings
- デフォルトおよびvisual_regression_settings
をオーバーライドするためのオプションの設定message
- 完了時にNightwatchがログに記録するオプションのmessage
例:
describe('VRT demo test', function() {
it('Test Google UI loads correctly', function(browser) {
browser
.navigateTo('https://www.google.co.uk')
.assert.screenshotIdenticalToBaseline('body', /* Optional */ 'custom-name', {threshold: 0.0}, 'VRT custom-name complete.')
.end()
})
})
テストを初めて実行すると、ベースラインスクリーンショットが作成され、ディスクに保存されます。常にベースラインスクリーンショットを登録する必要があります。このテストをさらに実行すると、このベースラインと比較されます。
ビジュアルリグレッション設定
Nightwatch VRTには、慎重に検討されたデフォルト設定が付属しています。次にリストを示します。
- generate_screenshot_path
default none
- スクリーンショットパスを生成する渡された関数 - latest_screenshots_path
default "vrt/latest"
- 最近キャプチャされたスクリーンショットへのパス - latest_suffix
default ""
- 最近キャプチャされたスクリーンショットの末尾に追加される文字列 - baseline_screenshots_path
default "vrt/baseline"
- ベースラインの予想されるスクリーンショットへのパス - baseline_suffix
default ""
- ベースラインスクリーンショットの末尾に追加される文字列 - diff_screenshots_path
default "vrt/diff"
- 2つのスクリーンショットの差分画像へのパス - diff_suffix
default ""
- 差分画像の末尾に追加される文字列 - threshold
default 0.0
- 一致のしきい値。0
から1
の範囲です。値が小さいほど、比較がより敏感になります - prompt
default false
- trueの場合、最近キャプチャしたスクリーンショットが異なる場合、ユーザーはベースラインスクリーンショットを上書きするように求められます - updateScreenshots
default false
- trueの場合、最近キャプチャされたスクリーンショットは常にベースラインを上書きします
ただし、これらはnightwatch.conf.js
を介してグローバルにオーバーライドできます。以下を参照してください。
module.exports = {
//... other config
'@nightwatch/vrt': {
latest_screenshots_path: 'vrt/latest',
latest_suffix: '',
baseline_screenshots_path: 'vrt/baseline',
baseline_suffix: '',
diff_screenshots_path: 'vrt/diff',
diff_suffix: '',
threshold: 0.00,
prompt: false,
updateScreenshots: false
},
}
さらに、設定は、screenshotIdenticalToBaseline
アサーションの一部として例に示すように、JSONオブジェクト(設定引数)として渡すことによってもオーバーライドできます。関数引数として渡される設定は、構成ファイルおよびデフォルト値の設定をオーバーライドします。
レビュー
テストの実行が完了すると、レポートが生成されます。 vrt-report
フォルダーの下にあります。手動で開くか、実行テストコマンドで--open
を使用すると、レポートが自動的に開きます。
ベースラインと差分
これは、ベースラインイメージと差分をどのように表示するかを示しています。一致しなかったすべてのピクセルは、差分画像で赤色でマークされています。
ご覧のとおり、差分%も表示されています。差分%がしきい値よりも小さい場合、VRTエンジンはテストを失敗としてマークしません。
ベースラインと最新
これは、現在のイメージがベースラインイメージとどのように異なるかを示しています。
承認
すべての視覚的な変更が意図的であることを確認したら、--update-screenshots
フラグを使用してベースラインを更新できます。これは、今後の比較がすべて新しいベースラインに対して行われるため、重要です。
例:
npx nightwatch <path to tests> --update-screenshots