AWS Community Day Hong Kong 2025 Recap

從測試角度重新思考 Serverless 應用程式工作流程

Recap Series

第一階段:需求

架構概觀

  • 使用 AWS Lambda 與 Step Functions 的批次處理工作流程。
  • 三個狀態依序串接。
  • 每個 Lambda 函式都有單元測試,但 Step Functions 工作流程仍採用手動測試。

測試目標

  • 將 Step Functions 工作流程測試自動化。
  • 確保輸入與輸出值符合預期。
  • 使用 GitHub Actions 將測試整合至 CI/CD Pipeline。
  • 避免為了測試而部署至實際 AWS 環境。

第二階段:規劃

工具與技術

  • Step Functions Local:在本機執行及測試 Step Functions。
  • GitHub Actions:自動化 CI/CD 工作流程。
  • Localstack 或類似工具:在本機模擬 AWS Lambda。

GitHub Actions 工作流程

  • 設定在 Push 或 Pull Request 時執行測試的工作流程。
  • 使用 Step Functions Local Docker image 建立本機測試環境。
  • 使用 Localstack 模擬 Lambda。
  • https://www.localstack.cloud/
  • 匯入 Step Functions 定義,並在本機執行工作流程。
  • 驗證各個狀態的輸入與輸出值。

工作流程步驟

  • [ 1 ] 啟動 Container:
  • Pull 並啟動 Step Functions Local Docker image。
  • 設定 Localstack 以模擬 Lambda。
  • [ 2 ] 匯入 Step Functions 定義:
  • 將狀態機定義匯入本機環境。
  • [ 3 ] 執行工作流程:
  • 使用本機 Endpoint 觸發 Step Functions 工作流程。
  • [ 4 ] 驗證結果:
  • 檢查輸入與輸出值是否符合預期。
  • [ 5 ] 回報結果:
  • 產生報告或狀態,顯示測試成功或失敗。

如何測試 Serverless 架構?

簡介

  • Serverless 架構具備顯著優勢,可快速為客戶交付價值。
  • 此處著重於測試觀點,而非系統效能或成本。

為什麼需要測試?

  • 測試有助於理解、預測及控制系統行為。
  • 我們可以藉此識別並量化系統風險。
  • 撰寫測試有助於進一步理解需求。
  • 測試可確保結果能夠重現並獲得合理解釋。
  • 測試的主要目標是降低未知風險。

測試類型

  • 單元測試:隔離測試個別元件或函式。
  • 整合測試:測試多個元件組合後的互動。
  • 邏輯測試:驗證商業邏輯是否正確。
  • 工作流程測試:測試程序或工作流程的端對端流程。
  • API 測試:測試 API 的功能與可靠性。

建議

  • 務必瞭解不同測試類型,以及各自的用途與目標。
  • 理解這些測試類型,有助於為 Serverless 架構設計有效的測試策略。

分離處理流程,讓測試更容易

重點摘要

  • 易於測試的單元:容易測試的單元也容易理解。
  • 系統清晰度:將系統設計成彼此分離、可測試的單元,自然就能清楚呈現系統做什麼、何時執行,以及為何執行。
  • 避免複雜度:若某項功能難以測試,通常代表過多職責與邏輯集中在同一處。

範例比較

  • 架構不足:單一 Lambda 函式同時負責從其他 Server 取得資料,以及處理資料並儲存至 DynamoDB。
  • 合適的架構:為每項作業(取得資料,以及處理/儲存資料)分別使用不同的 Lambda 函式。

分離的優點

  • 更容易個別測試每個部分。
  • 發生錯誤時,更容易精確找出問題位置。
  • 縮短從錯誤發生到找出並修正錯誤所需的時間。

一般原則

  • 拆分方法:拆分方法的原則適用於不同程式語言(例如 Python、Ruby、Go)。
  • 小型單元:找出你認為小而可測試的單元,並據此套用拆分原則。

系統設計中的測試觀點

  • 找出弱點:從測試角度出發,很容易發現問題,例如過多職責集中在同一處。
  • 縮短錯誤偵測時間:高可測試性有助於縮短從錯誤發生到偵測並修正錯誤所需的時間,就像縮短開發週期一樣。
  • 快速交付:高可測試性有助於加快系統交付。

從測試角度建置 Serverless 架構時的主要考量

  • 分離處理流程:容易測試的單元也容易理解。分離處理流程有助於找出弱點,並縮短錯誤偵測時間。
  • 避免複雜度:職責與邏輯集中在同一處會讓測試變得困難。應分離處理流程,以簡化測試與疑難排解。
  • 高可測試性:有助於加快系統交付並縮短開發週期。

最終目標

  • 工程師的最終目標是為使用者交付價值。
  • 始終將使用者價值放在心上,才能確保成果成功。
  • 鼓勵透過討論與協作分享見解,持續改善測試實務。