

# REL08-BP02 将功能测试作为部署的一部分进行集成
<a name="rel_tracking_change_management_functional_testing"></a>

 使用单元测试和集成测试等技术来验证所需功能。

 单元测试是测试代码的最小功能单元来验证其行为的过程。集成测试旨在验证每个应用程序功能是否符合软件要求。虽然单元测试侧重于以隔离方式测试应用程序的一部分，但集成测试会考虑副作用（例如，通过变异操作更改数据所带来的影响）。无论是哪种情况，都应将测试集成到部署管道中，若未能满足成功条件，则相关管道会中止或回滚。这些测试在预生产环境中运行，该环境会在管道中的生产开始前被暂存。

 如果这些测试作为构建和部署措施的一部分自动运行，则您可以获得最佳的结果。例如，使用 AWS CodePipeline，开发人员将更改提交到源代码存储库，而 CodePipeline 会自动在其中检测这些更改。构建应用程序，并运行单元测试。在单元测试获得通过之后，将构建的代码部署到暂存服务器来进行测试。CodePipeline 会从暂存服务器运行更多测试，例如集成或负载测试。在成功完成此类测试以后，CodePipeline 会将经过测试并获得批准的代码部署到生产实例。

 **期望结果：**您使用自动化功能来执行单元测试和集成测试，以验证您的代码是否按预期运行。这些测试集成到部署过程中，而测试失败会中止部署。

 **常见反模式：**
+  您在部署过程中忽略或绕过测试失败和测试计划，以加快部署时间表。
+  在部署管道之外手动执行测试。
+  您跳过自动化流程中的测试步骤，而采用手动应急工作流程。
+  您在与生产环境不太相似的环境中运行自动测试。
+  您构建的测试套件不够灵活，难以随应用程序发展来进行维护、更新或扩展。

 **建立这种最佳实践的好处：**在部署过程中进行自动测试可以及早发现问题，从而降低发布到生产环境时出现错误或意外行为的风险。单元测试可验证代码是否按预期运行，以及 API 合约是否得到遵守。集成测试可验证系统是否按照指定的要求运行。这些类型的测试可验证诸如用户界面、API、数据库和源代码等组件是否按预期正常运行。

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

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

 采用测试驱动型开发（TDD）方法编写软件，从而通过开发测试用例来指定和验证代码。首先，为每个函数创建测试用例。如果测试失败，则编写新的代码来通过测试。这种方法有助于您验证每个函数的预期结果。在将代码提交到源代码存储库之前，请运行单元测试并验证测试获得通过。

 执行单元测试和集成测试，作为 CI/CD 管道的构建、测试和部署阶段的一部分。自动执行测试，并在准备好部署新版本的应用程序时自动启动测试。若未满足成功条件，则相关管道会中止或回滚。

 如果应用程序是 Web 或移动应用程序，请在多个桌面浏览器或实际设备上执行自动的集成测试。这种方法对于验证移动应用程序在各种设备上的兼容性和功能性特别有用。

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

1.  在编写功能代码（*测试驱动型开发* 或 TDD）之前，先编写单元测试。制定代码指南，使编写和运行单元测试成为非功能性编码要求。

1.  创建一套自动化集成测试，其中涵盖已确定的可测试功能。这些测试应模拟用户互动并验证预期结果。

1.  创建运行集成测试所需的测试环境。这可能包括与生产环境非常相似的暂存环境或预生产环境。

1.  使用 AWS CodePipeline 控制台或 AWS Command Line Interface（CLI）设置源代码以及构建、测试和部署各个阶段。

1.  在代码构建和测试完毕后部署应用程序。AWS CodeDeploy 可以将其部署到您的暂存（测试）环境和生产环境。这些环境可能包括 Amazon EC2 实例、AWS Lambda 函数或本地服务器。应使用相同的部署机制将应用程序部署到所有环境。

1.  监控管道的进度以及每个阶段的状态。使用质量检查，根据测试的状态来阻止管道。此外，您可以接收有关任何管道阶段故障或管道完成的通知。

1.  持续监控测试结果，并查找规律、回归或需要更多关注的领域。使用这些信息来改进测试套件，确定应用程序中需要更稳健测试的领域，并优化部署过程。

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

 **相关最佳实践：**
+  [REL07-BP04 对工作负载进行负载测试](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_adapt_to_changes_load_tested_adapt.html) 
+  [REL08-BP03 将韧性测试作为部署的一部分进行集成](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_tracking_change_management_resiliency_testing.html) 
+  [REL12-BP04 使用混沌工程测试韧性](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_testing_resiliency_failure_injection_resiliency.html) 

 **相关文档：**
+  [AWS Prescriptive Guidance: Test automation](https://docs.aws.amazon.com/prescriptive-guidance/latest/performance-engineering-aws/test-automation.html) 
+  [持续交付和持续集成](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts-continuous-delivery-integration.html) 
+  [Indicators for functional testing](https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/indicators-for-functional-testing.html) 
+  [Monitoring pipelines](https://docs.aws.amazon.com/codepipeline/latest/userguide/monitoring.html) 
+  [Use AWS CodePipeline with AWS CodeBuild to test code and run builds](https://docs.aws.amazon.com/codebuild/latest/userguide/how-to-create-pipeline.html) 
+  [AWS Device Farm](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-DeviceFarm.html) 