

# 持续集成和持续交付的测试阶段
<a name="testing-stages-in-continuous-integration-and-continuous-delivery"></a>

 这三个 CI/CD 团队应在 CI/CD 管道的不同阶段将测试纳入软件开发生命周期。总体而言，应尽早开始测试。以下测试金字塔是迈克·科恩 (Mike Cohn) 在*《成功与敏捷》* 中提供的概念。它显示了各种软件测试以及相关的成本和运行速度。

![](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image8.png)


*CI/CD 测试金字塔*

 单元测试位于金字塔的底部。它们既是运行速度最快的，也是成本最低的。因此，单元测试应构成测试策略的重要部分。一个好的经验法则是大约 70％。单元测试应该具有近乎完整的代码覆盖率，因为在此阶段中找到的错误可以快速、低成本修复。 

 服务、组件和集成测试位于金字塔上单元测试的上方。这些测试需要详细的环境，因此满足基础设施要求的成本更高，运行速度更慢。性能和合规性测试是下一个级别。它们需要生产质量的环境，而且成本更高。用户界面和用户验收测试处于金字塔的顶端，也需要生产质量的环境。 

 所有这些测试都是确保高质量软件的完整策略的一部分。但是，为了加快开发速度，重点是金字塔下半部分的测试数量和覆盖范围。 

 以下各节将讨论 CI/CD 阶段。 

## 设置源代码
<a name="setting-up-the-source"></a>

 在项目开始时，务必设置可以存储原始代码以及配置和架构更改的源代码。在源代码阶段，选择源代码存储库，例如托管在 GitHub 或 AWS CodeCommit 中的源代码存储库。 

## 设置和运行构建过程
<a name="setting-up-and-running-builds"></a>

 构建过程自动化对于 CI 流程至关重要。设置构建过程自动化时，第一项任务是选择正确的构建工具。有许多构建工具，例如： 
+  Ant、Maven 和 Gradle for Java 
+ Make for C/C\+\+
+ Grunt for JavaScript
+ Rake for Ruby

最适合您的构建工具取决于项目的编程语言和团队的技能集。选择构建工具后，需要在构建脚本中明确定义所有依赖项以及构建步骤。对最终的构建构件进行版本化也是一种最佳实践，这样可以更轻松地部署和跟踪问题。

## 构建
<a name="building"></a>

 在构建阶段，构建工具会将对源代码存储库的任何更改作为输入，构建软件，并运行以下类型的测试： 

 **单元测试** – 测试代码的特定部分，以确保代码执行预期的功能。单元测试由软件开发人员在开发阶段执行。在此阶段，可以应用静态代码分析、数据流分析、代码覆盖率和其他软件验证过程。 

 **静态代码分析** – 此测试是在构建和单元测试后不实际执行应用程序的情况下执行的。这种分析可以帮助发现编码错误和安全漏洞，还可以确保符合编码准则。 

## 暂存
<a name="staging"></a>

 在暂存阶段，将创建镜像最终生产环境的完整环境。将执行以下测试： 

 **集成测试** – 根据软件设计验证组件之间的接口。集成测试是一个迭代过程，有助于构建稳健的接口和促进系统完整性。 

 **组件测试** – 测试在不同组件之间传递的消息及其结果。该测试的一个关键目标可能是组件测试的幂等性。测试可能包括极大的数据量、边缘情况和异常输入。 

 **系统测试** – 端到端测试系统并验证软件是否满足业务需求。这可能包括测试用户界面 (UI)、API、后端逻辑和结束状态。 

 **性能测试** – 确定系统在特定工作负载下执行时的响应能力和稳定性。性能测试还用于调查、测量、确认或验证系统的其他质量属性，例如可扩展性、可靠性和资源使用情况。性能测试的类型可能包括负载测试、压力测试和峰值测试。性能测试用于根据预定义的标准进行基准测试。 

 **合规性测试** – 检查代码更改是否符合非功能规范和/或法规的要求。它确定您是否正在实施且满足定义的标准。 

 **用户验收测试** – 验证端到端业务流程。此测试由终端用户在暂存环境中执行，并确认系统是否满足要求规范的要求。通常，客户在此阶段会采用 Alpha 和 Beta 测试方法。 

## 生产
<a name="production"></a>

 最后，在通过之前的测试后，将在生产环境中重复暂存阶段。在此阶段，可以通过在将新代码部署到整个生产环境之前，将新代码部署到一小部分服务器甚至一台服务器上，或部署到一个 AWS 区域中，以完成最终 *Canary 测试*。[部署方法](deployment-methods.md)部分介绍了如何安全地部署到生产环境的具体细节。 

 下一节将讨论构建管道以合并这些阶段和测试。 