视觉回归测试

工具对比

工具方式集成最适合
Chromatic基于 Storybook 的组件快照Storybook组件库、设计系统
Percy全页 + 组件快照对比Selenium、Playwright、Cypress整个应用视觉测试
Playwright 截图内置截图比较Playwright免费、自托管、页面级
LokiStorybook 截图对比(开源)Storybook、DockerChromatic 的自托管替代

Playwright 视觉测试

import { test, expect } from '@playwright/test'; test('首页视觉回归', async ({ page }) => { await page.goto('/'); await page.waitForLoadState('networkidle'); // 全页截图对比 await expect(page).toHaveScreenshot('homepage.png', { fullPage: true, threshold: 0.2, // 允许 0.2% 像素差异 maxDiffPixels: 100, }); }); test('按钮各状态', async ({ page }) => { await page.goto('/components'); const button = page.getByRole('button', { name: '提交' }); await expect(button).toHaveScreenshot('button-default.png'); await button.hover(); await expect(button).toHaveScreenshot('button-hover.png'); }); # 更新基准截图 npx playwright test --update-snapshots

CI 视觉测试工作流

步骤操作
1. 首次运行生成基准截图,提交到仓库
2. PR 运行对比截图,差异超出阈值则失败
3. 审查差异在 PR 评论或 Chromatic UI 中查看视觉 diff
4. 有意变更运行 --update-snapshots,提交新基准
5. 意外变更修复 CSS 回归,重新运行,确认通过
稳定性屏蔽动态内容(时间戳、广告、动画)
稳定性固定视窗和字体渲染;在 Docker 中运行确保确定性