

# OPS05-BP02 測試並驗證變更
<a name="ops_dev_integ_test_val_chg"></a>

 所部署的每項變更都必須經過測試，以避免在生產環境中發生錯誤。此一最佳實務著重於各種變更 (從版本控制到成品組建) 的測試。除了應用程式的程式碼變更以外，測試也應包含基礎設施、組態、安全控制和操作程序。測試採取多種形式，從單元測試到軟體元件分析 (SCA) 都包括在內。將測試進一步納入軟體整合和交付程序中，可進一步確保成品的品質。 

 您的組織必須制定所有軟體成品的測試標準。自動化測試可節省人力並避免手動測試錯誤。在某些情況下可能需進行手動測試。開發人員必須有權存取自動化測試結果，以建立可改善軟體品質的回饋迴圈。 

 **預期成果：** 您的軟體變更在交付前都經過測試。開發人員有權存取測試結果和驗證。您的組織具有適用於所有軟體變更的測試標準。 

 **常見的反模式：** 
+ 您在部署新軟體變更時未進行任何測試。軟體在生產環境中無法執行，因而導致中斷。
+ 新的安全群組透過 CloudFormation 進行部署，而未在生產前環境中測試。安全群組使您的客戶無法連線到應用程式。
+ 方法已經過修改，但沒有單元測試。軟體部署至生產環境時失敗。

 **建立此最佳實務的優勢：** 軟體部署的變更失敗率降低。軟體品質獲得改善。開發人員對於程式碼的可行性感知能力提高。可以安心推出安全政策，以支援組織的合規性。基礎設施變更 (例如自動化擴展政策更新) 會事先經過測試，以符合流量需求。 

 **未建立此最佳實務時的曝險等級：** 高 

## 實作指引
<a name="implementation-guidance"></a>

 在持續整合的實務過程中，會對所有變更執行測試，從應用程式程式碼到基礎設施都包含在內。會發佈測試結果，讓開發人員迅速獲得反饋。您的組織具有所有變更都必須通過的測試標準。 

 **客戶範例** 

 在其持續整合管道中，AnyCompany Retail 對所有軟體成品執行了數種類型的測試。他們實行了測試驅動的開發，因此所有軟體都有測試單元。在成品建置後，他們執行了端對端測試。這個第一輪測試完成後，他們執行了靜態應用程式安全掃描，以尋找已知漏洞。開發人員在每個測試門檻通過後均收到訊息。所有測試都完成後，軟體成品即儲存在成品儲存庫中。 

### 實作步驟
<a name="implementation-steps"></a>

1.  與組織中的利害關係人合作制定軟體成品的測試標準。所有成品均應通過的標準測試為何？ 是否有必須納入測試涵蓋範圍內的合規或管控要求？ 您是否需要執行程式碼品質測試？ 測試完成時，誰需要得知？ 

   1.  此 [AWS 部署管道參考架構](https://pipelines.devops.aws.dev/) 包含可在整合管道中對軟體成品執行之測試類型的授權清單。 

1.  根據您的軟體測試標準，以必要的測試檢測您的應用程式。每一組測試均應在十分鐘內完成。測試應執行為整合管道的一部分。 

   1.  [Amazon CodeGuru Reviewer](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/welcome.html) 可測試您的應用程式程式碼是否有缺陷。 

   1.  您可以使用 [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 對軟體成品執行測試。 

   1.  [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可將您的軟體測試安排到管道中。 

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

 **相關的最佳實務：** 
+  [OPS05-BP01 使用版本控制](ops_dev_integ_version_control.md) 
+  [OPS05-BP06 共用設計標準](ops_dev_integ_share_design_stds.md) 
+  [OPS05-BP10 完全自動化整合和部署](ops_dev_integ_auto_integ_deploy.md) 

 **相關文件：** 
+ [ 採用測試驅動的開發方法 ](https://docs.aws.amazon.com/prescriptive-guidance/latest/best-practices-cdk-typescript-iac/development-best-practices.html)
+ [ 使用 TaskCat 和 CodePipeline 的自動化 CloudFormation 測試管道 ](https://aws.amazon.com/blogs/devops/automated-cloudformation-testing-pipeline-with-taskcat-and-codepipeline/)
+ [ 使用開放原始碼 SCA、SAST 和 DAST 工具建置端對端 AWS DevSecOps CI/CD 管道 ](https://aws.amazon.com/blogs/devops/building-end-to-end-aws-devsecops-ci-cd-pipeline-with-open-source-sca-sast-and-dast-tools/)
+ [ 開始測試無伺服器應用程式 ](https://aws.amazon.com/blogs/compute/getting-started-with-testing-serverless-applications/)
+ [ CI/CD 管道是我的 release captain ](https://aws.amazon.com/builders-library/cicd-pipeline/)
+ [ 在 AWS 上實行持續整合和持續交付白皮書 ](https://docs.aws.amazon.com/whitepapers/latest/practicing-continuous-integration-continuous-delivery/welcome.html)

 **相關影片：** 
+ [AWS re:Invent 2020：可測試的基礎設施：對 AWS 的整合測試 ](https://www.youtube.com/watch?v=KJC380Juo2w)
+ [AWS Summit ANZ 2021 - 透過 CDK 和測試驅動的開發施行測試優先策略 ](https://www.youtube.com/watch?v=1R7G_wcyd3s)
+ [ 使用 AWS CDK 測試基礎設施即程式碼 ](https://www.youtube.com/watch?v=fWtuwGSoSOU)

 **相關資源：** 
+ [AWS 部署管道參考架構 - 應用程式 ](https://pipelines.devops.aws.dev/application-pipeline/index.html)
+ [AWS Kubernetes DevSecOps 管道 ](https://github.com/aws-samples/devsecops-cicd-containers)
+ [ 政策即程式碼研討會 – 測試驅動的開發 ](https://catalog.us-east-1.prod.workshops.aws/workshops/9da471a0-266a-4d36-8596-e5934aeedd1f/en-US/pac-tools/cfn-guard/tdd)
+ [ 使用 AWS CodeBuild 為 GitHub 中的 Node.js 應用程式執行單元測試 ](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/run-unit-tests-for-a-node-js-application-from-github-by-using-aws-codebuild.html)
+ [ 使用 Serverspec 進行基礎設施程式碼的測試驅動開發 ](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/use-serverspec-for-test-driven-development-of-infrastructure-code.html)

 **相關服務：** 
+  [Amazon CodeGuru Reviewer](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/welcome.html) 
+  [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 
+  [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 