Device Advisor workflow
This tutorial explains how to create a custom test suite and run tests against the device you want to test in the console. After the tests are complete, you can view the test results and detailed logs.
Prerequisites
Before you begin this tutorial this tutorial, complete the steps outlined in Setting up.
Create a test suite definition
First, install an AWS SDK.
rootGroup
syntax
A root group is a JSON string that specifies which test cases to include in your test suite. It also specifies any necessary configurations for those test cases. Use the root group to structure and order your test suite based on your needs. The hierarchy of a test suite is:
test suite → test group(s) → test case(s)
A test suite must have at least one test group, and each test group must have at least one test case. Device Advisor runs tests in the order in which you define the test groups and test cases.
Each root group follows this basic structure:
{ "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": "" } }] }] }
In the root group, you define the test suite with a name
,
configuration
, and the tests
that the group
contains. The tests
group contains the definitions of individual
tests. You define each test with a name
,
configuration
, and a test
block that defines the test
cases for that test. Finally, each test case is defined with an id
and version
.
For information on how to use the "id"
and "version"
fields for each test case (test
block), see Device Advisor test cases. That
section also contains information on the available configuration
settings.
The following block is an example of a root group configuration. This configurations specifies the MQTT Connect Happy Case and MQTT Connect Exponential Backoff Retries test cases, along with descriptions of the configuration fields.
{ "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 } }] }] }
You must supply the root group configuration when you create your test suite
definition. Save the suiteDefinitionId
that is returned in the
response object. You can use this ID to retrieve your test suite definition
information and run your test suite.
Here is a Java SDK example:
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() )
Get a test suite definition
After you create your test suite definition, you receive the
suiteDefinitionId
in the response object of the
CreateSuiteDefinition
API operation.
When the operation returns the suiteDefinitionId
, you may see new
id
fields within each group and test case definition within the
root group. You can use these IDs to run a subset of your test suite
definition.
Java SDK example:
response = iotDeviceAdvisorClient.GetSuiteDefinition( GetSuiteDefinitionRequest.builder() .suiteDefinitionId("
your-suite-definition-id
") .build() )
Get a test endpoint
Use the GetEndpoint
API operation to get the test endpoint used by
your device. Select the endpoint that best fits your test. To simultaneously run
multiple test suites, use the Device-level endpoint by providing a thing
ARN
, certificate ARN
, or device role ARN
. To
run a single test suite, provide no arguments to the GetEndpoint operation to choose
the Account-level endpoint.
SDK example:
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())
Start a test suite run
After you create a test suite definition and configureyour test device to connect
to your Device Advisor test endpoint, run your test suite with the
StartSuiteRun
API.
For MQTT customers, use either certificateArn
or
thingArn
to run the test suite. If both are configured, the
certificate is used if it belongs to the thing.
For MQTT over WebSocket customer, use deviceRoleArn
to run the test
suite. If the specified role is different from the role specified in the test suite
definition, the specified role overrides the defined role.
For .parallelRun()
, use true
if you use a Device-level
endpoint to run multiple test suites in parallel using one AWS account.
SDK example:
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())
Save the suiteRunId
from the response. You will use this to retrieve
the results of this test suite run.
Get a test suite run
After you start a test suite run, you can check its progress and its results with
the GetSuiteRun
API.
SDK example:
// Using the SDK, call the GetSuiteRun API. response = iotDeviceAdvisorClient.GetSuiteRun( GetSuiteRunRequest.builder() .suiteDefinitionId("
your-suite-definition-id
") .suiteRunId("your-suite-run-id
") .build())
Stop a test suite run
To stop a test suite run that is still in progress, you can call the
StopSuiteRun
API operation. After you call the
StopSuiteRun
operation, the service starts the cleanup process.
While the service runs the cleanup process, the test suite run status updates to
Stopping
. The cleanup process can take several minutes. Once the
process is complete, the test suite run status updates to Stopped
.
After a test run has completely stopped, you n start another test suite run. You can
periodically check the suite run status using the GetSuiteRun
API
operation, as shown in the previous section.
SDK example:
// Using the SDK, call the StopSuiteRun API. response = iotDeviceAdvisorClient.StopSuiteRun( StopSuiteRun.builder() .suiteDefinitionId("
your-suite-definition-id
") .suiteRunId("your-suite-run-id
") .build())
Get a qualification report for a successful qualification test suite run
If you run a qualification test suite that completes successfully, you can
retrieve a qualification report with the GetSuiteRunReport
API
operation. You use this qualification report to qualify your device with the
AWS IoT Core qualification program. To determine whether your test suite is a
qualification test suite, check whether the intendedForQualification
parameter is set to true
. After you call the
GetSuiteRunReport
API operation, you can download the report from
the returned URL for up to 90 seconds. If more than 90 seconds elapse from the
previous time you called the GetSuiteRunReport
operation, call the
operation again to retrieve a new, valid URL.
SDK example:
// Using the SDK, call the getSuiteRunReport API. response = iotDeviceAdvisorClient.getSuiteRunReport( GetSuiteRunReportRequest.builder() .suiteDefinitionId("
your-suite-definition-id
") .suiteRunId("your-suite-run-id
") .build() )