Device Advisor 测试用例 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Device Advisor 测试用例

Device Advisor 提供五个类别的预构建测试。

  • TLS

  • 权限与策略

  • MQTT

  • Shadow

  • 任务执行

注意

您的设备需要通过以下资格测试,才能将您的设备列入Amazon合作伙伴设备目录:

  • TLS Incorrect Subject Name Server Cert(TLS 不正确的主题名称服务器证书)(“不正确的主题通用名称 (CN)/主题备用名称 (SAN)”)

  • TLS Unsecure Server Cert(TLS 不安全的服务器证书)(“未由认可的 CA 签名”)

  • TLS Connect(“TLS Connect”)

  • MQTT Connect(“设备将 CONNECT 发送到 Amazon IoT Core (快乐用例)”)

  • MQTT 订阅(“可以订阅(快乐用例)”)

  • MQTT 发布(“QoS0(快乐用例)”)

TLS

您可以使用这些测试来确定设备和 Amazon IoT 之间的传输层安全性协议 (TLS) 是否安全。

密码套件

“TLS Connect”

验证被测设备是否可以完成与 Amazon IoT 的 TLS 握手。此测试不会验证客户端设备的 MQTT 执行。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议超时值设为 2 分钟。

"tests":[ { "name":"my_tls_connect_test" "configuration": { // optional: "EXECUTION_TIMEOUT":"300", //in seconds }, "test":{ "id":"TLS_Connect", "version":"0.0.0" } } ]

测试用例输出:

通过:被测设备完成了与 Amazon IoT 的 TLS 握手。

通过并带有警告:被测设备完成了与 Amazon IoT 的 TLS 握手,但是存在来自设备或 Amazon IoT 的 TLS 警告消息。

失败:由于握手错误,被测设备无法完成与 Amazon IoT 的 TLS 握手。

“适用于 Amazon IoT 推荐的密码套件的 TLS 设备支持”

验证来自被测设备的 TLS Client Hello 消息中的密码套件是否包含 Amazon IoT推荐的密码套件。它提供了有关设备支持的密码套件的更多洞察。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_tls_support_aws_iot_cipher_suites_test" "configuration": { // optional: "EXECUTION_TIMEOUT":"300", // in seconds }, "test":{ "id":"TLS_Support_AWS_IoT_Cipher_Suites", "version":"0.0.0" } } ]

测试用例输出:

通过:被测设备的密码套件至少包含一个 Amazon IoT 推荐的密码套件,并且不包含任何不受支持的密码套件。

通过并带有警告:设备密码套件至少包含一个 Amazon IoT 密码套件,但 1) 不包含任何推荐的密码套件,或 2) 包含 Amazon IoT 不支持的密码套件。我们建议验证不受支持的密码套件是否安全。

失败:被测设备的密码套件的设备不包含任何 Amazon IoT 支持的密码套件。

不良服务器证书

“未被认可的 CA 签名”

验证如果提供不具有 ATS CA 有效签名的服务器证书,被测设备是否会关闭连接。设备只能连接到提供有效证书的端点。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_tls_unsecure_server_cert_test" "configuration": { // optional: "EXECUTION_TIMEOUT":"300", //in seconds }, "test":{ "id":"TLS_Unsecure_Server_Cert", "version":"0.0.0" } } ]

测试用例输出:

通过:被测设备关闭了连接。

失败:被测设备完成了与 Amazon IoT 的 TLS 握手。

“不正确的主题通用名称 (CN)/主题备用名称 (SAN)”

验证如果提供与请求的域名不同的域名服务器证书,被测设备是否会关闭连接。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_tls_incorrect_subject_name_cert_test" "configuration": { // optional: "EXECUTION_TIMEOUT":"300", // in seconds }, "test":{ "id":"TLS_Incorrect_Subject_Name_Server_Cert", "version":"0.0.0" } } ]

测试用例输出:

通过:被测设备关闭了连接。

失败:被测设备完成了与 Amazon IoT 的 TLS 握手。

权限与策略

您可以使用这些测试来确定附加到设备证书的策略是否符合最佳实践。

“设备证书附加策略不包含通配符”

验证与设备关联的权限策略是否遵循最佳实践,并且未向设备授予除所需权限以外的其他权限。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 1 分钟。建议将超时设置为至少 30 秒。

"tests":[ { "name":"my_security_device_policies" "configuration": { // optional: "EXECUTION_TIMEOUT":"60" // in seconds } "test": { "id": "Security_Device_Policies", "version": "0.0.0" } } ]

MQTT

CONNECT、DISCONNECT 和 RECONNECT

“设备将 CONNECT 发送到 Amazon IoT Core (快乐用例)”

验证被测设备是否发送 CONNECT 请求。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_mqtt_connect_test" "configuration": { // optional: "EXECUTION_TIMEOUT":"300", // in seconds }, "test":{ "id":"MQTT_Connect", "version":"0.0.0" } } ]
“设备以抖动回退功能重新连接 - 没有 CONNACK 响应”

验证被测设备与代理重新连接至少五次时是否使用了正确的抖动回退。代理记录被测设备的 CONNECT 请求时间戳,执行数据包验证,暂停而不向被测设备发送 CONNACK,并等待被测设备重新发送请求。允许第六次连接尝试通过,并允许 CONNACK 流回到被测设备。

上述过程将再次执行。总体而言,此测试用例要求设备总共至少连接 12 次。收集的时间戳用于验证被测设备是否使用了抖动退避。如果被测设备具有严格的指数回退延迟,则此测试用例将通过并带有警告。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 默认值为 10 分钟。我们建议将超时值设置为 4 分钟。

"tests":[ { "name":"my_mqtt_jitter_backoff_retries_test" "configuration": { // optional: "EXECUTION_TIMEOUT":"300", // in seconds }, "test":{ "id":"MQTT_Connect_Jitter_Backoff_Retries", "version":"0.0.0" } } ]
“设备可以将 PUBACK 返回到 QoS1 的任意主题”

如果客户端在使用 QoS1 订阅到主题后收到来自代理的发布消息,则此测试用例将检查设备(客户端)是否能够返回 PUBACK 消息。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_mqtt_client_puback_qos1" "configuration": { // optional: "TRIGGER_TOPIC": "myTopic", "EXECUTION_TIMEOUT":"300", // in seconds "PAYLOAD_FOR_PUBLISH_VALIDATION":"custom payload" } "test": { "id": "MQTT_Client_Puback_Qos1", "version": "0.0.0" } } ]
“设备使用指数回退重新连接 - 没有 CONNACK 响应”

验证被测设备与代理重新连接至少五次时是否使用了正确的指数回退。代理记录被测设备的 CONNECT 请求时间戳,执行数据包验证,暂停而不向客户端设备发送 CONNACK,并等待被测设备重新发送请求。收集的时间戳用于验证被测设备是否使用了指数回退。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 默认值为 10 分钟。我们建议将超时值设置为 4 分钟。

"tests":[ { "name":"my_mqtt_exponential_backoff_retries_test" "configuration": { // optional: "EXECUTION_TIMEOUT":"600", // in seconds }, "test":{ "id":"MQTT_Connect_Exponential_Backoff_Retries", "version":"0.0.0" } } ]

Publish

“QoS0(快乐用例)”

验证被测设备是否使用 QoS0 发布消息。您还可以通过在测试设置中指定此主题值来验证消息的主题。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_mqtt_publish_test":{ // optional: "EXECUTION_TIMEOUT":"300", // in seconds "TOPIC_FOR_PUBLISH_VALIDATION": "my_TOPIC_FOR_PUBLISH_VALIDATION", "PAYLOAD_FOR_PUBLISH_VALIDATION": "my_PAYLOAD_FOR_PUBLISH_VALIDATION", }, "test":{ "id":"MQTT_Publish", "version":"0.0.0" } } ]
“QoS1 发布重试 - 没有 PUBACK”

如果代理没有发送 PUBACK,则验证被测设备是否重新发布了随 QoS1 发送的消息。您还可以通过在测试设置中指定此主题来验证消息的主题。在重新发布消息之前,客户端设备不得断开连接。此测试还验证重新发布的消息与原始消息是否具有相同的数据包标识符。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。建议至少 4 分钟。

"tests":[ { "name":"my_mqtt_publish_retry_test":{ // optional: "EXECUTION_TIMEOUT":"300", // in seconds "TOPIC_FOR_PUBLISH_VALIDATION": "my_TOPIC_FOR_PUBLISH_VALIDATION", "PAYLOAD_FOR_PUBLISH_VALIDATION": "my_PAYLOAD_FOR_PUBLISH_VALIDATION", }, "test":{ "id":"MQTT_Publish_Retry_No_Puback", "version":"0.0.0" } } ]

Subscribe

“可以订阅(快乐用例)”

验证被测设备是否订阅了 MQTT 主题。您还可以通过在测试设置中指定此主题来验证被测设备订阅的主题。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_mqtt_subscribe_test":{ // optional: "EXECUTION_TIMEOUT":"300", // in seconds "TOPIC_LIST_FOR_SUBSCRIPTION_VALIDATION_ID":["my_TOPIC_FOR_PUBLISH_VALIDATION_a","my_TOPIC_FOR_PUBLISH_VALIDATION_b"] }, "test":{ "id":"MQTT_Subscribe", "version":"0.0.0" } } ]
“订阅重试 - 无 SUBACK”

验证被测设备是否重试 MQTT 主题的失败订阅。然后,服务器会等待,不发送 SUBACK。如果客户端设备未重试订阅,则测试失败。您还可以通过在测试设置中指定此主题来验证被测设备订阅的主题。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 4 分钟。

"tests":[ { "name":"my_mqtt_subscribe_retry_test":{ "EXECUTION_TIMEOUT":"300", // in seconds // optional: "TOPIC_LIST_FOR_SUBSCRIPTION_VALIDATION_ID":["myTOPIC_FOR_PUBLISH_VALIDATION_a","my_TOPIC_FOR_PUBLISH_VALIDATION_b"] }, "test":{ "id":"MQTT_Subscribe_Retry_No_Suback", "version":"0.0.0" } } ]

Shadow

使用这些测试验证您的被测设备是否正确使用了 Amazon IoT Device Shadow 服务。参阅 Amazon IoT Device Shadow 服务 了解更多信息。如果在测试套件中配置了这些测试用例,则在启动套件运行时需要提供一个事物。

Publish

“设备连接后发布状态(快乐用例)”

验证设备是否可以在连接到 Amazon IoT Core 之后发布其状态。

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_shadow_publish_reported_state", "configuration": { // optional: "EXECUTION_TIMEOUT":"300", // in seconds "SHADOW_NAME": "SHADOW_NAME", "REPORTED_STATE": { "STATE_ATTRIBUTE": "STATE_VALUE" } }, "test":{ "id":"Shadow_Publish_Reported_State", "version":"0.0.0" } } ]

REPORTED_STATE 可以在设备连接后对其确切影子状态进行额外验证。预设情况下,此测试用例会验证您的设备发布状态。

如果未提供 SHADOW_NAME,则测试用例将默认查找发布到 Unnamed(经典)影子类型的主题前缀的消息。如果您的设备使用命名的影子类型,请提供影子名称。请参阅在设备中使用影子,了解更多信息。

Update

“设备更新报告状态为所需状态(快乐用例)”

验证设备是否读取所有收到的更新消息,并同步设备的状态以与所需的状态属性匹配。您的设备应在同步后发布其最新报告状态。如果您的设备在运行测试之前已存在影子,请确保为测试用例配置的所需状态与现有报告状态不匹配。您可以通过查看 Shadow 文档中的 ClientToken 字段来识别由 Device Advisor 发送的影子更新消息,因为它将为 DeviceAdvisorShadowTestCaseSetup

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_shadow_update_reported_state", "configuration": { "DESIRED_STATE": { "STATE_ATTRIBUTE": "STATE_VALUE" }, // optional: "EXECUTION_TIMEOUT":"300", // in seconds "SHADOW_NAME": "SHADOW_NAME" }, "test":{ "id":"Shadow_Update_Reported_State", "version":"0.0.0" } } ]

DESIRED_STATE 应具有至少一个属性和关联的值。

如果未提供 SHADOW_NAME,则测试用例将默认查找发布到 Unnamed(经典)影子类型的主题前缀的消息。如果您的设备使用命名的影子类型,请提供影子名称。请参阅在设备中使用影子,了解更多信息。

任务执行

“设备可以完成任务执行”

此测试用例可帮助您验证设备是否能够使用 Amazon IoT Jobs 接收更新,并发布成功更新的状态。有关 Amazon IoT Jobs 的更多信息,请参阅任务

API 测试用例定义:

注意

EXECUTION_TIMEOUT 的默认值为 5 分钟。我们建议将超时值设置为 2 分钟。

"tests":[ { "name":"my_job_execution", "configuration": { // Document is a JSON formatted string "JOB_DOCUMENT": "{ "operation":"reboot", "files" : { "fileName" : "install.py", "url" : "${aws:iot:s3-presigned-url:https://s3.amazonaws.com/bucket/key}" }", // Document_SOURCE is an S3 link to the job document // Document and document are optional but can't be both null. "JOB_DOCUMENT_SOURCE": "https://s3.amazonaws.com/bucket/key", // optional: "EXECUTION_TIMEOUT": "300" // in seconds }, "test": { "id": "Job_Execution", "version": "0.0.0" } } ]

有关创建和使用任务文档的更多信息,请参阅任务文档