引言
在软件开发中,测试传统上被限定在与生产部署分离的开发和预发布环境中。这种隔离的原因是为了最小化测试与生产流量同时运行时的性能影响,并减少破坏性更改影响生产环境的可能性。
尽管存在这些担忧,但将部分测试在生产环境中完成的趋势正在增长。这种策略,简称为生产环境测试 (TIP),可以帮助团队更好地理解新代码将如何与它需要兼容的实际系统和数据进行交互。
在本指南中,我们将探讨在生产环境中测试软件变更的理念。我们将介绍过去对生产测试持保留态度的一些历史原因、使采纳变得更具吸引力的变化,并讨论它对开发速度和错误减少可能产生的一些好处。
Prisma 数据平台可以帮助您简化在生产环境中访问数据库。如果您正在使用 Prisma Client 管理您的数据库连接,Prisma 数据平台可能会帮助您更轻松地管理生产工作负载。
什么是生产环境测试?
生产环境测试是一种鼓励开发者将部分或全部软件测试推迟到代码部署到生产环境中的理念。但是,团队为什么要转向生产环境测试呢?
乍一看,这个想法可能显得反直觉,甚至危险。也许不足为奇的是,它并非没有风险。然而,通过引入一种部署和测试策略,不仅可以更彻底地测试您的软件,还可以帮助您构建一个更具弹性的生产环境,从而消除许多风险。
生产环境测试很有价值,因为它消除了因生产环境和测试环境之间的环境差异而产生的一类问题。您不再是在一个专用环境中进行测试,然后将通过测试的代码部署到生产环境,寄希望于其行为保持一致,而是直接在代码需要运行的地方进行测试。
采纳生产环境测试理念的团队关注点可总结如下:
- 尽快将代码部署到生产环境: 这使您的团队能够尽早地在代码必须运行的环境中进行测试
- 将代码部署与代码发布解耦: 将部署过程与发布变更的行为分离,使您在测试和激活新功能时具有更大的灵活性
- 使用真实数据进行测试: 数据库模拟对象、桩或填充了虚拟记录的数据库无法准确复制您的代码需要适应的数据
- 最小化变更的影响范围: 如果您可以在测试和发布期间限制和调整范围,则可以更安全、有效地测试变更
生产环境测试有哪些风险?
许多人怀疑生产环境测试的收益是否能超过其成本。在我们继续之前,让我们谈谈这种策略的一些风险以及如何缓解它们。
缺陷风险
在生产环境中测试代码的主要担忧是可能引入会影响用户和服务的软件缺陷。传统软件测试流程背后的理念是在代码晋升到生产环境之前,对其进行彻底审查并检查已知弱点。
这种观点有其优点,但实际情况往往并非如此清晰。组织在预发布环境中运行的测试通常不能很好地近似代码在生产环境中将要处理的情况。复制环境,包括基础设施和工作负载,并非易事,并且经常与实际生产系统不同步。
这导致的结果是,您在预发布环境中测试的内容可能并不适用于您的代码发布后的实际表现。此外,无论尝试是否成功,都需要投入大量的精力、时间和基础设施。
对实时系统的影响
一个密切相关的担忧是新变更和测试过程本身可能对生产环境产生的影响。系统稳定性是大多数组织的首要任务,因为它会影响服务的可用性和可访问性,并损害用户信任。
尽管部署到生产环境的任何代码都有可能影响运营,但仍有方法可以最大程度地减少潜在影响。实施控制以限制新代码接收的流量、设置主动备用基础设施以及实施基于监控的扩缩容,是使此过程更安全的一些方法。这些缓解措施的优点在于,这些投入直接提高了您的生产系统对各种系统故障的弹性。
如何进行生产环境测试
生产环境测试究竟是如何进行的?在本节中,我们将讨论组织为了在生产环境中可靠地测试代码而实施的一些最常用技术和策略。虽然不一定需要采纳所有这些想法,但其中许多方法相互补充,可以作为更全面系统的一部分进行集成。
实施特性标志系统
特性标志是一种编程和发布技术,它涉及到使功能易于从外部激活或禁用。其基本思想是将新功能封装在条件逻辑中,该逻辑在运行前检查配置变量的值。“标志”或“切换”变量通常配置在外部存储(如 Redis)中,组织可以根据需要轻松更改其值。
特性标志是生产环境测试中的一个宝贵工具,因为它们允许您安全地部署代码,而不会影响生产系统的当前逻辑。新的代码路径可以先禁用,然后在准备好测试新代码时再激活。特性标志概念的许多实现都包含比“启用”或“禁用”更细粒度的控制,例如可以选择为特定百分比的流量启用、A/B 测试不同的逻辑,或仅在特定情况下选择路径。
通过使用特性标志,您可以将代码以禁用状态部署到生产环境。您可以使用您的测试套件测试新的代码路径,而生产流量继续使用旧的逻辑。然后,您可以作为金丝雀发布,通过缓慢增加新代码路径接收的生产流量来逐步发布代码,同时监控其影响。
使用 CI/CD 在生产基础设施上部署和测试
关于生产环境测试的一个误解是,认为测试必须在生产环境中完成。虽然支持者认识到在代码最终运行的环境中进行测试的价值,但并非所有测试都需要如此高的保真度,许多快速、有针对性的测试可以自动化,并作为代码部署前准备工作的一部分运行。
实现这一目标最简单、最有效的方法是通过一个精心调优的 CI/CD 流水线。CI/CD,即持续集成和持续交付或部署,是一个系统,它在代码添加到存储库时自动测试新代码。一旦测试套件成功通过,该流水线(持续交付)允许开发人员通过点击按钮部署变更,而持续部署则自动部署所有成功测试的代码。
CI/CD 在生产环境测试之外还有许多好处。对于我们所描述的系统,流水线作为部署过程的自动化部分,目标是在生产环境中部署和测试。虽然像单元测试这样的简单测试可以独立完成,但像集成测试这样更复杂的阶段,理想情况下应该通过将代码部署到生产基础设施并在那里进行测试来完成。这允许您的代码在最终运行的相同运行上下文下,针对它将交互的实际服务进行测试。
CI/CD 流水线有助于增强对新变更的信心,并缓解因代码快速部署到生产环境而产生的焦虑。结合特性标志,开发团队可以相信代码的某些方面已经过审查,然后可以控制如何进行更大量的测试。
配置您的服务以允许暗启动
暗启动是一种部署软件变更并使用真实流量进行测试的方法,而不会对用户造成影响。其理念是镜像生产流量,并将重复请求发送到您新部署的代码,以便您可以确保它既能正确执行,又能处理实际的生产负载。
暗启动可能相当复杂,因为它要求您在应用程序的多个实例上重放现有流量,而不会导致影响测试合法性的减速。实时复制请求的替代方案是从事件日志或其他来源回放先前的请求。此策略要求您捕获初始请求的所有相关上下文。
暗启动的好处是,它允许您看到代码的功能,就好像它已经发布给用户一样。通过新代码运行流量的结果永远不会显示给用户,但它们可以提供关于您的代码行为以及需要考虑哪些类型条件的信息。一旦您测试了一个暗启动版本的应用程序,考虑到它已经面临过这些压力,您就可以对其在生产环境中的表现相当有信心了。
实施强大的监控和指标收集
除了部署和发布期间执行的核心测试之外,还必须建立系统,以便在代码投入生产后继续监控其行为。可以实施各种相关技术,帮助您长期了解服务运行状况,从而在新代码导致行为变化时更快地发现异常。
监控和指标跟踪是您可以用来了解服务在不同时间段和条件下如何执行的基本工具。新变更可能会产生短期内难以发现的副作用,但随着时间的推移可能会变得明显。监控和指标可以帮助将这些行为变化与特定版本关联起来。
生产环境测试如何影响数据库?
生产环境测试中最复杂的方面之一是找出一种有效的方式来执行与数据库交互的测试。虽然可以让新代码从不同的数据源读取和写入,但这又一次引入了针对复制不佳的环境进行测试的可能性。
更好但更难实现的选择是使用您的生产数据库进行测试。这可能很难实施,特别是如果您的数据库模式和工具从一开始就没有为此可能性进行配置,但它提供了了解您的代码在发布时将如何行为的最佳机会。
允许您的新代码从生产数据库读取数据是相当直接的。只要测试不会导致严重的读取争用,它就不应显着影响数据库的生产职责,并且您的生产数据也不会有危险。
然而,测试您的代码如何执行写入操作则有点棘手。最直接的测试方法是在生产数据库中创建专用的测试用户,以便您的新代码可以在不触及真实用户数据的情况下操作数据。这仍然可能是一个相当令人担忧的提议,因为测试操作将与来自您的活跃代码的真实数据同时执行。
结论
生产环境测试可能难以实施,并且对于现有项目来说可能需要进行许多更改。然而,采用一个可以在实际环境中测试代码真实行为的系统所带来的好处,再怎么强调也不为过。测试旨在识别错误并增强对软件的信心,这两个目标在非代表性环境中很难完全实现。
通过了解这种方法所涉及的挑战,您可以评估它与您的组织工作方式的契合度。生产环境测试是一项权衡取舍的工作,您的成功可能很大程度上取决于您愿意并能够投入到该过程中的精力。虽然这不一定是一个容易的调整,但其优势可以在长期内为您带来益处。
Prisma 数据平台可以帮助您简化在生产环境中访问数据库。如果您正在使用 Prisma Client 管理您的数据库连接,Prisma 数据平台可能会帮助您更轻松地管理生产工作负载。