测试中的无形力量

1 天前   出处: fstesting  作/译者:明月

关于测试的讨论通常由三个隐喻主导:测试金字塔、反馈循环和组件边界。这些隐喻背后,是持续存在并深刻影响我们设计测试框架方式的无形力量。当我们意识到它们的影响时,就能更好地利用这些力量,构建出适合特定应用程序、组织和具体情境的测试框架。

本文将简要介绍每个隐喻、它们所代表的力量,以及我们在设计测试框架时如何驾驭这些力量。

测试金字塔

测试金字塔代表了信心成本之间的张力。更大规模的测试(如端到端测试)能提供更高的信心,确保系统作为一个整体正常工作,但执行成本也更高。相反,更小规模的测试(如单元测试)成本更低,但几乎无法提供系统整体正常工作的信心。

传统观点倾向于避免大规模的测试,因为它们成本更高,这促使测试框架的设计偏向于金字塔底部的单元测试。然而,当这种力量在组织层面失衡时,就会导致过度偏向单元测试或端到端测试。平衡这些相反的力量需要分析你的实际需求,避免陷入“某种测试天生优于另一种”的思维陷阱。

反馈循环

测试一直涉及反馈循环,但随着对加速交付和改善开发者体验的关注,这个隐喻变得日益重要。在宏观层面,更短的反馈循环能增加迭代次数,从而提升软件质量。在微观层面,它能让开发者更早地发现缺陷,此时修复成本最低、难度最小。

尽管更短的反馈循环通常更可取,但实现起来却很困难。每一次实现持续集成(CI)和持续交付(CD)的尝试,都可能意外地导致反馈循环变长——尤其是当 CI/CD 流程成为开发者日常工作流(内循环)的一部分,并阻塞其合并请求时。这里相反的力量很明显:更短的反馈周期能改善结果和开发者体验,但追求流程的可重复性和可靠性,又可能增加反馈循环的长度。

当这些力量失衡时,可能导致两种极端情况:合并一个简单的 PR 需要数小时,或者开发者花费数天时间在生产环境中排查缺陷。

组件边界

每个系统都由其组件边界定义,这些界线将内部实现与外部交互区分开来。在测试中,组件边界施加着强大的力量,因为每个测试都必须决定是跨越边界(关注内部)还是尊重边界(关注外部)。

  • 白盒测试会渗透到内部的接缝处。它们能快速见效,因为开发者对代码非常熟悉。但这种便利是有代价的:白盒测试会随着实现细节的变化而变得脆弱,并且其失败原因对于团队之外的人来说通常难以解读。
  • 黑盒测试则从外部对系统施压,仅通过公共接口进行交互。它们需要更多的设计工作,但提供了更好的稳定性和清晰度,因为它们验证的是行为而非内部结构。

一个失衡的测试框架会过度偏向一个方向——要么过度耦合于易变的内部细节,要么过度依赖单一且可能不稳定的接口层。理解组件边界如何塑造测试,有助于我们设计出与系统架构相匹配的测试策略,而不是仅仅追求一时的编写便利。

力量的交织:混合隐喻

这些隐喻所产生的力量会以复杂的方式相互作用。孤立地思考它们,会错失许多解决团队在测试中面临挑战的、令人惊讶的机会。以下是几个例子:

示例 1:启动新项目的团队

一个启动新项目并希望“做对”的团队,可能会认为应该从大量单元测试开始。这是一个常见的陷阱。在项目早期,团队对应用程序的最终形态了解最少。他们可能编写了 150 个运行快速的单元测试,结果一个月后发现某个自研模块是多余的——因为一个成熟的开源库已经提供了该功能。

明智的决定是丢弃那些测试,但做出这个决定很困难,这些测试往往会“困扰”团队数月。相反,为主用户流程创建一个端到端测试可能花费相同的时间,但对需求变更的适应能力更强,因为交付给用户的价值通常比内部实现更稳定。

这个例子展示了所有三个隐喻的力量:测试金字塔对单元测试的偏好、围绕反馈循环时长的考量,以及在组件边界处白盒测试的耦合性与黑盒测试的弹性之间的张力。

示例 2:改造遗留的全栈应用程序

想象一个构建了数年、几乎没有测试的全栈应用程序。没有测试可能是因为初期交付压力大,或具备测试经验的人太少。技术债务不断累积,团队计划“上线后再解决”。这对许多开发者来说可能很熟悉。

这是最难测试的应用程序类型之一,因为它从未被设计为可测试的。无论从 UI 还是后端开始测试,都会遇到重重障碍:UI 行为可能不确定,HTML 难以解析;后端代码可能紧密耦合,难以隔离测试。

在这种情况下,一个好的切入点是关注前端和后端之间的契约。通过规范(例如 REST API 的 OpenAPI 规范或 GraphQL API 的模式)来强化这个契约,提供了一种安全分离这两层的方法。这些规范附带的工具可以同时为前端和后端生成测试桩或进行验证。

在这个例子中,机械地套用测试金字塔或追求极短的反馈循环没有太大价值。然而,将系统视为一个整体,并审慎地定义其组件边界,使团队能够以一种清晰的方式划分系统,从而为开始偿还技术债务提供了一个坚实的立足点。

总结

测试金字塔、反馈循环和组件边界这三个隐喻是强大的思维工具,但要有效使用它们,我们必须将其视为一组相互关联、彼此制衡的力量。每一个隐喻都揭示了塑造测试框架演变的某种压力,但孤立地看待任何一个都可能产生误导。过分专注于单一隐喻,可能会让你偏离真正的目标:设计一个为你的应用程序、组织和具体挑战量身定制的测试框架。


声明:本文为本站编辑转载,文章版权归原作者所有。文章内容为作者个人观点,本站只提供转载参考(依行业惯例严格标明出处和作译者),目的在于传递更多专业信息,普惠测试相关从业者,开源分享,推动行业交流和进步。 如涉及作品内容、版权和其它问题,请原作者及时与本站联系(QQ:1017718740),我们将第一时间进行处理。本站拥有对此声明的最终解释权!欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,与我们的编辑和其他窝友交流。
/23 人阅读/0 条评论 发表评论

登录 后发表评论
最新文章