Recap Series
- 第 02 場:使用 Terraform 實現 AWS 合規
- 第 03 場:從新手到開發者:一段精彩的 AWS 雲端旅程
- 第 04 場:以團隊為優先:使用 Laravel 與 Bref 進行無伺服器工程
- 第 05 場:活動開幕:AWS Community Day Hong Kong 2025
- 第 06 場:Agent-to-Agent:在 AWS 上打造可互通的 AI
- 第 07 場:運用另一種遙測資料,透過 AI Agent 加速改善
- 第 08 場:告別 Vibe Coding:運用 Kiro 實踐規格驅動開發(Spec-Driven Development)
- 第 09 場:運用 MCP 與 AI 代理進行自動化測試
- 第 10 場:以 ML 驅動的方法實現電信安全現代化
- 第 11 場:重新思考 GenAI Agent:RAG 與 MCP
- 第 12 場:運用 TAK 與 AWS 進行災害及緊急應變
- 第 13 場:從測試角度重新思考 Serverless 應用程式工作流程
- 第 14 場:運用實務 AWS FinOps 邁向雲端成功
第一階段:需求
架構概觀
- 使用 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 架構時的主要考量
- 分離處理流程:容易測試的單元也容易理解。分離處理流程有助於找出弱點,並縮短錯誤偵測時間。
- 避免複雜度:職責與邏輯集中在同一處會讓測試變得困難。應分離處理流程,以簡化測試與疑難排解。
- 高可測試性:有助於加快系統交付並縮短開發週期。
最終目標
- 工程師的最終目標是為使用者交付價值。
- 始終將使用者價值放在心上,才能確保成果成功。
- 鼓勵透過討論與協作分享見解,持續改善測試實務。
