

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 长时间测试
<a name="device-advisor-tests-long-duration"></a>

长时间测试是一种新的测试套件，可以在设备长时间运行时监控设备的行为。与运行专注于设备特定行为的单独测试相比，长时间测试可在设备的使用寿命内检查设备在各种真实场景中的行为。Device Advisor 会以尽可能最有效的顺序编排测试。测试生成结果和日志，包括摘要日志，其中包含有关设备在测试期间的性能的有用指标。

## MQTT 长时间测试使用案例
<a name="long-duration-test-case"></a>

在 MQTT 长时间测试使用案例中，设备的行为最初是在诸如 MQTT 连接、订阅、发布和重新连接之类的快乐使用案例场景中观察的。然后，在多种复杂的故障场景中观察该设备，例如 MQTT 重新连接回退、长时间服务器断开连接和间歇性连接。

## MQTT 长时间测试使用案例执行流程
<a name="long-duration-test-case-execution-flow"></a>

MQTT 长时间测试使用案例的执行分为三个阶段：

![\[显示基本测试执行、高级测试执行和额外执行时间的“MQTT 长时间测试执行”。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/mqtt-execution-flow.png)


### 执行基本测试
<a name="basic-tests-execution"></a>

在此阶段，测试使用案例并行运行多项简单测试。该测试验证设备是否在配置中选择了这些操作。

根据所选操作，基本测试集可以包括以下内容：

#### 连接
<a name="basic-tests-execution-connect"></a>

此场景验证设备是否能够成功与代理建立连接。

![\[基本连接流程，其中包括发送 CONNECT 消息的设备，以及以 CONNACK 消息及成功返回代码进行响应的代理。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/basic-connect.png)


#### 发布
<a name="basic-tests-execution-publish"></a>

此场景验证设备是否能够成功向代理发布。

##### QoS 0
<a name="publish-qos0"></a>

此测试使用案例验证设备在使用 QoS 0 发布期间是否能够成功向代理发送 `PUBLISH` 消息。测试不会等待设备收到 `PUBACK` 消息。

![\[PUBLISH QoS 0 流程，其中包括发送 QoS 0 级别的 PUBLISH 消息的设备。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/Qos0.png)


##### QoS 1
<a name="publish-qos1"></a>

在此测试用例中，设备应使用 QoS 1 向代理发送两条 `PUBLISH` 消息。在收到第一条 `PUBLISH` 消息后，代理最多等待 15 秒钟就会做出响应。设备必须在 15 秒的期限内使用相同的数据包标识符重试原始 `PUBLISH` 消息。如果是这样，代理会回复一条 `PUBACK` 消息，测试将进行验证。如果设备不重试 `PUBLISH`，会将原始 `PUBACK` 发送到设备，测试将被标记为**通过但带有警告**，并会显示系统消息。在测试执行期间，如果设备丢失连接并重新连接，则测试场景将顺利重置，并且设备必须重新执行测试场景步骤。

![\[PUBLISH QoS 1 流程，其中包括发送 QoS 1 级别的 PUBLISH 消息的设备，以及与代理的多次互动。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/Qos1.png)


#### 订阅
<a name="basic-tests-execution-subscribe"></a>

此场景验证设备是否能够成功向代理订阅。

##### QoS 0
<a name="subscribe-qos0"></a>

此测试使用案例验证设备在使用 QoS 0 订阅期间是否能够成功向代理发送 `SUBSCRIBE` 消息。测试不会等待设备收到 SUBACK 消息。

![\[SUBSCRIBE QoS 0 流程，其中包括发送 QoS 0 级别的 SUBSCRIBE 消息的设备，以及用 SUBACK 消息和“成功 - 最大 QoS 为 0”代码进行响应的代理。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/subscribe-Qos0.png)


##### QoS 1
<a name="subscribe-qos1"></a>

在此测试用例中，设备应使用 QoS 1 向代理发送两条 `SUBSCRIBE` 消息。在收到第一条 `SUBSCRIBE` 消息后，代理最多等待 15 秒钟就会做出响应。设备必须在 15 秒的期限内使用相同的数据包标识符重试原始 `SUBSCRIBE` 消息。如果是这样，代理会回复一条 `SUBACK` 消息，测试将进行验证。如果设备不重试 `SUBSCRIBE`，会将原始 `SUBACK` 发送到设备，测试将被标记为**通过但带有警告**，并会显示系统消息。在测试执行期间，如果设备丢失连接并重新连接，则测试场景将顺利重置，并且设备必须重新执行测试场景步骤。

![\[SUBSCRIBE QoS 1 流程，其中包括发送 QoS 1 级别的 SUBSCRIBE 消息的设备，以及与代理的多次互动。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/subscribe-Qos1.png)


#### 重新连接
<a name="basic-tests-execution-reconnect"></a>

此场景验证在设备从成功连接断开连接后，是否能够成功与代理重新连接。如果在之前的测试套件期间多次连接设备，Device Advisor 不会断开设备此连接。相反，它会将测试标记为 **Pass**（通过）。

![\[DUT 和代理之间的 RECONNECT 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/reconnect.png)


### 执行高级测试
<a name="advanced-tests-execution"></a>

在此阶段，测试使用案例连续运行更复杂的测试，以验证设备是否遵循最佳实践。这些高级测试可供选择，如果不需要，可以选择退出。根据场景的要求，每个高级测试都有自己的超时值。

#### 订阅 QoS 1 时返回 PUBACK
<a name="advanced-tests-execution-return-puback"></a>

**注意**  
仅当您的设备能够执行 QoS 1 订阅时才选择此场景。

此场景验证设备订阅主题并收到来自代理的 `PUBLISH` 消息后是否返回 `PUBACK` 消息。

![\[DUT 和代理之间的 RETURN PUBACK ON QoS 1 SUBSCTIPTION 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/return-puback.png)


#### 接收较大有效载荷
<a name="advanced-tests-execution-receive-large-payload"></a>

**注意**  
仅当您的设备能够执行 QoS 1 订阅时才选择此场景。

此场景验证设备在从代理接收到 QoS 1 主题的具有较大有效载荷的 `PUBLISH` 消息后，是否以 `PUBACK` 消息进行响应。可以使用 `LONG_PAYLOAD_FORMAT` 选项配置预期有效载荷的格式。

![\[DUT 和代理之间的 RECEIVE LARGE PAYLOAD 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/large-payload.png)


#### 持久会话
<a name="advanced-tests-execution-persistent-session"></a>

**注意**  
仅当您的设备能够执行 QoS 1 订阅，并且能够保留持久会话时才选择此场景。

此场景验证设备在保留持续性会话方面的行为。当满足以下条件时，此测试将进行验证：
+ 设备在具有有效 QoS 1 订阅并启用持久会话的情况下连接到代理。
+ 设备在会话期间成功断开与代理的连接。
+ 设备重新连接到代理并恢复对其触发器主题的订阅，而没有明确重新订阅这些主题。
+ 设备成功接收代理存储的有关其订阅主题的消息，并按预期运行。

 有关 AWS IoT 持久会话的更多信息，请参阅[使用 MQTT 持久会话](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html#mqtt-persistent-sessions)。

![\[DUT 和代理之间的 PERSISTENT SESSION 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/persistent-session.png)


#### 保持活动
<a name="advanced-tests-execution-keep-alive"></a>

此场景验证设备在未收到来自代理的 ping 响应后是否成功断开连接。连接必须配置有效的保持活动计时器。作为此测试的一部分，代理会阻止针对 `PUBLISH`、`SUBSCRIBE` 和 `PINGREQ` 消息发送的所有响应。它还验证正在测试的设备是否断开了 MQTT 连接。

![\[DUT 和代理之间的 KEEP ALIVE 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/keep-alive.png)


#### 间歇性连接
<a name="advanced-tests-execution-intermittent-connectivity"></a>

此场景验证在代理以随机间隔断开设备连接一段随机时间后，设备是否可以连接回代理。

![\[DUT 和代理之间的 INTERMITTENT CONNECTIVITY 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/intermittent.png)


#### 重新连接回退
<a name="advanced-tests-execution-reconnect-backoff"></a>

此场景验证代理多次与设备断开连接时，设备是否实现了回退机制。Device Advisor 将回退类型报告为指数回退、抖动回退、线性回退或恒定回退。回退尝试次数可使用 `BACKOFF_CONNECTION_ATTEMPTS` 选项进行配置。默认值是 5。此值可配置为 5 到 10。

要通过此测试，我们建议在所测试设备上实施[指数回退和抖动](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)机制。

![\[DUT 和代理之间的 RECONNECT BACKOFF 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/reconnect-backoff.png)


#### 服务器长时间断开连接
<a name="advanced-tests-execution-longserver-disconnect"></a>

此场景验证代理在较长一段时间（最多 120 分钟）断开设备连接后，设备是否可以成功重新连接。可以使用 `LONG_SERVER_DISCONNECT_TIME` 选项配置服务器断开连接的时间。默认值为 120 分钟。此值可配置为 30 到 120 分钟。

![\[DUT 和代理之间的 LONG SERVER DISCONNECT 流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/longserver-disconnect.png)


### 额外执行时间
<a name="additional-execution-time"></a>

额外执行时间是测试在完成所有上述测试之后，以及结束测试使用案例之前等待的时间。客户利用这段额外时间来监控和记录设备与代理之间的所有通信。可以使用 `ADDITIONAL_EXECUTION_TIME` 选项配置额外执行时间。默认情况下，此选项设置为 0 分钟，也可以设置为 0 到 120 分钟。

## MQTT 长时间测试配置选项
<a name="long-duration-test-case-config-options"></a>

为 MQTT 长时间测试提供的所有配置选项都是可选的。以下选项可用：

**操作**  
设备执行的操作列表，例如 `CONNECT`、`PUBLISH` 和 `SUBSCRIBE`。测试使用案例根据指定的操作运行场景。未指定的操作假定为有效。  

```
{                                
"OPERATIONS": ["PUBLISH", "SUBSCRIBE"]
//by default the test assumes device can CONNECT   
}
```

**场景**  
测试使用案例根据所选操作运行场景来验证设备的行为。有两种类型的场景：  
+ **基本场景**是一些简单的测试，用于验证设备是否可以执行上面作为配置的一部分选择的操作。这些场景是根据配置中指定的操作预先选择的。配置中不需要输入更多内容。
+ **高级场景**是对设备执行的更为复杂的场景，用于验证设备在满足现实条件时是否遵循了最佳实践。这些场景是可选的，可以作为场景数组传递给测试套件的配置输入。

```
{                                
    "SCENARIOS": [      // list of advanced scenarios
                "PUBACK_QOS_1",
                "RECEIVE_LARGE_PAYLOAD",
                "PERSISTENT_SESSION",
                "KEEP_ALIVE",
                "INTERMITTENT_CONNECTIVITY",
                "RECONNECT_BACK_OFF",
                "LONG_SERVER_DISCONNECT"
    ]  
}
```

**BASIC\$1TESTS\$1EXECUTION\$1TIME\$1OUT：**  
测试使用案例等待所有基本测试完成的最长时间。默认值为 60 分钟。此值可配置为 30 到 120 分钟。

**LONG\$1SERVER\$1DISCONNECT\$1TIME：**  
在“服务器长时间断开连接”测试期间，测试使用案例断开连接和重新连接设备所用的时间。默认值为 60 分钟。此值可配置为 30 到 120 分钟。

**ADDITIONAL\$1EXECUTION\$1TIME：**  
配置此选项可在所有测试完成后提供一个时间范围，用于监控设备和代理之间的事件。默认值为 5 分钟。此值可配置为 0 到 120 分钟。

**BACKOFF\$1CONNECTION\$1ATTEMPTS：**  
此选项可配置测试使用案例断开连接设备的次数。此选项由重新连接回退测试使用。默认值为 5 次。此值可配置为 5 到 10。

**LONG\$1PAYLOAD\$1FORMAT：**  
当测试使用案例发布到设备订阅的 QoS 1 主题时，设备期望的消息有效载荷格式。

**API 测试用例定义：**

```
{                                
"tests":[
   {
      "name":"my_mqtt_long_duration_test",
      "configuration": {
         // optional
         "OPERATIONS": ["PUBLISH", "SUBSCRIBE"], 
         "SCENARIOS": [      
            "LONG_SERVER_DISCONNECT", 
            "RECONNECT_BACK_OFF",
            "KEEP_ALIVE",
            "RECEIVE_LARGE_PAYLOAD",
            "INTERMITTENT_CONNECTIVITY",
            "PERSISTENT_SESSION",   
         ],
         "BASIC_TESTS_EXECUTION_TIMEOUT": 60, // in minutes (60 minutes by default)
         "LONG_SERVER_DISCONNECT_TIME": 60,   // in minutes (120 minutes by default)
         "ADDITIONAL_EXECUTION_TIME": 60,     // in minutes (0 minutes by default)
         "BACKOFF_CONNECTION_ATTEMPTS": "5",
         "LONG_PAYLOAD_FORMAT":"{"message":"${payload}"}"
      },
      "test":{
         "id":"MQTT_Long_Duration",
         "version":"0.0.0"
      }
   }
 ]      
}
```

## MQTT 长时间测试使用案例摘要日志
<a name="long-duration-test-case-summary-log"></a>

MQTT 长时间测试使用案例的运行时间比常规测试使用案例长。提供了单独的摘要日志，其中列出了运行期间的重要事件，例如设备连接、发布和订阅。详细信息包括测试的内容、未测试的内容和失败的内容。测试会在日志的末尾包含测试使用案例运行期间发生的所有事件的摘要。摘要包括：
+ *设备上配置的“保持活动”计时器。*
+ *设备上配置的持久会话标志。*
+ *测试运行期间的设备连接数。*
+ *设备重新连接回退类型（如果已通过重新连接回退测试验证）。*
+ *在测试使用案例运行期间，设备发布到的主题。*
+ *在测试用例运行期间，设备订阅的主题。*