ピクセル安定なキャプチャ
フォント読み込み待ち、アニメーションのピン留め、動的コンテンツのマスキングを備えた決定論的レンダリング — diff には本物のリグレッションが映り、ノイズではありません。
ScanU は、プロフェッショナルな Web チーム向けのビジュアルリグレッションおよびクロスブラウザ・スクリーンショットテストプラットフォームです。利用者が実際に使うブラウザとビューポートで、重要なページを 1 ピクセル単位で正確にレンダリングし、ユニットテストや E2E テストが静かに見逃すレイアウトの変化を浮かび上がらせます。
ScanU とは
ScanU は、リリース品質のラストワンマイル — ユーザーが実際に目にする部分 — を、チームが動ける「シグナル」に変えます。指定したページのピクセル安定なスクリーンショットを取得し、明示的なベースラインを保持したうえで、以降の実行を重要なブラウザとデバイスごとにそのベースラインと比較します。
多くのチームは、すでにリンター、型チェック、ユニットテスト、 E2E フローを回しています。しかしそれらがグリーンのままでも、 ボタンが 12 ピクセル落ち、モーダルがパディングを失い、Safari でメニューが崩れ、モバイルのブレークポイントがヒーローを 静かにリフローする、ということは起こります。機能テストは 振る舞いを検証しますが、ページが「どう見えるか」は検証しません。それこそがスクリーンショットテスト ツールの役目であり、ScanU が大仰さなしに行うことです。
内部では、ScanU は実在のレンダリングエンジン — Chromium、Gecko、WebKit — を、指定された URL またはコンポ ーネントプレビューに対して駆動します。各実行は、設定した (ブラウザ、ビューポート) のペアごとに決定論的なキャプチャ を生成します。最初に受理された実行がベースラインとなり、 それ以降は、すべての pull request、すべてのデプロイ、 すべてのスケジュール実行が、そのベースラインに対する diff となります。どのようなビジュアルリグレッションも、 コードレビューが変更された行を示すのと同じ要領で、レビュー 可能な変更として明示されます。
フルの 比較パイプライン は、スクリーンショット diff を本番ワークフローで本当に 使えるものにするための細部を引き受けます。アンチエイリア ス耐性、アニメーションの安定化、フォント読み込み、動的 コンテンツのマスキング、スクロール時のキャプチャ、そして 知覚的な diff しきい値 — サブピクセル単位のフォント ヒンティングの変化が、本物のレイアウトリグレッションを かき消さないようにするためです。
ScanU は、UI をユーザーとの契約として扱うチームのために 作られています。ビジュアルリグレッションテスト・ツール であり、クロスブラウザ・スクリーンショット比較ツールで あり、diff のレビューサーフェスでもある — それらを一つの プラットフォームにまとめ、ビルドとリリースゲートのあいだ に置きます。
フォント読み込み待ち、アニメーションのピン留め、動的コンテンツのマスキングを備えた決定論的レンダリング — diff には本物のリグレッションが映り、ノイズではありません。
Chromium、Gecko、WebKit を並列駆動し、ユーザーが実際に使うデスクトップ、タブレット、モバイルのビューポートを網羅します。
ベースライン、現在のキャプチャ、ハイライト付き diff を横並びに。承認・却下・ベースライン更新は常に明示的なアクションで、静かに流されることはありません。
既存のパイプラインの中でそのまま動作します。ステータスチェック、PR コメント、成果物のリンクは、エンジニアがすでにコードレビューをしている場所に表れます。
ScanU を Storybook、コンポーネントのサンドボックス、あるいはライブ URL に向けてください。トークン変更やコンポーネントリファクタリングは、リリース前に率直なビジュアル監査を受けられます。
スクリーンショットとメタデータは欧州のインフラに保管され、GDPR に準拠したデータ取り扱いが行われます — データ所在要件が厳しいチームにも適しています。
なぜ重要か
ビジュアルバグのコストは、開発時間で測られることはほとんどありません。測られるのは信頼です — 製品を開き、どこか微妙におかしいと感じたユーザーが、静かに「このチームは細部を気にしないのだな」と結論づけるときの、その信頼です。失った信頼を取り戻すのは難しく、ほとんどの場合、バグを出さない方が安上がりです。
機能テストは一つの問いによく答えてくれます。「クリックした とき、ボタンは正しいことを行うか?」 しかし、クリックする 前に起きること — ボタンの色が正しいか、サイズが正しいか、 位置が正しいか、360 ピクセルの画面で読めるか、直近の CSS リファクタ後にそもそも見えているのか — については沈黙し ます。リリース日インシデントの大半は、このすき間に住んで います。
私たちが目にする実際のリグレッション — そして ScanU が 捕捉するために設計されているもの — は、いくつかの予測 可能なトリガーの周りに集中する傾向があります。
gap を潰す。デスクトップでは レイアウトは同じに見えるが、768 ピクセルのタブレットでは 2 枚のカードが重なり始める。どれもアサーションを赤くしません。しかしすべてがユーザー 体験を損ねます。ScanU の仕事は、この二番目のタイプの 破損を、赤いユニットテストと同じくらい見やすく、レビュー しやすく、ブロックしやすいものに変えることです。diff が pull request に現れれば、デザイナーは、レビュワーが関数 シグネチャに口を出すのと同じ要領で意見を返せます — マージ の前に、そして本番に到達する前に、です。
この転換 — 「ステージングで誰かが気づくのを祈る」から 「ビジュアルの変更をコードの変更と同じようにレビューする」 への移行 — が、現代のリリースパイプラインにおけるビジュアル リグレッションテストツールの中心的な価値です。
クロスブラウザテスト
クロスブラウザテストは、IE6 時代から持ち越された懐古趣味の税ではありません。現代のエンジン — Chromium、Gecko、WebKit — は、あなたのレイアウトが静かに依存しているディテールで今なお食い違っており、本番障害のうち驚くほどの数が、誰も監査しなかったレンダリング差異にたどり着きます。
リグレッションが一つのエンジンだけに現れるとき、その理由は たいてい三つのいずれかです。あるエンジンで後に出荷された 機能が使われている、レイアウトがプラットフォームごとに 異なる指標(スクロールバー幅、フォントのベースライン、 スムージングアルゴリズム)に依存している、あるいは user-agent で条件分岐された polyfill が現場では開発機とは わずかに違う挙動をしている — の三つです。いずれもエンジン 非依存のテストスイートからは見えません。
クロスブラウザ監査でよく見る例:
date、datetime-local、select — は WebKit と Chromium で目に見えて異なる chrome で レンダリングされ、隣接要素が数ピクセル動くことがある。line-height が、Gecko では CTA をファーストビューの下に押し出す ことがある。gap、aspect-ratio、そしてコンテナクエリは、 各エンジンに若干異なる時期に着地した。ビルドが古い ベースラインを狙っていると、フォールバック経路は メイン経路とは異なるレンダリングになり得る。prefers-color-scheme、accent-color、そして Windows の forced-colors — はプラットフォームによって 異なる形で DOM に伝搬し、ローカルの開発環境では見落とし やすい。ScanU は、設定されたすべてのエンジンとビューポートに 対して各ページを 1 回の実行で捕捉します。フィクスチャと タイミングフックを同一にしたうえで行われるため、表示 される diff は本物のレイアウト差異であり、ブラウザごとに ハーネスが違うことによる副作用ではありません。完全な クロスブラウザ機能 は製品ページに記載されています。設定したマトリクスが、 実行のたびに捕捉されるマトリクスです。
デザインシステムを提供するチーム、あるいはビジュアル アイデンティティがブランドの一部である製品にとって、 このマトリクスは贅沢品ではありません。お客様が Safari で 目にするものが、あなたが Chrome で承認したものと一致して いることを確かめる、唯一の方法です。
| ブラウザ | ビューポート | ステータス |
|---|---|---|
| Chromium 124 | 1440 × 900 | ベースラインと一致 |
| Firefox 126 | 1440 × 900 | ベースラインと一致 |
| WebKit (Safari 17) | 1440 × 900 | ビジュアル diff · 要レビュー |
| Chromium 124 | 768 × 1024 | ベースラインと一致 |
| WebKit (Safari 17) | 768 × 1024 | レイアウトシフトを検出 |
| Chromium 124 | 390 × 844 | 新しいベースラインが保留中 |
スクリーンショット比較の仕組み
ビジュアル diff ツールの有用性は、生成する diff の SN 比に尽きます。ScanU のキャプチャパイプラインは、二つの実行の間で変わるのが「あなたが実際に変更したもの」だけになるよう設計されています — 周囲のフォント、アニメーション、タイムスタンプ、広告枠といった「書き割り」は変わりません。
各実行は 3 段階のパイプラインです。まず ScanU は各ブラウザ エンジンでテスト対象のページまたはコンポーネントへ遷移し、 設定された一式の readiness シグナル — フォント読み込み 完了、画像のデコード完了、ネットワークの静止、data-ready 属性、あるいはカスタムの JavaScript プローブ — を待機し、すべての CSS アニメーションを最終 フレームにピン留めします。次に、同じ実行のなかで、設定 されたそれぞれのビューポートでページをキャプチャし、長い ページには scroll-stitching を使って可視領域だけでなく 完全なアーティファクトを取得します。最後にそのキャプチャ を承認済みベースラインと比較し、(ブラウザ、ビューポート) のペアごとに結果を出します:一致、許容範囲内、または 有意に異なる、のいずれかです。
比較そのものは素朴なピクセル diff ではありません。ScanU は 知覚的モデルを用い、アンチエイリアス、サブピクセル レンダリング、色空間のわずかな揺らぎを理解します。これに より、WebKit のカーニングの癖がバグと誤認されることは ありません。読み込みごとに変わることが分かっている領域 — ライブデータ、相対時刻、ランダム化コンテンツ、カルーセル — には明示的なマスクを設定でき、それらの領域は diff に ノイズをまったく足しません。
本物の変化が現れたとき、プラットフォームは 3 枚の同期 されたペインを提示します:ベースライン、現在のキャプチャ、 そして動いた箇所を正確に示す diff オーバーレイです。各 変更にはレビュー可能な判断 — 承認、却下、ベースラインの 更新 — が一つずつ記録され、その判断はプロジェクト履歴の 一部になります。暗黙のドリフトも、自動承認もありません。 ベースラインが動くのは、権限のある人間が「動かす」と 明言したときだけです。
同じパイプラインは 3 つのエントリポイントから駆動できます: ライブ URL(本番、ステージング、PR プレビュー)に対して、 静的サイトあるいはビルドされたアセットバンドルに対して、 Storybook スタイルのサンドボックス内のコンポーネント プレビューに対して。多くのチームは、一つ目をリリース ゲートとして、二つ目をデプロイ成果物のために、三つ目を デザインシステム作業のために使います — いずれも同一の ベースライン保管庫に注ぎ込みます。
このページ、このブラウザ、このビューポートに対する最後に承認されたレンダリング。レビュワーが明示的に更新するまで凍結されます。
この実行のキャプチャ。同じフィクスチャ、同じタイミングフック、同じビューポート — テスト対象のコードだけが変わっています。
アンバー色でハイライトされた領域は、現在のレンダリングが設定された許容範囲を超えてベースラインから逸脱した箇所を示します。
ScanU が向いているチーム
ScanU は、仕事の評価がユーザーに見えるもので決まるチームのために作られています。聞こえるより広い集団です — デザイナーやフロントエンドエンジニアだけでなく、リリース判断が「特定のブラウザで、特定のビューポートで、特定の日に UI が正しく表示されるか」に依存するすべての人を含みます。
フロントエンド / フルスタックエンジニア は、ScanU を pull request パイプラインの最終段として 使います:ビルドがグリーン、ユニットテストが通り、E2E スイートも満足している — そのうえでビジュアル diff が、 変更がデザイナーの意図と一致することを確認するか、 パッチを読んだだけでは気づけないリグレッションを浮かび 上がらせるかのどちらかを行います。結果として、リリース 後の火消しに費やす時間は減り、本当にプロダクトを前進 させる仕事に使える時間が増えます。
QA エンジニアは、セレクターを書き直す ことなくスケールするテスト層を手に入れます。ビジュアル スイートへの新ページ追加は、URL とベースラインだけで 済みます — 1 週間かけて脆い XPath と格闘する必要は ありません。UI リグレッションを捕まえる層が、ユーザー からの事後報告を待つ Slack メッセージではなく、テスト ピラミッドの一級市民になります。
デザインシステム / プラットフォームチーム は、ライブラリ内のすべてのコンポーネント サンドボックスに対して ScanU を走らせます。あるトークン が変われば、依存するコンポーネントはすべて自動的に ビジュアル監査を受けます。コンポーネントがリファクタ されれば、下流の利用者は新版が着地する前に diff をレビュー できます。こうしてデザインシステムは、何年にもわたる 静かなリグレッションの蓄積を避けられます。
プロダクト / エンジニアリングリード は、レビューサーフェスを証跡として使います。リリース ノートには、各リリースで承認されたビジュアル diff への リンクを含められます。ポストモーテムでは、リグレッション が捕捉されたのか、見落とされたのか、明示的に受け入れ られたのかを参照できます。時間が経つにつれ、プラット フォームは UI の変遷と、各段階で承認した人物の記録に なっていきます。
ユースケース
同じプラットフォームが、まったく異なるワークフローを支えます。共通するのは、これらのチームがいずれも「お客様が気にするペース」で UI をリリースしており、UI が「あるべき姿」にあるかを一目で確認する方法を必要としている、という点です。
チームの形がどうであれ、ScanU は通常、次の 5 つのうちの いずれかの理由で採用されます:ビジュアルリグレッションが 捕まえられたはずの直近の本番インシデント、人手での監査が 不可能なデザインシステム移行、「テストがグリーン」以上の リリースゲートを要する CI/CD ワークフロー、ビフォー/ アフターの証跡を必要とする顧客向け納品物、あるいは EU ホストのテストツールを選好するコンプライアンス姿勢です。 これら 5 つすべての背後には共通の CI/CD 連携 があり、トリガーが PR でもマージでも夜間スケジュールでも、 同じパイプラインが仕事をします。
クライアントに、サイトごとの週次ビジュアル差分を提供。契約にあるすべてのブラウザで、各スプリントごとに「ビフォー/アフター」の証跡を、1 つのレポートにまとめます。
テストピラミッドにビジュアル層を追加。新しいページは URL とベースラインでスイートに加わり — 脆いセレクターも、手作りのスクリーンショットスクリプトの保守も不要です。
スクリーンショット diff は pull request 上にインラインで表示されます。レイアウトリグレッションは本番でも顧客の Slack スレッドでもなく、レビューで捕まります。
ホームページを壊さずに速く動く。リデザイン、A/B テスト、トークン移行をまたいで、マーケティングサイトをピクセル安定に保つ決定論的なセーフティネット。
各コンポーネントサンドボックス上でビジュアルカバレッジを実施。トークン変更、テーマスワップ、コンポーネントリファクタは、ライブラリの公開前に自動で監査を受けます。
モバイル、タブレット、デスクトップのブレークポイントを同じ実行で検証。レスポンシブのテストは、スクリーンショットを撮り回る雑務から、レビューのステップになります。
CI/CD とリリースの確信
リリースの確信は感覚ではなく、リリースされようとしているものの真実を語るパイプラインです — テストランナーが意見を持てない部分も含めて。ScanU はそのパイプラインに、ステータスチェック、PR コメント、保存済み成果物として接続し、あらゆるポストモーテムから参照できます。
連携モデルは意図して退屈です:ScanU のキャプチャステップ は、既にテストを走らせているのと同じジョブで走り、PR 上に pass、review-needed、fail のいずれかを報告します。その ステータスは、他の必須チェックと同じように扱われます。 チームはすでにパイプラインの緑・黄・赤の読み方を知って います — そのリズムの中にビジュアルリグレッションチェック を差し込むことで、新しい思考モデルを求めずに安全の次元を 一つ加えられます。
内部では、ScanU は現代の CI/CD の現実を前提に設計されて います:
ステップバイステップの CI/CD 連携ガイド には、GitHub Actions、GitLab CI、Bitbucket Pipelines、 セルフホストランナー向けの具体的な配線方法が記載されて います。一般的なケースはジョブを 1 つ追加するだけで済み、 高度なケースは段階的リリースを横断してベースラインを 前進させる環境マトリクスになります。
GDPR · EU ホスティング · プライバシー
テストの成果物はデータです。スクリーンショットは、ページに出ていた個人情報 — ナビゲーションバーの名前、プロフィールメニューのメールアドレス、確認画面の注文番号 — を、意図せず取り込むことがあります。責任あるビジュアルテストプラットフォームは、それらの成果物を、反映元の本番データと同じ注意をもって扱います。
ScanU は欧州連合内で構築され、ホスティングされ、保管と 処理もすべて EU で運用されるインフラ上で行われます。 データ所在の義務を負うチーム — 規制産業、公共部門の バイヤー、プライバシーに敏感な B2B 顧客 — にとって、 これは好みではなく調達要件であることが多く、ScanU は 製品能力を犠牲にすることなくこの要件を満たすよう設計 されています。
この姿勢から、いくつかの意図的な設計判断が導かれます:
完全なプライバシーポスチャ — サブプロセッサ、リージョナル ホスティング、DPA、保持期間 — については、 GDPR とデータ取り扱いに関するドキュメント をご覧ください。多くのチームにとって大事なのは短い答え です:あなたのスクリーンショットは EU にとどまり、 プラットフォームはそれが EU にとどまり続けるように 作られています。
違い
ビジュアルテストは混み合ったカテゴリです。ScanU を差別化するものの大きな部分は「やらないこと」です — 取らないショートカット、レビュー行列に流さないノイズ、そして diff の正しいレビューのされ方に対する意見です。
汎用のスクリーンショットツールは、テストランナーに貼り 付けるライブラリとして提供されることが多く、タイミング、 フォント、アニメーション、そして「1 ピクセルのずれは 本物のバグか丸め誤差か」という永遠の問いはあなたに任され ます。ScanU はより強い立場を取ります:プラットフォームが 決定論的なキャプチャを生み出せないのなら、それは プラットフォームの問題であって、あなたの問題ではない、と。 だからこそ、readiness シグナル、フォント読み込み、 アニメーション固定、scroll-stitching、知覚的 diff、マスク 領域はすべて組み込み機能であり、後付けの貼り合わせでは ありません。
価格設計も同じ論理に従います。ふつうのチーム — 数十 ページ、3 エンジン、3 ビューポート、1 つのパイプライン — にとって、ビジュアルカバレッジのコストは予算会議で弁護 する必要のある項目であってはいけません。完全な 価格ページ は、各ティアに含まれるもの、実行としてカウントされるもの、 上限がどこかを、明快な数字で書いています。自分たちが 設計したとおりの UI を出したいだけのチームに、カスタム 見積もりは必要ありません。
安定化、フォント readiness、アニメーション固定、scroll-stitching はプラットフォームの機能です — あなたのリポジトリで保守するスニペットではありません。
diff エンジンはアンチエイリアスとサブピクセルレンダリングを理解するため、目に見えない微小なズレが、本当に重要なリグレッションをかき消すことはありません。
ベースラインが動くのは、権限のある人が変更を承認したときだけです。更新はすべて監査可能で、静かなドリフトは起こりません。
スクリーンショット、メタデータ、レビュー履歴は EU のインフラ上にあります。その姿勢を守らなければならないチームにとって、オプトインは不要です。
ScanU が捕まえるもの
ビジュアルリグレッション・プラットフォームが捕まえるバグの大半は、エキゾチックなものではありません。小さく、派手さがなく、見落としやすい破損 — アサーションがそれを監視していないために、レビュワーのすり抜けを許すもの — です。以下は、ScanU が特に表面化させるべく作られたカテゴリの一例です。
ビジュアルバグは、少数の繰り返しパターンに集中します。 一件ずつ見ると些細に見え、どれも赤いテストなしで本番へ 届き得ます。これらはすべて、PR がマージされる前の次回の ScanU 実行で diff として表面化します。
backdrop-filter を autoprefix していた PostCSS プラグインを取り落とす。 Safari では、ぼかしが効いていたナビゲーションバーが、 突然不透明になる。text-wrap: balance に頼ったデザインが Chrome ではきれいに決まるのに、未出荷のエンジンでは バランスを欠いたまま。クロスブラウザのチェックなしでは、 開発者のマシンでは見えない。機能概要 では、検出プリミティブ — 知覚的許容、マスク領域、 スクロールキャプチャ、ベースラインのブランチング — を さらに詳しく説明し、各プリミティブが上のどのカテゴリに 対応するかを示しています。多くのチームにとって短い答え はこうです:ビジュアルに変化があれば ScanU が気づき、 意図通りならワンクリックで受け入れ、そうでなければ 他の誰よりも先に捕まえた、ということです。
FAQ
次のステップ
ビジュアルリグレッションテストがあなたのパイプラインに属するかを判断する最速の方法は、すでに出荷しているプロジェクトに対して一度走らせてみることです。ScanU は無料で始められ、既存の CI ジョブには数分で組み込め、最初の diff は次のコミットで生まれます。
多くのチームは、まずトラフィックの多い 1 ページを 3 つの ブラウザと 3 つのビューポートで動かすところから始めます。 プラットフォームの動きを見るのにも十分ですし、現行のテスト スイートが見落としたであろう次の本物のリグレッションを 捕まえるにも十分です。
そこから、チームの自信に合わせてスコープが広がっていきます: より多くのページ、より多くのブレークポイント、デザイン システムのコンポーネント単位カバレッジ、すべての pull request に対する必須のステータスチェック。打ち合わせの 予約も、特注のオンボーディングも、最低利用期間もありません。