Visual Regression Testing — Percy / Chromatic / Playwright Snapshot 完整對比
Visual regression 測試完整指南。Pixel diff vs DOM diff、Playwright snapshot 免費版、Percy / Applitools / Chromatic 比較、AI 視覺比對、跨平台一致性、CI 整合。
💡 本文原刊於 qa.9niche.com,2026-08 併入 9niche.com 懶人包,內容照原文完整搬遷。
目錄
1. 前言
「UI 改 padding 改死人」、「按鈕從 red 變 dark-red 沒人發現」 — 這些功能性測試抓不到的、Visual Regression 抓得到。這篇給你完整工具地圖 + 實戰 setup。
2. 為什麼功能測試不夠
3. Visual Regression 工作流
4. 工具對比
| 工具 | 起跳價 | 強項 | 弱項 |
|---|---|---|---|
| Playwright Snapshot | 免費 | 內建、簡單 | 沒 UI / approval workflow |
| Percy | $39/月 | BrowserStack 整合、UI 強 | 貴 |
| Chromatic | 免費起跳 | Storybook 親兒子 | 限 Storybook 友善 |
| Applitools | $1500/年 | AI 視覺、跨平台 | 企業向、起價高 |
| BackstopJS | 免費 | Open source、CLI | 自架、UX 普通 |
| Loki | 免費 | Storybook 整合 | 維護慢 |
5. Playwright Snapshot — 起步首選
基本用法
import { test, expect } from '@playwright/test';
test('homepage looks right', async ({ page }) => {
await page.goto('https://example.com');
await expect(page).toHaveScreenshot('homepage.png');
});
第一次跑 → 建立 baseline homepage.png。 之後跑 → 比對 baseline、有差 → fail。
配置(playwright.config.ts)
export default defineConfig({
use: {
// 關掉動畫避免 flaky
actionTimeout: 0,
},
expect: {
toHaveScreenshot: {
// 允許 0.1% 像素差異(防 anti-aliasing flaky)
maxDiffPixelRatio: 0.001,
// 動畫 disabled
animations: 'disabled',
// 截圖時隱藏 cursor
caret: 'hide',
},
},
});
進階:mask 動態元素
test('avoid time / random masking', async ({ page }) => {
await page.goto('/dashboard');
await expect(page).toHaveScreenshot('dashboard.png', {
mask: [
page.locator('.timestamp'),
page.locator('.random-banner'),
page.locator('time'),
],
});
});
跨裝置
test.describe('responsive', () => {
for (const device of ['Desktop Chrome', 'iPhone 13', 'iPad Pro']) {
test(`looks right on ${device}`, async ({ browser }) => {
const context = await browser.newContext({ ...devices[device] });
const page = await context.newPage();
await page.goto('/');
await expect(page).toHaveScreenshot(`home-${device}.png`);
});
}
});
更新 baseline
npx playwright test --update-snapshots
code review 時帶上 baseline diff 截圖、reviewer 才看得出變化是預期還是 bug。
6. Percy — 企業選擇
Setup
npm install --save-dev @percy/cli @percy/playwright
import { test } from '@playwright/test';
import percySnapshot from '@percy/playwright';
test('homepage', async ({ page }) => {
await page.goto('https://example.com');
await percySnapshot(page, 'homepage');
});
跑:
PERCY_TOKEN=xxx npx percy exec -- npx playwright test
Percy 強項
7. Chromatic — Storybook 神配
npm install --save-dev chromatic
npx chromatic --project-token=xxx
Chromatic 抓你所有 Storybook stories、自動拍 + 比對。Component 層級的視覺穩定 → 整個 UI 穩。
優勢:
- Component-level snapshot(粒度比 page 細)
- 設計師 friendly UI
- 跟 Figma 對齊
8. Applitools — AI 視覺比對
不是 pixel diff、是 「語意一致」比對:
- 字體大小改 1px → AI 知道是同字體
- 顏色 hex 改 1 號 → AI 知道是同顏色
- 版面微調 → AI 容忍
減少 false positive 5-10 倍。但貴。
import { Eyes } from '@applitools/eyes-playwright';
test('with Applitools', async ({ page }) => {
const eyes = new Eyes();
await eyes.open(page, 'My App', 'Homepage Test');
await page.goto('/');
await eyes.check('Homepage');
await eyes.close();
});
9. CI 整合範例
Playwright + GitHub Actions
name: Visual Tests
on: [pull_request]
jobs:
visual:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test --grep @visual
- if: failure()
uses: actions/upload-artifact@v4
with:
name: visual-diff
path: test-results/
PR 中失敗 → 下載 artifact 看 diff PNG。
10. 反 flaky 5 招
11. 反模式
12. 給 QA 的 5 句
- 拍小區塊比拍整頁穩
- 動態元素 mask、動畫 disable
- 同 docker 跑 = 跨平台一致性
- 新案先 Playwright snapshot、長大再 Percy
- Code review 時帶 diff 圖、reviewer 才能判斷
13. 最後
Visual Regression 是 「功能測試抓不到、但使用者一眼看出來」的最後防線。從 Playwright 內建 snapshot 起步、設好 threshold + mask、CI 自動跑、PR 帶 diff — 半年後 UI 退步 bug 砍 80%。
延伸:
相關連結
POM 完整指南。為什麼用、怎麼拆 class、Playwright 實作範例、Component Object 進階、反模式。附類別關係圖與重構流程。
Cross-browser 測試完整策略。Browser matrix 怎麼決定、Playwright 跨瀏覽器、BrowserStack / Sauce Labs 比較、何時用真機、何時用 emulator、CI 整合。
給 QA 的 accessibility 測試完整指南。WCAG 2.2 等級、自動化工具(axe / Lighthouse)、手動 checklist、Screen reader 測試、法規(EAA / ADA / EU AI Act)對 QA 的影響。
相關懶人包
2026 QA 趨勢實戰:我看到的 5 個轉變(AI、Shift-Left、Observability)
從手動 QA 到 AI 輔助、從測試金字塔到測試獎盃。這篇分享我這 10+ 年看 QA 從「測完才知道」到「shift-left + AI」的真實觀察。
2026 QA 面試的 AI 題 — 12 題 + 答題框架(面試官想聽什麼)
2026 QA 面試新增一整類「你怎麼用 AI」的問題。這篇整理 12 個高頻 AI 面試題、每題附面試官真正想聽的點與答題框架,從「你用過哪些 AI 工具」到「AI 生的 test 怎麼信任」。
AI / LLM 功能 Spec Review — 幻覺 / 評估 / 成本 / 法遵 8 個必問
AI 功能 spec review 完整指南。LLM 不確定性處理、評估指標、Prompt versioning、成本控制、安全護欄、法遵(EU AI Act / GDPR)、Fallback、人工 review 流程。
一般聲明
本站提供之資訊僅供參考,不保證其完整性與正確性。使用者應自行判斷資訊之適用性。