

# OPS06-BP04 自动测试和回滚
<a name="ops_mit_deploy_risks_auto_testing_and_rollback"></a>

 为了提高部署过程的速度和可靠性以及对该过程的信心，您需要制定一项策略，用于在预生产和生产环境中实现自动化的测试和回滚功能。在部署到生产环境时自动进行测试，模拟人与系统的交互，从而验证已经部署了更改。利用自动回滚功能，可以快速恢复到先前已知的良好状态。回滚应在预先定义的条件下自动启动，例如更改未达到期望结果或自动化测试失败时。自动执行这两项活动可以提高部署的成功率，尽可能缩短恢复时间，并减少可能对业务造成的影响。 

 **期望的结果：** 您的自动化测试和回滚策略已集成到持续集成/持续交付（CI/CD，Continuous Integration/Continuous Delivery）管道中。您的监控功能可以根据成功标准进行验证，并能在失败时启动自动回滚。这样可以最大限度地减少对最终用户和客户的任何影响。例如，当您对所有测试结果都感到满意时，可以将代码提升到生产环境中，该环境启动了使用相同测试案例的自动回归测试。如果回归测试结果与预期不符，则在管道工作流中启动自动回滚。 

 **常见反模式：** 
+  您的系统的架构不允许使用较小的发布版本进行更新。因此，在部署失败时，您很难撤销这些大批量的更改。 
+  您的部署过程包括一系列人工步骤。将更改部署到工作负载后，您启动了部署后测试。完成测试之后，您发现工作负载不可操作，而且客户断开了连接。然后，您开始回滚到之前的版本。所有这些人工步骤都会延误整个系统的恢复，并对客户造成长时间的影响。 
+  您花时间为应用程序中不常用的功能开发了自动化测试案例，这极大地降低了自动化测试功能上的投资回报率。 
+  您的发布版本由应用程序、基础设施、补丁和配置更新组成，这些组件相互独立。但是，您只有一个 CI/CD 管道，只能同时交付所有更改。一个组件中的失败会迫使您撤销所有更改，导致回滚过程复杂且效率低下。 
+  您的团队完成了冲刺一的编码工作并开始冲刺二的工作，但是按照您的计划，直到冲刺三才会进行测试。结果，自动化测试发现冲刺一中存在缺陷，需要先解决这些缺陷，然后才能开始测试冲刺二的可交付成果，整个发布都被延误，这大大降低了自动化测试的价值。 
+  生产版本的自动化回归测试案例已完成，但您没有监控工作负载运行状况。由于无法监控服务是否已重新启动，因此您不确定是否需要回滚或者是否已经进行了回滚。 

 **建立此最佳实践的好处：** 自动化测试可提高测试过程的透明度，以及在更短的时间内测试更多功能的能力。通过对生产环境中的更改进行测试和验证，可以让您立即发现问题。利用自动化测试工具改进一致性，可以更好地检测缺陷。通过自动回滚到以前的版本，可以将对客户的影响降至最低。自动回滚可以减少业务影响，最终提升对您部署功能的信心。总体而言，这些功能可在确保质量的同时缩短交付时间。 

 **未建立这种最佳实践的情况下暴露的风险等级：** 中 

## 实施指导
<a name="implementation-guidance"></a>

 自动测试部署的环境，以便更快地确认目标结果。在没有达到预定义的结果时，自动回滚到之前的已知良好状态，尽可能地缩短恢复时间，并减少手动过程引起的错误。将测试工具与管道工作流集成，以便一致地开展测试并尽可能减少手动输入。确定优先执行的自动化测试案例，例如能够降低最大风险的测试案例，以及每次更改都需要频繁测试的测试案例。此外，还可以根据在测试计划中预定义的特定条件自动回滚。 

### 实施步骤
<a name="implementation-steps"></a>

1.  为开发生命周期建立测试生命周期，针对测试过程，从需求规划到测试案例开发、工具配置、自动化测试和测试案例关闭，对每个阶段进行定义。 

   1.  根据您的整体测试策略创建特定于工作负载的测试方法。 

   1.  考虑在整个开发生命周期中适宜的阶段实施持续测试策略。 

1.  根据您的业务需求和管道投资，选择用于测试和回滚的自动化工具。 

1.  确定要自动执行哪些测试案例，以及应手动执行哪些测试案例。这个过程可以根据所测试功能的业务价值优先级来定义。确保所有团队成员都遵守该计划，并核实执行手动测试的责任人。 

   1.  在自动化测试可以实现价值的特定测试案例上使用自动化测试功能，例如可重复或经常运行的案例、需要重复任务的案例或者多种配置中所需的案例。 

   1.  在自动化工具中定义测试自动化脚本和成功标准，以便在特定案例失败时可以启动持续的自动化工作流。 

   1.  为自动回滚定义具体的失败标准。 

1.  优先考虑测试自动化，在过于复杂和人工交互会导致更高失败风险的案例中，通过开发全面的测试案例来获得一致的结果。 

1.  将您的自动化测试和回滚工具集成到 CI/CD 管道中。 

   1.  为您的更改制定明确的成功标准。 

   1.  监控并观察以检测这些标准，以及在满足特定回滚标准时自动撤销更改。 

1.  执行不同类型的自动化生产测试，例如： 

   1.  A/B 测试，显示在两个用户测试组之间当前版本的结果对比。 

   1.  金丝雀测试，让您可以先对一部分用户部署更改，然后再向所有用户发布。 

   1.  功能标记测试，让您可以在应用程序外部，每次将新版本的单个功能标记为打开和关闭，以便逐个验证各个新功能。 

   1.  回归测试，用于验证现有相互关联组件的新功能。 

1.  监控应用程序的操作情况、事务，以及与其他应用程序和组件的交互。编制报告，用于按工作负载显示更改是否成功，这样您就可以确定对自动化和工作流的哪些部分进一步进行优化。 

   1.  编制测试结果报告，以便您快速决定是否应调用回滚程序。 

   1.  实施策略，以便根据一种或多种测试方法的预定义失败条件进行自动回滚。 

1.  开发自动化测试案例，以便在将来的可重复更改中重用。 

 **实施计划的工作量级别：** 中 

## 资源
<a name="resources"></a>

 **相关最佳实践：** 
+  [OPS06-BP01 针对不成功的更改制定计划](ops_mit_deploy_risks_plan_for_unsucessful_changes.md) 
+  [OPS06-BP02 测试部署](ops_mit_deploy_risks_test_val_chg.md) 

 **相关文档：** 
+ [AWS Builders Library \| Ensuring rollback safety during deployments ](https://aws.amazon.com/builders-library/ensuring-rollback-safety-during-deployments/)
+  [Redeploy and rollback a deployment with AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-rollback-and-redeploy.html) 
+ [ 8 best practices when automating your deployments with AWS CloudFormation](https://aws.amazon.com/blogs/infrastructure-and-automation/best-practices-automating-deployments-with-aws-cloudformation/)

 **相关示例：** 
+ [ 使用 Selenium、AWS Lambda、AWS Fargate 和 AWS 开发人员工具进行无服务器 UI 测试 ](https://aws.amazon.com/blogs/devops/using-aws-codepipeline-aws-codebuild-and-aws-lambda-for-serverless-automated-ui-testing/)

 **相关视频：** 
+ [ re:Invent 2020 \| Hands-off: Automating continuous delivery pipelines at Amazon ](https://www.youtube.com/watch?v=ngnMj1zbMPY)
+ [ re:Invent 2019 \| Amazon's Approach to high-availability deployment ](https://www.youtube.com/watch?v=bCgD2bX1LI4)