

# 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 規範性指引：測試自動化](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) 
+  [功能測試指標](https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/indicators-for-functional-testing.html) 
+  [監控管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/monitoring.html) 
+  [搭配 AWS CodeBuild 使用 AWS CodePipeline 以測試程式碼並執行建置](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) 