Cypress 对比 Delta-QA:补上 Cypress 测试套件缺失的界面回归检查

Cypress 对比 Delta-QA:补上 Cypress 测试套件缺失的界面回归检查

视觉回归:由代码变更、依赖更新或配置修改引入的、非预期的界面外观变化(布局、颜色、字体、间距、对齐),只有通过比较界面的两种状态才能发现。

许多使用 Cypress 的团队宁愿忽略一个事实:你的 Cypress 测试套件无论多么完整,在结构上都看不到一整类缺陷。视觉回归会像水穿过筛子一样从你的断言中漏过去,并不是因为测试写得不好,而是因为 Cypress 根本就不是为发现它们而设计的。

这不是对 Cypress 的批评,而是一个事实陈述。事实与批评的区别在于:事实需要的是解决方案,而不是争论。

我们所有的对比文章都基于可核实的标准:替代方案与对比。

你的 Cypress 测试套件能确认一切正常运行,却不能确认一切显示正常。 用 Delta-QA 补充它:无需代码录制你的操作路径,免费账户,无需银行卡。 免费使用 Delta-QA →

Cypress:擅长本职工作,却在视觉层面缺席

Cypress 问世时彻底改变了前端测试。在浏览器中运行、自动重新加载、时间旅行调试、直观的 API(这一切让那些把 Selenium 视为中世纪刑具的团队也能轻松做端到端测试)。在功能测试领域,Cypress 依然是出色的工具。

但请问问自己:你上一次编写 Cypress 测试来检查首页看起来是否正确是什么时候?不是检查某个按钮存在,也不是检查某段文字出现,而是检查它看起来是否正确:间距合适,颜色一致,布局没有偏移哪怕一个像素。

对绝大多数团队来说,答案是“从来没有”。这并非疏忽,而是因为 Cypress 不比较图像。它自己的文档在 2026 年 10 月也这样说:cy.screenshot() 命令会截图,但不会比较;视觉测试要依靠插件或第三方服务。

Cypress 的盲区:没有原生的视觉比较

当你写下 cy.get('.button').should('be.visible') 时,你检查的是该元素存在于 DOM 中,且没有被 CSS 隐藏。你没有检查它的颜色是否正确,没有检查它的位置是否正确,没有检查它的文字是否可读,也没有检查它是否遮挡了其他元素。

一个按钮在 Cypress 看来可以是“可见”的(存在于 DOM 中,display 不是 none,opacity 大于 0),同时在视觉上完全无法使用:白底白字,大小只有 2 × 2 像素,或者被定位在屏幕右侧 3000 像素之外。Cypress 会告诉你一切正常,而你的用户会告诉你另一番话。

这是一个根本性的盲区,而不是小小的局限。用户反馈的问题中有相当大一部分与显示有关:看不清的按钮、错位的表单、溢出的区块。而 Cypress 在原生配置下一个也发现不了。

Cypress 的视觉插件:部分且脆弱的解决方案

面对这一缺口,Cypress 生态产生了视觉测试插件。最知名的依靠第三方服务(Percy、Applitools、Happo)来截图并比较,或者使用 cypress-image-snapshot 做本地比较。如果你想了解每种方案的细节,我们的为 Cypress 添加视觉测试的完整指南梳理了这些做法及其真实局限。这条路走得通,但有明显的约束。

依赖第三方服务。 Cypress 的每个视觉插件都依赖外部平台。你的截图被发送到服务商的服务器,在那里比较,结果再返回给你。这会给 CI 流水线增加延迟、网络依赖,以及第三方服务的许可费用,如果你还使用 Cypress Cloud,还要再加上它的费用。

配置复杂。 为 Cypress 添加视觉插件需要安装 npm 包,配置与第三方服务的身份验证,修改现有测试以加入截图调用,管理 API 令牌,并培训团队使用外部平台。这并非不可克服,但也不是营销页面承诺的“5 分钟搞定”的体验。

双重维护。 你最终要维护两套系统:Cypress 测试,以及视觉插件的配置。Cypress 更新时,插件可能出问题;第三方服务修改 API 时,你的测试可能失败;团队换人时,新人需要学两个工具而不是一个。

覆盖有限。 集成在 Cypress 中的视觉插件,是在功能测试运行期间截图的。这意味着视觉覆盖取决于功能覆盖。如果你没有为“销售条款”页面写 Cypress 测试,那这个页面也就没有视觉测试。你的视觉覆盖被功能覆盖封了顶,而两者本就没有理由重合。

Delta-QA:把视觉测试当作独立学科

Delta-QA 出发点不同。视觉测试不是嫁接在功能测试工具上的一个功能,而是一门完整的学科,有自己的要求、自己的工作流和自己的用户。

独立于功能测试。 Delta-QA 在你浏览的过程中录制路径。你不需要以功能测试作为截图一个页面的载体。你的视觉覆盖不取决于功能覆盖:你可以检查几十个页面,而不用写一个测试。

非开发者也能使用。 谁最有资格判断界面的视觉质量?设计师、手动 QA、产品负责人。而在大多数组织里,这些人不会写 JavaScript。使用 Cypress 加视觉插件,他们得依靠开发者来配置、运行和解读测试。使用 Delta-QA,他们可以自己完成。这个差别会改变团队的运作方式。

原生的基准管理。 Delta-QA 集成了完整的工作流:指明变化元素的报告、对每处差异的判定(有意为之或缺陷)、修改历史。这套工作流是为多职能团队设计的,而不是为在同一个上午里推送并合并的独立开发者设计的。

浏览器。 Delta-QA 在真实浏览器中重放你的路径,目前是 Chromium,Firefox 和 WebKit 已在计划中。Cypress 一侧支持 Chrome、Edge 和 Firefox,WebKit 仍属实验性。

插件的结构性问题:耦合覆盖定律

我们再回到这一点,因为值得展开。当你的视觉测试与功能测试耦合在一起(Cypress 的视觉插件就是如此),你的视觉覆盖就继承了功能覆盖的所有局限。

你为购买流程写了 Cypress 测试?那么购买流程的视觉覆盖有保障。你没有为 FAQ 页面写 Cypress 测试?那就没有 FAQ 页面的视觉覆盖。你为个人资料页写的 Cypress 测试涵盖了“已登录且有高级订阅的用户”?那这种情况有视觉覆盖,但“已登录且无订阅的用户”或“订阅已过期的用户”就没有。

功能覆盖和视觉覆盖遵循不同的逻辑。功能上,你测试的是路径:一连串的操作和验证。视觉上,你测试的是状态:特定条件下页面的快照。一条 10 步的功能路径,可能只需要 2 次视觉检查(入口页和确认页)。反过来,一个没有复杂功能逻辑的简单页面(比如“关于我们”页),可能需要在 5 种分辨率和 3 种浏览器上做视觉检查。

把两者耦合,就是强迫一门学科去适应另一门学科的覆盖方式。就像说只有当工人进入车间使用机器时,你才会目视检查这个车间。在没人工作的日子里,漏水就没人发现。

Cypress 更擅长的:功能测试

我们要承认 Cypress 的优势,因为它们真实而重要。

开发者体验。 Cypress 由开发者为开发者设计。带时间旅行的调试界面、执行速度、流畅的链式 API(用起来是一种享受)。Delta-QA 不声称提供这种体验,因为这不是它的主场。

业务逻辑验证。 正确计算税费、运费和优惠码的支付流程:这由 Cypress 来验证,而不是 Delta-QA。业务逻辑在产生显示结果之前在视觉上是不可见的,即便如此,要验证“显示的金额正确”,也必须知道预期金额,而这只有功能测试才能计算。

网络拦截。 Cypress 可以拦截 HTTP 请求、模拟服务器响应、测试错误场景。这是一个强大的前端集成测试工具,远远超出了单纯的界面验证。

不断丰富的云生态。 截至 2026 年 10 月,Cypress Cloud 提供用于回放失败的 Test Replay、UI Coverage、Cypress Accessibility、由 AI 生成的失败摘要,而 cy.prompt() 命令可以把用自然语言写的步骤转换为 Cypress 命令。这些都不会把页面外观与基准比较,但这个工具进步很快。

执行速度。 Cypress 的架构让测试与应用在同一进程中运行,为功能测试带来出色的执行速度。测试与应用之间没有网络延迟,也没有中间的 WebDriver 协议。

你的 Cypress 测试套件验证的是逻辑,而不是外观。 用 Delta-QA 填补这一缺口:无代码视觉测试,免费账户,无需银行卡。 免费使用 Delta-QA →

Delta-QA 更擅长的:视觉测试

快速覆盖。 在视觉上覆盖你的主要页面,所需时间就是在 Delta-QA 中浏览它们的时间。要通过 Cypress 插件达到同样的覆盖,就得为每个页面写一个测试、管理基准并稳定截图。一边是几天的工作,另一边是几个小时的浏览。

审批工作流。 当 Delta-QA 发现变化时,你的设计师可以直接在界面中判定。无需经过开发者,也无需读懂 Cypress 的报告。报告使用的是评判视觉质量的人的语言:哪个元素变了,怎么变的。

减少误报。 Cypress 的视觉插件往往继承了原始逐像素比较的局限。两次运行之间字体抗锯齿不同?误报。文本框里出现了光标?误报。Delta-QA 比较的是页面的元素而不是像素:渲染上的变化只要没有改变元素的颜色、大小或位置,就不会被标记。

视觉历史。 Delta-QA 保存基准和已判定变更的历史。你可以追溯一个页面随版本的演变。使用本地 Cypress 插件时,基准是 Git 中的文件(有版本管理,但没有可视化其演变的界面)。

典型场景:当 Cypress 插件不再够用

设想一个常见的场景。你的团队使用 Cypress 已有两年,有 300 个功能测试,覆盖不错。有一天,一次 CSS 重构触及了你的设计系统,变量 --color-primary 变了。Cypress 测试全部通过,因为没有一个测试检查颜色。在生产环境中,30 个页面上的操作按钮对比度不足,已经看不清。客服两小时内收到 15 张工单,紧急部署了修复。

事故之后,你的技术负责人决定为 Cypress 添加视觉插件。安装花了半天。为 50 个关键页面配置基准花了一天。首次运行产生了 47 个误报,筛查误报又花了一天。两周后,一名开发者更新了 Cypress,插件不再兼容。视觉测试套件被“暂时”停用。三个月后,它仍然处于停用状态。

这个场景不是虚构的:它是与数十个 QA 团队交流后综合而成的故事。根本问题不在插件,而在于嫁接在功能测试工具上的视觉测试永远不是优先事项。它总是“额外的东西”,等有空再做:也就是永远不做。

Delta-QA 避免了这个陷阱,因为视觉测试就是这个工具存在的理由,而不是可有可无的附加项。没有哪个功能测试套件会抢走优先级,也没有更紧急的配置需要维护。视觉测试就是优先事项,工具围绕这个优先事项构建。

制胜组合:Cypress + Delta-QA

我们主张的不是“放弃 Cypress 改用 Delta-QA”,那太荒谬了。Cypress 是出色的功能测试工具,Delta-QA 是为界面回归而设计的。两者结合所带来的 QA 覆盖,是任何一个单独都无法提供的。

Cypress 验证你的应用能正常工作。 用户路径、业务逻辑、API 集成、错误场景。这是质量保证的功能层。

Delta-QA 验证你的应用看起来正确。 颜色、字体、间距、布局。这是质量保证的视觉层。

每一层有自己的节奏。Cypress 测试在你的 CI/CD 流水线中运行;Delta-QA 场景在每个版本中重放。各自关注质量的不同维度,使用针对该维度优化的工具。

就像同时拥有报警系统和监控摄像头。报警器发现入侵(功能:有不该进来的人进来了),摄像头显示发生了什么(视觉:一切看起来正常吗)。两者结合比各自单独使用更有效。

“我们已经有 Cypress 了,够用了”的论调

这是最常见的反对意见。“我们已经在 Cypress 上投入过了,不会再增加一个工具。”这个论调可以理解,但站不住脚。你已经有一把锤子,并不意味着每个问题都是钉子。

如果你的应用有用户界面(而你在读这篇文章,多半是有的),用户感知到的价值中有相当大一部分来自这个界面的外观,而不是底层的业务逻辑,无论它多么出色。用户看不到你的微服务架构,他看到的是一个蓝色按钮、对齐的表单、一致的字体排印。

不测试这个维度,就是在赌没有人会弄坏你应用的 CSS。这是一场你会输的赌注,问题不在于会不会,而在于何时。一旦发生,代价与回归在生产环境中停留的时间成正比:而在部署前发现它,就能缩短这段时间。

在现有的 Cypress 环境中添加 Delta-QA 需要多久

如果你已经在用 Cypress,并想加上 Delta-QA,具体是这样的。

Delta-QA 独立于 Cypress 运行。你不需要修改现有的 Cypress 测试,不需要安装插件,也不需要改动 Cypress 的配置。两个工具共存而不冲突,因为它们没有任何共享之处。

部署 Delta-QA 就是打开你的网站,走一遍需要覆盖的场景。第一次运行建立基准。就这样:视觉覆盖即刻生效,与你的 Cypress 测试无关。

要在 CI 中更进一步,Delta-QA 现在有了 SDK,即 Vision。它目前支持 Playwright(TypeScript 和 JavaScript),对 Cypress 的支持计划在之后推出。使用 Playwright 时,每个要检查的页面只需一行:未经判定的差异会让测试失败,CI 日志会给出报告链接。

FAQ

Cypress 以后会添加原生的视觉测试吗? 这是 Cypress 社区经常讨论的问题。截至 2026 年 10 月,文档指出 Cypress 自身不比较图像,并指向插件。Cypress Cloud 在不断丰富(Test Replay、UI Coverage、Accessibility,以及 cy.prompt() 这类 AI 功能),但没有与基准的视觉比较。即使 Cypress 将来加入,它仍会与功能测试的执行耦合,从而保留上文所述的耦合覆盖问题。

Cypress 的视觉插件还不够吗? 对于基本用途,它们可以应急。但它们增加了对第三方服务的依赖(并带有自己的许可费用),把视觉覆盖与功能覆盖耦合在一起,而且维护是额外的负担。如果你有 10 个页面,并有一名开发者可以维护插件,这可能行得通。如果你有 100 个页面和一个混合的 QA 团队,这些局限就会成为阻碍。

Delta-QA 能发现 Cypress 发现不了的缺陷吗? 按定义就能。Cypress 验证的是程序化断言:“这个元素包含这段文字”“这个 URL 正确”“这个请求返回了 200”。Delta-QA 验证的是视觉外观:“这个页面看起来与基准版本相同”。视觉缺陷(CSS 回归、响应式问题、z-index 冲突、字体缺失)对 Cypress 断言是不可见的,但能被 Delta-QA 发现。

Delta-QA 会拖慢 CI/CD 流水线吗? 你无需代码录制的 Delta-QA 场景不经过 Cypress 流水线,因此不会拖慢它。若要集成到 CI,SDK Vision 目前支持 Playwright,Cypress 计划在之后推出。

需要在 Cypress Cloud 和 Delta-QA 之间二选一吗? 不需要。两者服务于不同目标。Cypress Cloud 优化你的 Cypress 功能测试:并行化、失败回放、不稳定测试检测、界面覆盖率和无障碍。Delta-QA 负责与基准的视觉比较,而这是 Cypress Cloud 没有涉及的。两者是互补的投入。

我的 QA 团队不懂技术。他们能在没有开发者帮助的情况下使用 Delta-QA 吗? 这正是 Delta-QA 的设计场景。无代码界面让 QA 测试人员、设计师或产品负责人无需任何开发技能,就能配置、运行并解读视觉测试。这是它与 Cypress 插件的根本区别之一,后者需要修改 JavaScript 代码才能添加视觉截图点。

Delta-QA 可以搭配 Cypress 以外的框架使用吗? 可以。Delta-QA 的场景独立于任何测试框架:无论你用的是 Cypress、Playwright、Selenium、TestCafe,还是没有任何框架,它们的工作方式都一样。对于 Playwright 团队,SDK Vision 可以在现有测试中添加 Delta-QA 检查。

结论:别让 Cypress 扛下不属于它的重担

Cypress 在它的本职工作上非常出色。但要求它承担视觉测试(通过插件、变通手段或拼凑的 CSS 断言),是给它安排了一个并非为它设计的任务。就像给短跑运动员背上 20 公斤的背包,然后惊讶于他跑得变慢了。

让 Cypress 解放出来,让它去做最擅长的事:测试你的应用能否正常工作。而把视觉测试交给专为此而生的工具。

准备好补上测试套件的视觉盲区了吗? 用 Delta-QA 发起你的第一次比较,免费账户,无需银行卡。 免费使用 Delta-QA →