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