📸

jest-image-snapshotをTypeScriptで使ってみる

2022/02/26に公開

はじめに

  • この記事では、jest-image-snapshot + TypeScriptを使用したサンプルコードを紹介します。

対象読者

jest-image-snapshotとは

https://www.npmjs.com/package/jest-image-snapshot

  • Jestでテスト結果を比較する時に画像データについても比較出来るようにするライブラリです。
  • expecttoMatchImageSnapshotが追加され、それを使用することによって画像データの比較を行います。

動作環境

  • Node.js - 14.x
  • Yarn - 1.22.x
  • TypeScript - 4.5.x
  • Jest - 27.5.x
  • ts-jest - 27.1.x
  • jest-image-snapshot - 4.5.x
  • @types/jest-image-snapshot - 4.3.x

サンプルコード

設定ファイル

test/jest-setup.ts
// @types/jest-image-snapshotをインストールすることによりTypeScriptでもjest-image-snapshotを参照できます。
import { toMatchImageSnapshot } from 'jest-image-snapshot';

// Jestのsetup時にtoMatchImageSnapshotを使用できるようにします。
expect.extend({ toMatchImageSnapshot });
jest.config.js
module.exports = {
  moduleFileExtensions: ['js', 'ts'],
  transform: {
    '^.+\\.ts$': 'ts-jest',
  },
  testMatch: ['<rootDir>/test/**/*.+(ts|js)'],
  // 上記のtest/jest-setup.tsをsetupファイルとして設定します。
  setupFilesAfterEnv: ['./test/jest-setup.ts'],
  // jest-setup.tsをテスト対象外にします。
  modulePathIgnorePatterns: ['jest-setup.ts'],
};

テストコード

test/sample.test.ts
describe('image test', () => {
  it('test1.png ok', () => {
    // test/test.pngを読み込む
    const imagePath = path.join(process.cwd(), 'test/test.png');
    const file = fs.readFileSync(imagePath);
    
    // 読み込んだ画像データを比較
    expect(file).toMatchImageSnapshot();
  });
});

test/test.png

動作確認

1.初回実行

  • テストを実行すると test/__image_snapshots__/sample-test-ts-image-test-test-png-1-snap.png にスナップショットファイルが作成されます。

2.画像を変更して実行

test/test.pngの内容変更

  • 画像ファイルの内容を変更します。

実行結果

  • テストが失敗します。
  • test/__image_snapshots__/__diff_output__/sample-test-ts-image-test-test-png-1-diff.pngにDIFF画像ファイルが作成されます。

DIFF画像

  • スナップショット、DIFF画像、テスト画像の順に並べられて画像ファイルとして出力されます。
  • DIFF画像では差分箇所が赤色で強調表示されます。
  • toMatchImageSnapshotに設定するパラメータによって、何パーセント変更されたら失敗などの設定も可能です。

おわりに

  • 簡単に画像のスナップショットテストが実装出来ました。
  • 画像ファイルのリグレッションテストとして使用するのに便利です。
  • e2eテストツールと連携するとテストの幅が広がりそうです。

ソースコード一式

https://github.com/yasu-s/jest-image-snapshot-sample/tree/demo

関連記事

https://zenn.dev/kakkoyakakko/articles/a5ab80d0341a47#e2eテスト

https://zenn.dev/kakkoyakakko/articles/023cc3cb491c3e

Discussion