预提交验证通过的更改如何引发本应被捕获的回归问题

95次阅读
没有评论

问题描述

在持续集成(CI)的背景下,一种常用的提高集成分支质量的方法是进行强制性的预提交质量验证,通常包括构建一些构件、执行单元测试甚至一些功能/集成测试。然而,一些回归问题(如构建失败、各种测试失败)会在CI系统验证中被检测到,而这些问题正是预提交验证应该覆盖的领域。

在分析这些回归问题时,经常会听到这样的论点:被认定为回归问题根本原因的更改的开发人员已成功通过了所有此类验证。而且,这种说法通常得到了支持,因为有确凿的证据表明:

  • 在达到最终版本之后,更改被传送到基于分支尖端的新工作区
  • 所需的构件是从头开始构建的(因此构建是完全正常的,没有缓存相关问题等)
  • 所有强制性测试都通过了,包括涵盖相关领域并应该检测到回归问题的测试
  • 没有间歇性的误报影响了相应的验证
  • 提交更改到分支时没有检测到文件合并
  • 自从拉取新工作区以来,没有其他更改提交到分支的文件被修改过

一个问题难道真的能够在正确遵循所有规定的流程和实践的情况下引发这样的回归问题吗?为什么会这样?

解决方案

在开发过程中,存在一些情况,即使在开发人员的个人工作站上通过了预提交验证,也可能会在CI系统中出现回归问题。这些情况可能包括环境差异、依赖关系变化以及并行提交等。

环境差异

一个常见的情况是,开发人员在其个人工作站上执行预提交验证时使用的环境与CI系统中使用的环境不完全一致。这可能导致一些配置或依赖在CI系统中出现问题,从而导致回归问题。为了解决这个问题,可以考虑使用类似于容器化的技术,以确保开发、测试和生产环境尽可能一致。

并行提交和依赖关系变化

在并行开发的情况下,两个开发人员可能在同一分支上进行提交,而这些提交之间可能存在依赖关系。如果一个开发人员的更改依赖于另一个开发人员的更改,那么即使预提交验证通过,也可能在合并后出现问题。这是因为这两个更改可能在提交到分支之前没有被合并,从而导致合并后的代码状态不符合预期。为了减轻这种情况,可以使用功能分支、合并请求和代码审查等实践,以确保更改之间的正确顺序和依赖关系。

早期发现和反馈

为了最大程度地减少预提交验证通过的更改引发回归问题的风险,可以采取以下一些实践:

  • 尽早发现问题:在开发过程中,尽早发现和解决问题,以避免问题在提交后才被发现。
  • 增加测试覆盖率:除了强制性的预提交验证外,增加更多的测试覆盖范围,包括自动化测试和验收测试,以捕获更多的问题。
  • 持续反馈:将验证过程推向前,通过自动化流程提供快速反馈,使开发人员能够及早发现问题并进行修复。

尽管开发人员可能会遵循所有规定的流程和实践,但在复杂的软件开发中,由于环境差异、并行提交、依赖关系变化等因素,仍然有可能引发回归问题。因此,早期发现问题并通过持续的反馈和测试来减轻风险是至关重要的。

正文完