

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

# 長時間測試
<a name="device-advisor-tests-long-duration"></a>

長時間測試是一款新型測試套件，可監測裝置在長時間運作期間的行為。相較於執行著重於裝置特定行為的個別測試，長時間測試會檢查裝置在其使用壽命內各種實際案例中的行為。Device Advisor 會以最有效率的順序來協調測試。該測試會產生結果和日誌，其中包括一份摘要日誌，詳載有關裝置效能的實用指標。

## MQTT 長時間測試案例
<a name="long-duration-test-case"></a>

在 MQTT 長時間測試案例中，起初會以 MQTT Connect、訂閱、發佈和重新連線等簡易案例的情境來觀察裝置行為。然後，在多種複雜的故障情境下觀察裝置，例如 MQTT 重新連線輪詢、長時間伺服器中斷連線以及間歇性連線。

## MQTT 長時間測試案例執行流程
<a name="long-duration-test-case-execution-flow"></a>

MQTT 長時間測試案例的執行分為三個階段：

![\[顯示基本測試執行、進階測試執行和其他執行時間的「MQTT 長期測試執行」。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/mqtt-execution-flow.png)


### 基本測試執行
<a name="basic-tests-execution"></a>

此階段的測試案例會以並行方式執行簡易測試。測試將驗證裝置是否依據在組態中所做的選擇進行操作。

根據所選操作，一組基本測試可以包括以下內容：

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

此案例會驗證裝置是否能夠與代理程式成功建立連線。

![\[基本連線流程，其中包含傳送 CONNECT 訊息的裝置，而 Broker 會以成功的傳回碼回應 CONNACK 訊息。\]](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/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_tw/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_tw/iot/latest/developerguide/images/subscribe-Qos1.png)


#### 重新連線
<a name="basic-tests-execution-reconnect"></a>

此案例會驗證裝置在從成功的連線中斷之後，是否成功與代理程式重新連線。如果先前已在測試套件期間連線多次，則 Device Advisor 不會中斷裝置連線。相反，它會將測試標記為**通過**。

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


### 進階測試執行
<a name="advanced-tests-execution"></a>

此階段的測試案例會以序列方式執行較複雜的測試，以驗證裝置是否遵循最佳實務。這些進階測試可供選擇，若無需要可以選擇不執行。根據案例需求，每項進階測試都各有專屬的逾期值。

#### RETURN PUBACK ON QoS 1 SUBSCRIPTION
<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_tw/iot/latest/developerguide/images/return-puback.png)


#### RECEIVE LARGE PAYLOAD
<a name="advanced-tests-execution-receive-large-payload"></a>

**注意**  
只有當您的裝置能夠執行 QoS 1 訂閱時，才可選取此案例。

此案例會驗證裝置在收到具有大型承載的 QoS 1 主題的代理程式發出的 `PUBLISH` 訊息後，是否會以 `PUBACK` 訊息進行回應。可以使用 `LONG_PAYLOAD_FORMAT` 選項設定預期承載的格式。

![\[DUT 與代理程式之間的接收大型 PAYLOAD 流程。\]](http://docs.aws.amazon.com/zh_tw/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_tw/iot/latest/developerguide/images/persistent-session.png)


#### Keep-Alive
<a name="advanced-tests-execution-keep-alive"></a>

此案例會驗證裝置在未收到代理程式的 Ping 回應後是否能成功中斷連線。必須為連線設定有效的保持連線計時器。在此測試中，代理程式會封鎖所有針對 `PUBLISH`、`SUBSCRIBE` 和 `PINGREQ` 訊息而傳送的回應。其也會驗證待測裝置是否中斷與 MQTT 的連線。

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


#### INTERMITTENT CONNECTIVITY
<a name="advanced-tests-execution-intermittent-connectivity"></a>

此案例會驗證代理程式在隨機間隔內與裝置中斷連線之後，裝置是否可以恢復與代理程式的連線。

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


#### RECONNECT BACKOFF
<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_tw/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_tw/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:**  
若設定此選項，系統會在完成所有測試後提供一個時段，用以監控裝置與代理程式之間的事件。預設值為 0 分鐘。此值可以設定的範圍介於 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 長時間測試案例的執行時間較常規測試案例更長。會提供個別摘要日誌，其中列出執行期間的裝置連線、發佈和訂閱等重要事件。詳細資訊包括已測試的項目、未測試的項目以及失敗的項目。測試功能會在日誌結尾列出測試案例執行期間所發生全部事件的摘要。其中包含：
+ *在裝置上設定的保持連線計時器。*
+ *裝置上設定的持久性工作階段旗標。*
+ *裝置在測試執行期間的連線次數。*
+ *裝置重新連線退避類型 (若已通過重新連線退避測試的驗證)。*
+ *在測試案例執行期間作為裝置發佈目標的主題。*
+ *裝置在測試案例執行期間訂閱的主題。 *