

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 測試 Lambda 耐用函數
<a name="durable-testing"></a>

AWS 為耐用函數提供專用測試 SDKs，可讓您在本機和雲端執行和檢查執行。為您的語言安裝測試 SDK：

------
#### [ TypeScript ]

```
npm install --save-dev @aws/aws-durable-execution-sdk-js-testing
```

如需完整的文件和範例，請參閱 GitHub 上的 [TypeScript 測試 SDK](https://github.com/aws/aws-durable-execution-sdk-js/tree/development/packages/aws-durable-execution-sdk-js-testing)。

------
#### [ Python ]

```
pip install aws-durable-execution-sdk-python-testing
```

如需完整的文件和範例，請參閱 GitHub 上的 [Python 測試 SDK](https://github.com/aws/aws-durable-execution-sdk-python-testing)。

------

測試 SDK 提供兩種測試模式：快速單元測試的本機測試，以及針對已部署函數的整合測試的雲端測試。

## 本機測試
<a name="durable-local-testing"></a>

本機測試會在開發環境中執行您的耐久函數，而不需要部署的資源。測試執行器會直接執行函數程式碼，並擷取所有要檢查的操作。

針對單元測試、測試驅動的開發和 CI/CD 管道使用本機測試。測試會在本機執行，無需網路延遲或額外費用。

**測試範例：**

------
#### [ TypeScript ]

```
import { withDurableExecution } from '@aws/aws-durable-execution-sdk-js';
import { DurableFunctionTestRunner } from '@aws/aws-durable-execution-sdk-js-testing';

const handler = withDurableExecution(async (event, context) => {
  const result = await context.step('calculate', async () => {
    return event.a + event.b;
  });
  return result;
});

test('addition works correctly', async () => {
  const runner = new DurableFunctionTestRunner({ handler });
  const result = await runner.run({ a: 5, b: 3 });
  
  expect(result.status).toBe('SUCCEEDED');
  expect(result.result).toBe(8);
  
  const step = result.getStep('calculate');
  expect(step.result).toBe(8);
});
```

------
#### [ Python ]

```
from aws_durable_execution_sdk_python import durable_execution, DurableContext
from aws_durable_execution_sdk_python_testing import DurableFunctionTestRunner
from aws_durable_execution_sdk_python.execution import InvocationStatus

@durable_execution
def handler(event: dict, context: DurableContext) -> int:
    result = context.step(lambda _: event["a"] + event["b"], name="calculate")
    return result

def test_addition():
    runner = DurableFunctionTestRunner(handler=handler)
    with runner:
        result = runner.run(input={"a": 5, "b": 3}, timeout=10)
    
    assert result.status is InvocationStatus.SUCCEEDED
    assert result.result == 8
    
    step = result.get_step("calculate")
    assert step.result == 8
```

------

測試執行器會擷取執行狀態，包括最終結果、個別步驟結果、等待操作、回呼和任何錯誤。您可以依名稱檢查操作，或逐一查看所有操作，以驗證執行行為。

### 執行存放區
<a name="durable-execution-stores"></a>

測試 SDK 使用執行存放區來保留測試執行資料。根據預設，測試會使用快速且不需要清除的記憶體內存放區。若要偵錯或分析執行歷史記錄，您可以使用將執行儲存為 JSON 檔案的檔案系統存放區。

**記憶體內存放區 （預設）：**

記憶體內存放區會在測試執行期間將執行資料保留在記憶體中。當測試完成時，資料會遺失，因此非常適合標準單元測試和 CI/CD 管道，您不需要在測試完成後檢查執行。

**檔案系統存放區：**

檔案系統存放區會將執行資料保留為 JSON 檔案至磁碟。每個執行都會儲存在個別的檔案中，以便在測試完成後輕鬆檢查執行歷史記錄。在偵錯複雜測試失敗或分析執行模式時，請使用 檔案系統存放區。

使用環境變數設定存放區：

```
# Use filesystem store
export AWS_DEX_STORE_TYPE=filesystem
export AWS_DEX_STORE_PATH=./test-executions

# Run tests
pytest tests/
```

執行檔案會以已淨化的名稱存放，並包含完整的執行狀態，包括操作、檢查點和結果。如果儲存目錄不存在，檔案系統存放區會自動建立儲存目錄。

## 雲端測試
<a name="durable-cloud-testing"></a>

雲端測試會叫用 中部署的耐用函數 AWS ，並使用 Lambda API 擷取其執行歷史記錄。使用雲端測試，透過真正的 AWS 服務和組態來驗證類似生產環境中的行為。

雲端測試需要已部署的函數和 AWS 登入資料，具有叫用函數和讀取執行歷史記錄的許可：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:GetDurableExecution",
                "lambda:GetDurableExecutionHistory"
            ],
            "Resource": "arn:aws:lambda:region:account-id:function:function-name"
        }
    ]
}
```

**雲端測試範例：**

------
#### [ TypeScript ]

```
import { DurableFunctionCloudTestRunner } from '@aws/aws-durable-execution-sdk-js-testing';

test('deployed function processes orders', async () => {
  const runner = new DurableFunctionCloudTestRunner({
    functionName: 'order-processor',
    region: 'us-east-1'
  });
  
  const result = await runner.run({ orderId: 'order-123' });
  
  expect(result.status).toBe('SUCCEEDED');
  expect(result.result.status).toBe('completed');
});
```

------
#### [ Python ]

```
from aws_durable_execution_sdk_python_testing import (
    DurableFunctionCloudTestRunner,
    DurableFunctionCloudTestRunnerConfig
)

def test_deployed_function():
    config = DurableFunctionCloudTestRunnerConfig(
        function_name="order-processor",
        region="us-east-1"
    )
    runner = DurableFunctionCloudTestRunner(config=config)
    
    result = runner.run(input={"orderId": "order-123"})
    
    assert result.status is InvocationStatus.SUCCEEDED
    assert result.result["status"] == "completed"
```

------

雲端測試會叫用實際部署的函數，並從中擷取執行歷史記錄 AWS。這可讓您驗證與其他 AWS 服務的整合、驗證效能特性，以及使用類似生產的資料和組態進行測試。

## 測試項目
<a name="durable-testing-patterns"></a>

透過驗證執行結果、操作行為和錯誤處理來測試耐用的函數。專注於商業邏輯正確性，而不是實作詳細資訊。

**驗證執行結果：**檢查函數是否傳回指定輸入的預期值。測試成功執行和錯誤案例，以確保函數適當地處理無效的輸入。

**檢查操作執行：**確認步驟、等待和回呼如預期般執行。檢查步驟結果，以確保中繼操作產生正確的值。驗證等待操作是否設定適當的逾時，以及回呼是否使用正確的設定建立。

**測試錯誤處理：**當指定無效的輸入時，使用描述性錯誤訊息來驗證函數是否正確失敗。模擬暫時性失敗並確認操作重試正確，以測試重試行為。檢查永久故障是否不會觸發不必要的重試。

**驗證工作流程：**對於多步驟工作流程，驗證操作以正確的順序執行。測試條件式分支，以確保不同的執行路徑正常運作。驗證平行操作同時執行並產生預期結果。

SDK 文件儲存庫包含廣泛的測試模式範例，包括多步驟工作流程、錯誤案例、逾時處理和輪詢模式。

## 測試策略
<a name="durable-testing-strategy"></a>

在開發期間和 CI/CD 管道中使用單元測試的本機測試。本機測試會快速執行，不需要 AWS 登入資料，並提供程式碼變更的立即意見回饋。撰寫本機測試，以驗證商業邏輯、錯誤處理和操作行為。

在部署到生產環境之前，使用雲端測試進行整合測試。雲端測試會驗證具有真實 AWS 服務和組態的行為、驗證效能特性，以及測試end-to-end工作流程。在預備環境中執行雲端測試，以便在整合問題到達生產環境之前加以發現。

在本機測試中模擬外部相依性，以隔離函數邏輯並保持快速測試。使用雲端測試來驗證與資料庫、APIs和其他 服務等外部 AWS 服務的實際整合。

撰寫重點測試來驗證一個特定行為。使用描述性測試名稱來說明正在測試的內容。將相關測試分組在一起，並針對常見的設定程式碼使用測試固定裝置。保持簡單的測試，並避免難以理解的複雜測試邏輯。

## 偵錯失敗
<a name="durable-testing-debugging"></a>

當測試失敗時，請檢查執行結果以了解發生錯誤。檢查執行狀態，以查看函數是否成功、失敗或逾時。讀取錯誤訊息以了解失敗原因。

檢查個別操作結果，找出行為偏離預期的位置。檢查步驟結果以查看產生了哪些值。驗證操作排序，以確認依預期順序執行的操作。計數操作以確保建立正確數量的步驟、等待和回呼。

常見問題包括可在重播時產生不同結果的非確定性程式碼、透過重播期間中斷的全域變數共用狀態，以及因條件式邏輯錯誤而缺少操作。使用標準除錯器和記錄來逐步執行函數程式碼和追蹤執行流程。

對於雲端測試，請檢查 CloudWatch Logs 中的執行歷史記錄，以查看詳細的操作日誌。使用追蹤來追蹤跨 服務的執行流程，並識別瓶頸。