何年にもわたって Jest テストを作成した後、最近、スナップショット テストに出会いました。これは、特定の種類のコード、特に UI コンポーネントのテストを効率化できる Jest の機能です。よく知らない方のために説明すると、スナップショット テストは、コンポーネントのレンダリングされた出力が予期せず変更されていないことを確認する方法です。 Jest はコンポーネントの出力の「スナップショット」を生成し、それを保存します。今後のテストでは、現在の出力とこのスナップショットを比較し、意図しない変更を示す可能性のある差異にフラグを立てます。
この投稿では、Jest でのスナップショット テストに関するこれまでの経験を、その過程で遭遇した長所と短所を含めて共有します。飛び込んでみましょう!
スナップショット テストは、コンポーネントまたは関数の出力をキャプチャし、ファイルとして保存するテスト手法です。テストを実行すると、Jest は現在の出力と保存されたスナップショットを比較して、何か変更があったかどうかを判断します。
Jest でのスナップショット テストの簡単な例を次に示します。
// myComponent.test.js import renderer from 'react-test-renderer'; import Link from '../Link'; it('renders correctly', () => { const tree = renderer .create(<Link page="http://www.facebook.com">Facebook</Link>) .toJSON(); expect(tree).toMatchSnapshot(); });
このテストでは、Jest は MyComponent をレンダリングし、出力をスナップショットとして保存します。
// myComponent.test.js.snap exports[`renders correctly 1`] = ` <a className="normal" href="http://www.facebook.com" onMouseEnter={[Function]} onMouseLeave={[Function]} > Facebook </a> `;
その後のテスト実行では、Jest は新しい出力と保存されたスナップショットを比較して、変更がないか確認します。出力が変更された場合、Jest は違いを確認できるように警告します。
素早く簡単: スナップショット テストの作成は高速です。 toMatchSnapshot() を実行すると、Jest はコンポーネントの現在の構造のスナップショットを自動的に保存するため、機能に集中できるようになります。生成されたスナップショットは .snap ファイルに保存され、残りのスナップショットとともにバージョン管理されるため、変更をコード レビューしやすくなります。
ボイラープレートの削減: スナップショット テストは、特に複雑な UI 構造を扱う場合に、反復的なアサーションを排除するのに役立ちます。これは、UI の状態が頻繁に変化する Vue または React で特に役立ちます。
予期しない変更を検出する: スナップショット テストは、コード内の予期しない変更を検出するのに最適です。 UI コンポーネントの出力が予期せず変更された場合、Jest は失敗したテストとしてフラグを立て、変更を確認するよう求めます。これにより、リグレッションを早期に発見し、バグが隙間から漏れるのを防ぐことができます。
脆弱なテスト: スナップショット テストの欠点の 1 つは、時間の経過とともにテストが脆弱になる可能性があることです。 UI コンポーネントが頻繁に変更される場合は、スナップショットも頻繁に更新する必要がある場合があります。これにより、テスト結果に多くのノイズが含まれ、実際の問題を特定することが困難になる可能性があります。さらに、スナップショットが大きいと、開発者が変更を厳密に調査せずに無意識に承認してしまう「スナップショットブラインドネス」と呼ばれる現象が発生する可能性があります。
コンテキストの欠如: スナップショット テストが失敗した場合、出力が変化した理由を理解するのが困難になることがあります。 Jest は変更の視覚的な差分を提供しますが、変更の原因の完全なコンテキストを常に提供するとは限りません。これにより、特に複雑なコンポーネントの場合、デバッグの失敗がより困難になる可能性があります。
限られた洞察: スナップショットはコンポーネントの構造が変更されていないことを確認しますが、動作の側面は検証しません。これらのケースをカバーするには、単体テストまたは統合テストが必要になる場合があります。スナップショット テストは、コンポーネントの機能ではなく、コンポーネントの視覚的な出力をテストするのに最適です。
Jest のスナップショット テストは、UI コンポーネントをテストし、コードの変更をキャプチャするための強力なツールです。簡単なセットアップや予期せぬ変更の検出など、いくつかの利点がありますが、脆弱なテストや誤検知などの欠点もあります。おそらく、変更の頻度が低く、安定したスナップショットが必要なコンポーネントに対しては、スナップショット テストを控えめに使用する方がよいでしょう。また、スナップショット テストはテスト パズルの 1 ピースにすぎず、包括的なテスト範囲を確保するには他のテスト戦略と組み合わせて使用する必要があることを覚えておくことも重要です。
全体として、スナップショット テストはテストの武器庫に含めておくと便利な手法ですが、他のツールと同様に、慎重に使用し、その制限を理解することが重要です。スナップショット テストの長所と短所を比較検討することで、それがテスト ワークフローにとって正しい選択であるかどうかについて、十分な情報に基づいた決定を下すことができます。
以上がJest でのスナップショット テストの探索: 長所と短所の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。