

# 测试函数
<a name="test-function"></a>

在将函数部署到实时阶段（生产环境）之前，您可以先对该函数进行测试以确保其按预期运行。要测试函数，您需要指定一个*事件对象*，该对象表示 CloudFront 分配可能在生产环境中接收的 HTTP 请求或响应。

CloudFront Functions 执行以下操作：

1. 将提供的事件对象作为输入来运行函数。

1. 返回函数的结果（修改后的事件对象）和任何函数日志或错误消息以及函数的*计算利用率*。有关计算利用率的更多信息，请参阅[了解计算利用率](#compute-utilization)。

**注意**  
测试函数时，CloudFront 仅验证函数的执行错误。CloudFront 不会验证请求在发布后是否会成功通过。例如，如果您的函数删除了所需标头，测试仍会成功，因为代码没有问题。但是，如果您发布函数并将其与分配相关联，则通过 CloudFront 发出请求时，函数将失败。

**Contents**
+ [设置事件对象](#test-function-create-event)
+ [测试此函数](#test-function-step-test)
+ [了解计算利用率](#compute-utilization)

## 设置事件对象
<a name="test-function-create-event"></a>

在测试函数之前，必须设置用于测试函数的事件对象。有多种选择。

**选项 1：在不保存的情况下设置事件对象**  
您可以在 CloudFront 控制台的可视化编辑器中设置事件对象，而不将其保存。  
您可以使用此事件对象从 CloudFront 控制台测试该函数，即使未保存该对象。

**选项 2：在可视化编辑器中创建事件对象**  
您可以在 CloudFront 控制台的可视化编辑器中设置事件对象，而不将其保存。您可以为每个函数创建 10 个事件对象，以便您可以测试不同的可能输入。  
以这种方式创建事件对象时，您可以使用事件对象在 CloudFront 控制台中测试该函数。您不能使用它通过 AWS API 或 SDK 来测试函数。

**选项 3：使用文本编辑器创建事件对象**  
您可以使用文本编辑器以 JSON 格式创建事件对象。有关事件对象结构的信息，请参阅[事件结构](functions-event-structure.md)。  
您可以使用此事件对象通过 CLI 测试函数。但不能使用它在 CloudFront 控制台中测试函数。

**创建事件对象（选项 1 或 2）**

1. 通过 [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) 登录到 CloudFront 控制台，然后选择**函数**页面。

   选择您要测试的函数。

1. 在函数详细信息页面上，选择**测试**选项卡。

1. 对于**事件类型**，选择以下选项之一：
   + 如果您的函数修改了 HTTP 请求或根据请求生成了响应，请选择**查看器请求**。此时将显示**请求**部分。
   + 选择**查看器响应**。此时将显示**请求**和**响应**部分。

1. 填写要包含在事件中的字段。您可以选择**编辑 JSON** 来查看原始 JSON。

1. （可选）要保存事件，请选择**保存**，在**保存测试事件**中输入名称，然后选择**保存**。

   您也可以选择**编辑 JSON** 并复制原始 JSON，然后将其保存在 CloudFront 之外您自己的文件中。

**创建事件对象（选项 3）**

使用文本编辑器创建事件对象。将文件存储在计算机可以连接到的目录中。

请确保遵循以下指导原则：
+ 忽略 `distributionDomainName`、`distributionId` 和 `requestId` 字段。
+ 标头、Cookie 和查询字符串的名称必须为小写。

以这种方式创建事件对象的一个选项是使用可视化编辑器创建示例。您可以确保示例的格式正确。然后，您可以复制原始 JSON，并将其粘贴到文本编辑器中，然后保存文件。

有关事件结构的更多信息，请参阅[事件结构](functions-event-structure.md)。

## 测试此函数
<a name="test-function-step-test"></a>

您可以在 CloudFront 控制台中或使用 AWS Command Line Interface（AWS CLI）测试函数。

------
#### [ Console ]

**测试此函数**

1. 通过 [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) 登录到 CloudFront 控制台，然后选择**函数**页面。

1. 选择您要测试的函数。

1. 选择**测试**选项卡。

1. 确保显示了正确的事件。要从当前显示的事件切换，请在**选择测试事件**字段中选择另一个事件。

1. 选择**测试函数**。控制台显示函数的输出，包括函数日志和计算利用率。

------
#### [ CLI ]

您可以使用 **aws cloudfront test-function** 命令测试函数。

**测试此函数**

1. 打开一个命令行窗口。

1. 您必须从包含指定文件的同一个目录运行以下命令。

   此示例使用 `fileb://` 表示法来传入事件对象文件。它还包括换行符，以使命令更具可读性。

   ```
   aws cloudfront test-function \
       --name MaxAge \
       --if-match ETVABCEXAMPLE \
       --event-object fileb://event-maxage-test01.json \
       --stage DEVELOPMENT
   ```
**备注**  
您可以通过函数的名称和 ETag（在 `if-match` 参数中）来引用该函数。您可以通过事件对象在文件系统中的位置来引用该对象。
阶段可以为 `DEVELOPMENT` 或 `LIVE`。

   该命令成功执行后，您会看到类似以下内容的输出。

   ```
   TestResult:
     ComputeUtilization: '21'
     FunctionErrorMessage: ''
     FunctionExecutionLogs: []
     FunctionOutput: '{"response":{"headers":{"cloudfront-functions":{"value":"generated-by-CloudFront-Functions"},"location":{"value":"https://aws.amazon.com/cloudfront/"}},"statusDescription":"Found","cookies":{},"statusCode":302}}'
     FunctionSummary:
       FunctionConfig:
         Comment: MaxAge function
         Runtime: cloudfront-js-2.0
         KeyValueStoreAssociations= \
         {Quantity=1, \
         Items=[{KeyValueStoreARN='arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'}]} \
       FunctionMetadata:
         CreatedTime: '2021-04-18T20:38:56.915000+00:00'
         FunctionARN: arn:aws:cloudfront::111122223333:function/MaxAge
         LastModifiedTime: '2023-17-20T10:38:57.057000+00:00'
         Stage: DEVELOPMENT
       Name: MaxAge
       Status: UNPUBLISHED
   ```

------

**备注**  
`FunctionExecutionLogs` 包含函数在 `console.log()` 语句中写入的日志行列表（如果有）。
`ComputeUtilization` 包含有关运行函数的信息。请参阅[了解计算利用率](#compute-utilization)。
`FunctionOutput` 包含函数返回的事件对象。

## 了解计算利用率
<a name="compute-utilization"></a>

**计算利用率**是函数运行所花费的时间占最大允许时间的百分比。例如，值为 35 表示函数在最大允许时间的 35% 内完成。

如果函数持续超过最大允许时间，CloudFront 将限制该函数。以下列表说明了函数根据计算利用率值受到限制的可能性。

**计算利用率值：**
+ **1 – 50** – 该函数远低于最大允许时间，应在不受限制的情况下运行。
+ **51 – 70** – 函数正在接近最大允许时间。考虑优化函数代码。
+ **71 – 100** – 函数非常接近或超过最大允许时间。如果您将此函数与分配关联，CloudFront 可能会限制此函数。