

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Device Advisor ワークフロー
<a name="device-advisor-workflow"></a>

このチュートリアルでは、カスタムテストスイートを作成し、コンソールでテストするデバイスに対してテストを実行する方法について説明します。テストが完了したら、テスト結果と詳細ログを表示できます。

## 前提条件
<a name="device-advisor-workflow-prereqs"></a>

このチュートリアルを開始する前に、「[設定](device-advisor-setting-up.md)」で説明されている手順を完了してください。

## テストスイート定義を作成する
<a name="device-advisor-workflow-create-suite-definition"></a>

まず、 [AWS SDK をインストールします](https://docs.aws.amazon.com/iot/latest/developerguide/iot-connect-service.html#iot-service-sdks)。

### `rootGroup` の構文
<a name="rootGroup"></a>

ルートグループは、テストスイートに含めるテストケースを指定する JSON 文字列です。また、これらのテストケースに必要な構成も指定します。ルートグループを使用して、テストスイートを任意の態様で構造化し、順序付けます。テストスイートの階層は次のとおりです。

```
test suite → test group(s) → test case(s)
```

テストスイートには少なくとも 1 つのテストグループがなければならず、各テストグループには少なくとも 1 つのテストケースが必要です。Device Advisor は、テストグループとテストケースを定義する順序でテストを実行します。

各ルートグループは、次の基本的な構造に従います。

```
{
    "configuration": {  // for all tests in the test suite
        "": ""
    }
    "tests": [{
        "name": ""
        "configuration": {  // for all sub-groups in this test group 
            "": ""
        },
        "tests": [{
            "name": ""
            "configuration": {  // for all test cases in this test group 
                "": ""
            },
            "test": {
                "id": ""  
                "version": ""
            }
        }]
    }]
}
```



ルートグループでは、グループに含まれる `name`、`configuration`、および `tests` を使用してテストスイートを定義します。`tests` グループには、個々のテストの定義が含まれています。各テストは、`name`、`configuration` およびそのテストのテストケースを定義する `test` ブロックを使用して定義します。最後に、各テストケースは `id` と `version` で定義されます。

各テストケース (`test` ブロック) の `"id"` フィールドと `"version"` フィールドの使用方法については、「[Device Advisor テストケース](device-advisor-tests.md)」を参照してください。そのセクションには、使用可能な `configuration` 設定に関する情報も含まれています。

次のブロックは、ルートグループ設定の例です。この設定では、設定フィールドについての説明とともに、*MQTT Connect Happy Case* および *MQTT Connect Exponential Backoff Retries* テストケースを指定します。

```
{
    "configuration": {},  // Suite-level configuration
    "tests": [            // Group definitions should be provided here
      {
        "name": "My_MQTT_Connect_Group",  // Group definition name
        "configuration": {}               // Group definition-level configuration,
        "tests": [                        // Test case definitions should be provided here
        {
            "name": "My_MQTT_Connect_Happy_Case",  // Test case definition name
            "configuration": {
                "EXECUTION_TIMEOUT": 300        // Test case definition-level configuration, in seconds
            }, 
            "test": {
                "id": "MQTT_Connect",              // test case id
                "version": "0.0.0"                 // test case version
            }
        },
        {
            "name": "My_MQTT_Connect_Jitter_Backoff_Retries",  // Test case definition name
            "configuration": {
                "EXECUTION_TIMEOUT": 600                 // Test case definition-level configuration,  in seconds
            },
            "test": {
                "id": "MQTT_Connect_Jitter_Backoff_Retries",  // test case id
                "version": "0.0.0"                                 // test case version
            }
        }]
    }]
}
```

テストスイート定義を作成するときに、ルートグループ設定を指定する必要があります。応答オブジェクトで返された `suiteDefinitionId` を保存します。この ID を使用して、テストスイートの定義情報を取得し、テストスイートを実行できます。

Java SDK の例を次に示します。

```
response = iotDeviceAdvisorClient.createSuiteDefinition(
        CreateSuiteDefinitionRequest.builder()
            .suiteDefinitionConfiguration(SuiteDefinitionConfiguration.builder()
                .suiteDefinitionName("your-suite-definition-name")
                .devices(
                    DeviceUnderTest.builder()
                        .thingArn("your-test-device-thing-arn")
                        .certificateArn("your-test-device-certificate-arn")
                        .deviceRoleArn("your-device-role-arn") //if using SigV4 for MQTT over WebSocket
                        .build()
                )
                .rootGroup("your-root-group-configuration")
                .devicePermissionRoleArn("your-device-permission-role-arn")
                .protocol("MqttV3_1_1 || MqttV5 || MqttV3_1_1_OverWebSocket || MqttV5_OverWebSocket")
                .build()
            )
            .build()
)
```

## テストスイート定義を取得する
<a name="device-advisor-workflow-describe-suite-run"></a>

テストスイート定義を作成した後、`CreateSuiteDefinition` API オペレーションの応答オブジェクトで `suiteDefinitionId` を受け取ります。

オペレーションが `suiteDefinitionId` を返すと、各グループ内に新しい `id` フィールドが表示され、ルートグループ内にテストケース定義が表示される場合があります。これらの ID を使用してテストスイート定義のサブセットを実行できます。

Java SDK の例: 

```
response = iotDeviceAdvisorClient.GetSuiteDefinition(
    GetSuiteDefinitionRequest.builder()
        .suiteDefinitionId("your-suite-definition-id")
        .build()
)
```

## テストエンドポイントを取得する
<a name="device-advisor-workflow-get-test-endpoint"></a>

`GetEndpoint` API オペレーションを使用して、デバイスで使用されるテストエンドポイントを取得できます。テストに最適なエンドポイントを選択します。複数のテストスイートを同時に実行する場合は、`thing ARN`、`certificate ARN`、または `device role ARN` を指定してデバイスレベルのエンドポイントを使用します。単一のテストスイートを実行するには、GetEndpoint オペレーションに引数を指定せずに、アカウントレベルのエンドポイントを選択します。

SDK の例:

```
response = iotDeviceAdvisorClient.getEndpoint(GetEndpointRequest.builder()
.certificateArn("your-test-device-certificate-arn")
.thingArn("your-test-device-thing-arn")
.deviceRoleArn("your-device-role-arn") //if using SigV4 for MQTT over WebSocket                
.build())
```

## テストスイートの実行を開始する
<a name="device-advisor-workflow-start-suite-run"></a>

テストスイートの定義を作成し、Device Advisor のテストエンドポイントに接続するためにテストデバイスを設定したら、`StartSuiteRun` API を使用してテストスイートを実行します。

MQTT のお客様は、`certificateArn` または `thingArn` を使用してテストスイートを実行します。両方が設定されている場合、証明書がモノに属している場合は証明書が使用されます。

MQTT over WebSocket をご利用のお客様は、`deviceRoleArn` を使用してテストスイートを実行してください。指定されたロールがテストスイート定義で指定されたロールと異なる場合、指定されたロールは定義されたロールよりも優先されます。

`.parallelRun()` の場合、デバイスレベルのエンドポイントを使用して、1 つの AWS アカウントアカウントで複数のテストスイートを並列して実行する場合、`true` を使用します。

SDK の例:

```
response = iotDeviceAdvisorClient.startSuiteRun(StartSuiteRunRequest.builder()
.suiteDefinitionId("your-suite-definition-id")
.suiteRunConfiguration(SuiteRunConfiguration.builder()
    .primaryDevice(DeviceUnderTest.builder()
        .certificateArn("your-test-device-certificate-arn")
        .thingArn("your-test-device-thing-arn")
        .deviceRoleArn("your-device-role-arn") //if using SigV4 for MQTT over WebSocket               
        .build())
    .parallelRun(true | false)    
    .build())
.build())
```

レスポンスから `suiteRunId` を保存します。これを使用して、このテストスイートの実行の結果を取得します。

## テストスイートの実行を取得する
<a name="device-advisor-workflow-describe-suite"></a>

テストスイートの実行を開始したら、その進行状況を確認し、`GetSuiteRun` API を使用してその結果を確認できます。

SDK の例:

```
// Using the SDK, call the GetSuiteRun API.

response = iotDeviceAdvisorClient.GetSuiteRun(
GetSuiteRunRequest.builder()
    .suiteDefinitionId("your-suite-definition-id")
    .suiteRunId("your-suite-run-id")
.build())
```

## テストスイートの実行を停止する
<a name="device-advisor-workflow-stop-suite-run"></a>

まだ進行中のテストスイートの実行を停止する場合は、`StopSuiteRun` API オペレーションを呼び出します。`StopSuiteRun` オペレーションを呼び出すと、サービスはクリーンアッププロセスを開始します。サービスがクリーンアップ処理を実行している間、テストスイートの実行ステータスが `Stopping` に更新されます。このクリーンアッププロセスには、数分以上かかることがあります。プロセスが完了すると、テストスイートの実行ステータスが `Stopped` に更新されます。テストの実行が完全に停止したら、別のテストスイートの実行を開始できます。前のセクションの説明どおりに `GetSuiteRun` API オペレーションを使用して、スイートの実行ステータスを定期的にチェックすることができます。

SDK の例:

```
// Using the SDK, call the StopSuiteRun API.

response = iotDeviceAdvisorClient.StopSuiteRun(
StopSuiteRun.builder()
    .suiteDefinitionId("your-suite-definition-id")
    .suiteRunId("your-suite-run-id")
.build())
```

## 成功した認定テストスイートの実行の認定レポートを取得する
<a name="device-advisor-workflow-qualification-report"></a>

正常に完了した認定テストスイートを実行すると、`GetSuiteRunReport` API オペレーションを使用して認定レポートを取得できます。この認定レポートを使用して、 AWS IoT Core 認定プログラムでデバイスを認定します。テストスイートが認定テストスイートであるかどうかを判断するには、`intendedForQualification` パラメータが `true` に設定されているかどうかを確認します。`GetSuiteRunReport` API オペレーションを呼び出した後、返された URL からレポートを最大 90 秒間ダウンロードできます。`GetSuiteRunReport` API オペレーションを最後に呼び出してから 90 秒を超える時間が経過した場合は、そのオペレーションを再度呼び出して有効な URL を取得します。

SDK の例:

```
// Using the SDK, call the getSuiteRunReport API. 

response = iotDeviceAdvisorClient.getSuiteRunReport( 
    GetSuiteRunReportRequest.builder() 
        .suiteDefinitionId("your-suite-definition-id")
        .suiteRunId("your-suite-run-id")
        .build()
)
```