📄
概念 📚 software-design-concepts

テスト種別(UI・ビジュアル)

スナップショットテスト・ビジュアルリグレッションテスト・Storybookを活用したUIコンポーネントの品質保証

UIテストはコンポーネントが正しく描画・操作できるかを検証するテストだ。機能テストが「ロジックが正しいか」を問うのに対し、UIテストは「ユーザーが見て・触れるインターフェースが意図通りか」を問う。Webフロントエンドにおいては、Reactなどのコンポーネントのレンダリング結果・インタラクション・スタイルの全てが検証対象になる。

スナップショットテストはコンポーネントのレンダリング結果をシリアライズしてファイルに保存し、次回実行時との差分を検出する。JestやVitestでtoMatchSnapshot()として提供されている。変更の検出は容易だが、スナップショットを機械的にupdateする習慣が根付くと意図しない変更の検知機能が形骸化する。ビジュアルリグレッションテストはスクリーンショットのピクセル差分を比較する手法で、Chromatic・Percy・reg-suitが代表的なツールだ。

Storybookはコンポーネントの独立したカタログを作成し、デザイナーとエンジニアの協働ベースになる。play functions機能を使えばStorybook上でユーザーインタラクション(クリック・入力等)を定義してテストできる。Storybookのストーリーをvitest-storybookでユニットテストとして実行する統合も進んでいる。レスポンシブ対応やモバイル表示のビジュアルテストもViewport設定で可能だ。

コードレビューで着目するポイント

  • スナップショットファイルの差分が意図した変更だけを反映しているか
  • スナップショットが肥大化してレビュー不可能なサイズになっていないか
  • ビジュアルリグレッションテストの感度閾値が誤検知・見逃しのバランスで設定されているか
  • Storybookのストーリーがコンポーネントの代表的な状態(エラー・ローディング・空状態等)を網羅しているか
  • play functionsでのインタラクションテストがユーザーの操作を正しく模擬しているか
  • レスポンシブ対応のビジュアルテストが主要なBreakpointをカバーしているか
  • ビジュアルテストのベースライン更新プロセスがレビュー済みの変更だけに限定されているか

典型的なアンチパターン

スナップショットの形骸化: テスト失敗時に内容を確認せずjest --updateSnapshotを実行する習慣が定着する。意図しない変更も全てスナップショットに取り込まれ、リグレッション検出機能が失われる。

ビジュアルテストのノイズ過多: アンチエイリアスや動的コンテンツ(日付・ランダムID)が含まれることでスクリーンショット差分が常に発生する。確定的なデータでStoryを構築し、動的部分はモックする必要がある。

Storybookのメンテナンス放棄: コンポーネントが変更されてもStorybookのストーリーが更新されず、実際のコンポーネントと乖離したカタログが残り続ける。Storybookをテスト基盤として使わないと更新のインセンティブが失われる。

参考リソース

  1. 1. 📄アーキテクチャスタイル
  2. 2. 📄ドメインモデリング
  3. 3. 📄モジュール分割と依存管理
  4. 4. 📄データモデリング
  5. 5. 📄API設計
  6. 6. 📄整合性とトランザクション
  7. 7. 📄非同期処理(Queue/Event)
  8. 8. 📄キャッシング
  9. 9. 📄ユーザーリサーチ
  10. 10. 📄情報アーキテクチャ
  11. 11. 📄インタラクションデザイン
  12. 12. 📄UX原則とヒューリスティクス
  13. 13. 📄アクセシビリティ(UX観点)
  14. 14. 📄UXメトリクス
  15. 15. 📄スケーラビリティ
  16. 16. 📄可用性とレジリエンス
  17. 17. 📄オブザーバビリティ
  18. 18. 📄環境・インフラ設計
  19. 19. 📄データマイグレーション
  20. 20. 📄セキュリティ設計原則
  21. 21. 📄データ保護とマルチテナント
  22. 22. 📄LLMセキュリティ
  23. 23. 📄ビジュアルデザイン原則
  24. 24. 📄デザインシステム
  25. 25. 📄コンポーネント設計
  26. 26. 📄スタイリング
  27. 27. 📄設計原則
  28. 28. 📄デザインパターン(GoF)
  29. 29. 📄エンタープライズパターン
  30. 30. 📄クリーンコード
  31. 31. 📄リファクタリング
  32. 32. 📄型設計とコントラクト
  33. 33. 📄関数型プログラミング概念
  34. 34. 📄エラーハンドリング
  35. 35. 📄テスト戦略と哲学
  36. 36. 📄テスト種別(機能テスト)
  37. 37. 📄テスト種別(UI・ビジュアル)
  38. 38. 📄テスト種別(契約・境界)
  39. 39. 📄並行処理・マルチスレッド
  40. 40. 📄パフォーマンス最適化
  41. 41. 📄ドキュメント管理
  42. 42. 📄バージョン管理と開発プロセス
  43. 43. 📄脅威モデリング
  44. 44. 📄通信保護(TLS)
  45. 45. 📄暗号化・機密情報管理
  46. 46. 📄認証・セッション管理
  47. 47. 📄認可・アクセス制御
  48. 48. 📄入力バリデーション
  49. 49. 📄インジェクション攻撃
  50. 50. 📄正規化(データベース正規化)