

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

# チュートリアル: シンプルな IDT テストスイートの開発
<a name="create-custom-tests"></a>

テストスイートは、以下を組み合わせたものです。
+ テストロジックが含まれるテスト実行可能ファイル
+ テストスイートについて記述する設定ファイル

このチュートリアルでは、IDT for AWS IoT Greengrass を使用して、単一のテストケースを含む Python テストスイートを開発する方法を示します。このチュートリアルでは、次の手順を実行します。

1. [テストスイートディレクトリを作成する](#test-suite-dir)

1. [設定ファイルを作成する](#test-suite-json)

1. [テストケース実行可能ファイルを作成する](#test-suite-exe)

1. [テストスイートを実行する](#run-test-suite)

## 前提条件
<a name="prereqs-tutorial-custom"></a><a name="prereqs-list"></a>

このチュートリアルを完了するには、以下が必要です。
+ 

**ホストコンピュータの要件**
  + の最新バージョン AWS IoT Device Tester
  + [Python](https://www.python.org/downloads/) 3.7 以降

    コンピュータにインストールされている Python のバージョンを確認するには、次のコマンドを実行します。

    ```
    python3 --version
    ```

    Windows で、このコマンドを使用してエラーが返された場合は、代わりに `python --version` を使用してください。返されたバージョン番号が 3.7 以上の場合は、Powershell ターミナルで次のコマンドを実行し、`python3` を `python` コマンドのエイリアスとして設定します。

    ```
    Set-Alias -Name "python3" -Value "python"
    ```

    バージョン情報が返されない場合や、バージョン番号が 3.7 未満 の場合は、[Python のダウンロード](https://wiki.python.org/moin/BeginnersGuide/Download)の手順に従って Python 3.7 以上をインストールしてください。詳細については、[Python のドキュメント](https://docs.python.org)を参照してください。
  + [urllib3](https://urllib3.readthedocs.io/en/latest/)

    `urllib3` が正しくインストールされていることを確認するには、次のコマンドを実行します。

    ```
    python3 -c 'import urllib3'
    ```

    `urllib3` がインストールされていない場合は、次のコマンドを実行してインストールします。

    ```
    python3 -m pip install urllib3
    ```
+ 

**デバイスの要件**
  + Linux オペレーティングシステムが搭載され、ホストコンピュータと同じネットワークにネットワーク接続するデバイス。

    Raspberry Pi OS が搭載された [Raspberry Pi](https://www.raspberrypi.org/) を使用することをお勧めします。Raspberry Pi に [SSH](https://www.raspberrypi.org/documentation/remote-access/ssh/) をセットアップし、リモートから接続できることを確認します。

## テストスイートディレクトリを作成する
<a name="test-suite-dir"></a>

IDT は、テストケースを、各テストスイート内のテストグループに論理的に分離します。各テストケースはテストグループ内に存在する必要があります。このチュートリアルでは、`MyTestSuite_1.0.0` という名前のフォルダを作成し、このフォルダ内に次のディレクトリツリーを作成します。

```
MyTestSuite_1.0.0
└── suite
    └── myTestGroup
        └── myTestCase
```

## 設定ファイルを作成する
<a name="test-suite-json"></a>

テストスイートには、次の必須の[設定ファイル](idt-json-config.md)が含まれている必要があります。<a name="required-json"></a>必要な設定ファイル

`suite.json`  
テストスイートに関する情報が含まれています。「[suite.json を設定する](idt-json-config.md#suite-json)」を参照してください。

`group.json`  
テストグループに関する情報が含まれています。テストスイート内のテストグループごとに `group.json` ファイルを作成する必要があります。「[group.json を設定する](idt-json-config.md#group-json)」を参照してください。

`test.json`  
テストケースに関する情報が含まれています。テストスイート内のテストケースごとに `test.json` ファイルを作成する必要があります。「[test.json を設定する](idt-json-config.md#test-json)」を参照してください。

1. `MyTestSuite_1.0.0/suite` フォルダで、次の構造の `suite.json` ファイルを作成します。

   ```
   {
       "id": "MyTestSuite_1.0.0",
       "title": "My Test Suite",
       "details": "This is my test suite.",
       "userDataRequired": false
   }
   ```

1. `MyTestSuite_1.0.0/myTestGroup` フォルダで、次の構造の `group.json` ファイルを作成します。

   ```
   {
       "id": "MyTestGroup",
       "title": "My Test Group",
       "details": "This is my test group.",
       "optional": false
   }
   ```

1. `MyTestSuite_1.0.0/myTestGroup/myTestCase` フォルダで、次の構造の `test.json` ファイルを作成します。

   ```
   {
       "id": "MyTestCase",
       "title": "My Test Case",
       "details": "This is my test case.",
       "execution": {
           "timeout": 300000,
           "linux": {
               "cmd": "python3",
               "args": [
                   "myTestCase.py"
               ]
           },
           "mac": {
               "cmd": "python3",
               "args": [
                   "myTestCase.py"
               ]
           },
           "win": {
               "cmd": "python3",
               "args": [
                   "myTestCase.py"
               ]
           }
       }
   }
   ```

`MyTestSuite_1.0.0` フォルダのディレクトリツリーは次のようになります。

```
MyTestSuite_1.0.0
└── suite
    ├── suite.json
    └── myTestGroup
        ├── group.json
        └── myTestCase
            └── test.json
```

## IDT クライアント SDK を入手する
<a name="add-idt-sdk"></a>

IDT がテスト対象のデバイスとやり取りし、テスト結果をレポートできるようにするには、[IDT クライアント SDK](create-test-executables.md#idt-client-sdk) を使用します。このチュートリアルでは、Python バージョンの SDK を使用します。

`<device-tester-extract-location>/sdks/python/` フォルダから、`idt_client` フォルダを自分の `MyTestSuite_1.0.0/suite/myTestGroup/myTestCase` フォルダにコピーします。

SDK が正常にコピーされたことを確認するには、次のコマンドを実行します。

```
cd MyTestSuite_1.0.0/suite/myTestGroup/myTestCase
python3 -c 'import idt_client'
```

## テストケース実行可能ファイルを作成する
<a name="test-suite-exe"></a>

テストケース実行可能ファイルには、実行するテストロジックが含まれています。テストスイートには、複数のテストケース実行可能ファイルを含めることができます。このチュートリアルでは、テストケース実行可能ファイルを 1 つだけ作成します。

1. テストスイートファイルを作成します。

   `MyTestSuite_1.0.0/suite/myTestGroup/myTestCase` フォルダで、次の内容の `myTestCase.py` ファイルを作成します。

   ```
   from idt_client import *
   
   def main():
       # Use the client SDK to communicate with IDT
       client = Client()
   
   if __name__ == "__main__":
       main()
   ```

1. クライアント SDK 関数を使用して、自分の `myTestCase.py` ファイルに次のテストロジックを追加します。

   1. テスト対象のデバイスで SSH コマンドを実行します。

      ```
      from idt_client import *
      
      def main():
          # Use the client SDK to communicate with IDT
          client = Client()
          
          # Create an execute on device request
          exec_req = ExecuteOnDeviceRequest(ExecuteOnDeviceCommand("echo 'hello world'"))
          
          # Run the command
          exec_resp = client.execute_on_device(exec_req)
          
          # Print the standard output
          print(exec_resp.stdout)
      
      if __name__ == "__main__":
          main()
      ```

   1. テスト結果を IDT に送信します。

      ```
      from idt_client import *
      
      def main():
          # Use the client SDK to communicate with IDT
          client = Client()
          
          # Create an execute on device request
          exec_req = ExecuteOnDeviceRequest(ExecuteOnDeviceCommand("echo 'hello world'"))
          
          # Run the command
          exec_resp = client.execute_on_device(exec_req)
          
          # Print the standard output
          print(exec_resp.stdout)
      
          # Create a send result request
          sr_req = SendResultRequest(TestResult(passed=True))
           
          # Send the result
          client.send_result(sr_req)
             
      if __name__ == "__main__":
          main()
      ```

## IDT 用のデバイス情報を設定する
<a name="configure-idt-sample"></a>

IDT がテストを実行するためのデバイス情報を設定します。次の情報を使用して、`<device-tester-extract-location>/configs` フォルダに含まれている `device.json` テンプレートを更新する必要があります。

```
[
  {
    "id": "pool",
    "sku": "N/A",
    "devices": [
      {
        "id": "<device-id>",
        "connectivity": {
          "protocol": "ssh",
          "ip": "<ip-address>",
          "port": "<port>",
          "auth": {
            "method": "pki | password",
            "credentials": {
              "user": "<user-name>",
              "privKeyPath": "/path/to/private/key",
              "password": "<password>"
            }
          }
        }
      }
    ]
  }
]
```

`devices` オブジェクトで、次の情報を指定します。

`id`  
自分のデバイスのユーザー定義の一意の識別子。

`connectivity.ip`  
自分のデバイスの IP アドレス。

`connectivity.port`  
オプション。デバイスへの SSH 接続に使用するポート番号。

`connectivity.auth`  
接続の認証情報。  
このプロパティは、`connectivity.protocol` が `ssh` に設定されている場合にのみ適用されます。    
`connectivity.auth.method`  
指定された接続プロトコルを介してデバイスにアクセスするために使用される認証方法。  
サポートされている値は以下のとおりです。  
+ `pki`
+ `password`  
`connectivity.auth.credentials`  
認証に使用される認証情報。    
`connectivity.auth.credentials.user`  
デバイスへのサインインに使用するユーザー名。  
`connectivity.auth.credentials.privKeyPath`  
デバイスへのサインインに使用するプライベートキーへの完全パス。  
この値は、`connectivity.auth.method` が `pki` に設定されている場合にのみ適用されます。  
`devices.connectivity.auth.credentials.password`  
自分のデバイスにサインインするためのパスワード。  
この値は、`connectivity.auth.method` が `password` に設定されている場合にのみ適用されます。

**注記**  
`method` が `pki` に設定されている場合のみ `privKeyPath` を指定します。  
`method` が `password` に設定されている場合のみ `password` を指定します。

## テストスイートを実行する
<a name="run-test-suite"></a>

テストスイートを作成したら、テストスイートが期待どおりに機能することを確認します。そのために、次の手順に従って、既存のデバイスプールを使用してテストスイートを実行します。

1. 自分の `MyTestSuite_1.0.0` フォルダを `<device-tester-extract-location>/tests` にコピーします。

1. 以下の コマンドを実行します。

   ```
   cd <device-tester-extract-location>/bin
   ./devicetester_[linux | mac | win_x86-64] run-suite --suite-id MyTestSuite
   ```

IDT はテストスイートを実行し、結果をコンソールにストリーミングします。テストの実行が完了すると、次の情報が表示されます。

```
time="2020-10-19T09:24:47-07:00" level=info msg=Using pool: pool
time="2020-10-19T09:24:47-07:00" level=info msg=Using test suite "MyTestSuite_1.0.0" for execution
time="2020-10-19T09:24:47-07:00" level=info msg=b'hello world\n' suiteId=MyTestSuite groupId=myTestGroup testCaseId=myTestCase deviceId=my-device executionId=9a52f362-1227-11eb-86c9-8c8590419f30
time="2020-10-19T09:24:47-07:00" level=info msg=All tests finished. executionId=9a52f362-1227-11eb-86c9-8c8590419f30
time="2020-10-19T09:24:48-07:00" level=info msg=

========== Test Summary ==========
Execution Time:         1s
Tests Completed:        1
Tests Passed:           1
Tests Failed:           0
Tests Skipped:          0
----------------------------------
Test Groups:
    myTestGroup:        PASSED
----------------------------------
Path to IoT Device Tester Report: /path/to/devicetester/results/9a52f362-1227-11eb-86c9-8c8590419f30/awsiotdevicetester_report.xml
Path to Test Execution Logs: /path/to/devicetester/results/9a52f362-1227-11eb-86c9-8c8590419f30/logs
Path to Aggregated JUnit Report: /path/to/devicetester/results/9a52f362-1227-11eb-86c9-8c8590419f30/MyTestSuite_Report.xml
```

## トラブルシューティング
<a name="tutorial-troubleshooting"></a>

次の情報は、チュートリアルの実行に関連する問題の解決に役立ちます。

**テストケースが正常に実行されない**

テストが正常に実行されない場合、IDT はエラーログをコンソールにストリーミングします。このログはテスト実行のトラブルシューティングに役立ちます。エラーログを確認する前に、次の点を確認してください。
+ IDT クライアント SDK が、[このステップ](#add-idt-sdk)で説明された通りの正しいフォルダにある。
+ このチュートリアルのすべての[前提条件](#prereqs-tutorial-custom)を満たしている。

**テスト対象のデバイスに接続できない**

以下について確認します。
+ `device.json` ファイルに、正しい IP アドレス、ポート、および認証情報が含まれている。
+ ホストコンピュータから SSH 経由でデバイスに接続できる。