

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 자체 IDT 테스트 제품군 개발 및 실행
<a name="idt-custom-tests"></a>

<a name="idt-byotc-idt"></a>IDT v4.0.0부터 FreeRTOS용 IDT는 표준화된 구성 설정 및 결과 형식을 디바이스 및 디바이스 소프트웨어에 대한 사용자 지정 테스트 제품군을 개발할 수 있는 테스트 제품군 환경과 결합합니다. 사용자 지정 테스트를 자체 내부 검증을 위해 추가하거나 디바이스 검증을 위해 고객에게 제공할 수 있습니다.

IDT를 사용하여 다음과 같이 사용자 지정 테스트 도구 모음을 개발하고 실행하십시오.

****사용자 지정 테스트 제품군을 개발하려면****  
+ 테스트하려는 디바이스에 대해 사용자 지정 테스트 로직이 포함된 테스트 제품군을 생성합니다.
+ IDT에 테스트 실행기를 위한 사용자 지정 테스트 제품군을 제공합니다. 테스트 도구 모음의 특정 설정 구성에 대한 정보를 포함해야 합니다.

****사용자 지정 테스트 도구 모음을 실행하려면****  
+ 테스트하려는 디바이스를 설정합니다.
+ 사용하려는 테스트 도구 모음의 필요에 따라 설정 구성을 구현하십시오.
+ IDT를 사용하여 사용자 지정 테스트 도구 모음을 실행하세요.
+ IDT에서 실행한 테스트의 테스트 결과 및 실행 로그를 확인합니다.

## 최신 버전의 FreeRTOS용 AWS IoT 디바이스 테스터 다운로드
<a name="install-dev-tst-afr"></a>

[최신 버전](dev-test-versions-afr.md#idt-latest-version-afr)의 IDT를 다운로드하여 읽기 및 쓰기 권한이 있는 파일 시스템의 위치에 소프트웨어의 압축을 풉니다.

**참고**  
<a name="unzip-package-to-local-drive"></a>여러 사용자가 NFS 디렉터리 또는 Windows 네트워크 공유 폴더와 같은 공유 위치에서 IDT를 실행하는 것은 지원되지 않습니다. 로컬 드라이브에 IDT 패키지의 압축을 풀고 로컬 워크스테이션에서 IDT 바이너리를 실행하는 것이 좋습니다.  
Windows의 경우 260자의 경로 길이 제한이 있습니다. Windows를 사용하는 경우 경로를 260자 제한 아래로 유지하도록 IDT 압축을 `C:\ ` 또는 `D:\` 같은 루트 디렉터리에 풉니다.

## 테스트 제품군 워크플로
<a name="custom-test-workflow"></a>

테스트 제품군은 세 가지 유형의 파일로 구성됩니다.
+ 테스트 제품군 실행 방법에 대한 정보를 IDT에 제공하는 구성 파일.
+ IDT가 테스트 사례를 실행하는 데 사용하는 테스트 실행 파일.
+ 테스트를 실행하는 데 필요한 추가 파일.

다음 기본 단계를 완료하여 사용자 지정 IDT 테스트를 생성합니다.

1. 테스트 제품군의 [구성 파일을 생성](idt-json-config.md)합니다.

1. 테스트 제품군의 테스트 로직이 포함된 [테스트 사례 실행 파일을 생성](test-executables.md)합니다.

1. 테스트 도구 모음을 실행하는 데 [테스트 러너에게 필요한 구성 정보](set-config-custom.md)를 확인하고 문서화하세요.

1. IDT가 예상대로 테스트 도구 모음을 실행하고 [테스트 결과](run-tests-custom.md)를 생성할 수 있는지 확인하십시오.

샘플 사용자 지정 도구 모음을 빠르게 구축하고 실행하려면 [자습서: 샘플 IDT 테스트 제품군 빌드 및 실행](build-sample-suite.md)의 지침을 따르십시오.

Python으로 사용자 지정 테스트 제품군 생성을 시작하려면 [자습서: 간단한 IDT 테스트 제품군 개발](create-custom-tests.md) 섹션을 참조하세요.

# 자습서: 샘플 IDT 테스트 제품군 빌드 및 실행
<a name="build-sample-suite"></a>

 AWS IoT Device Tester 다운로드에는 샘플 테스트 제품군의 소스 코드가 포함됩니다. 이 자습서를 완료하여 샘플 테스트 제품군을 빌드하고 실행하여 FreeRTOS AWS IoT Device Tester 에를 사용하여 사용자 지정 테스트 제품군을 실행하는 방법을 이해할 수 있습니다. 이 자습서에서는 SSH를 사용하지만 FreeRTOS 디바이스와 AWS IoT Device Tester 함께를 사용하는 방법을 배우는 것이 유용합니다.

 이 자습서에서는 다음 단계를 완료합니다.

1. [샘플 테스트 도구 모음 구축](build-sample.md)

1. [IDT를 사용하여 샘플 테스트 도구 모음을 실행하세요.](run-sample.md)

**Topics**
+ [

# 샘플 테스트 제품군의 사전 조건 설정
](prereqs-tutorial-sample.md)
+ [

# IDT용 디바이스 정보 구성
](configure-idt-sample.md)
+ [

# 샘플 테스트 도구 모음 구축
](build-sample.md)
+ [

# IDT를 사용하여 샘플 테스트 도구 모음을 실행하세요.
](run-sample.md)
+ [

# 오류 해결
](tutorial-troubleshooting-custom.md)

# 샘플 테스트 제품군의 사전 조건 설정
<a name="prereqs-tutorial-sample"></a>

이 자습서를 완료하려면 다음이 필요합니다.
+ 

  **호스트 컴퓨터 요구 사항**
  + 의 최신 버전 AWS IoT Device Tester
  + [Python](https://docs.python.org/3/) 3.7 이상

    컴퓨터에 설치된 Python 버전 번호를 확인하려면 인스턴스에서 다음 명령을 실행합니다.

    ```
    python3 --version
    ```

    Windows에서 이 명령 사용시 오류가 반환되면 `python --version`을(를) 대신 사용하십시오. 반환된 버전 번호가 3.7 이상인 경우 Powershell 터미널에서 다음 명령을 실행하여 `python` 명령의 별칭으로 `python3`을(를) 설정합니다. 

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

    버전 정보가 반환되지 않았거나 버전 번호가 3.7 미만이면 [Python 다운로드](https://wiki.python.org/moin/BeginnersGuide/Download)의 지침에 따라 Python 3.7 이상을 설치합니다. 자세한 내용은 [Python 설명서](https://docs.python.org/3/)를 참조하세요.
  + [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에 원격으로 연결하려면 Pi에서 [SSH](https://www.raspberrypi.com/documentation/computers/remote-access.html)를 설정해야 합니다.

# 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="build-sample"></a>

`<device-tester-extract-location>/samples/python` 폴더에는 제공된 구축 스크립트를 사용하여 테스트 도구 모음에 결합할 수 있는 샘플 구성 파일, 소스 코드 및 IDT Client SDK가 포함되어 있습니다. 다음 디렉터리 트리는 이러한 샘플 파일의 위치를 보여줍니다.

```
<device-tester-extract-location>
├── ...
├── tests
├── samples
│   ├── ...
│   └── python
│       ├── configuration
│       ├── src
│       └── build-scripts
│           ├── build.sh
│           └── build.ps1
└── sdks
    ├── ...
    └── python
        └── idt_client
```

테스트 도구 모음을 구축하려면 호스트 컴퓨터에서 다음 명령을 실행합니다.

------
#### [ Windows ]

```
cd <device-tester-extract-location>/samples/python/build-scripts
./build.ps1
```

------
#### [ Linux, macOS, or UNIX ]

```
cd <device-tester-extract-location>/samples/python/build-scripts
./build.sh
```

------

그러면 `IDTSampleSuitePython_1.0.0` 폴더 내 `<device-tester-extract-location>/tests` 폴더에 샘플 테스트 도구 모음이 만들어집니다. `IDTSampleSuitePython_1.0.0` 폴더의 파일을 검토하여 샘플 테스트 제품군이 어떻게 구성되어 있는지 이해하고 테스트 사례 실행 파일 및 테스트 구성 파일의 다양한 예제를 확인하세요.

**참고**  
샘플 테스트 제품군에는 python 소스 코드가 포함되어 있습니다. 테스트 제품군 코드에 민감한 정보를 포함하지 마십시오.

다음 단계: IDT를 사용하여 생성한 [샘플 테스트 제품군을 실행](run-sample.md)합니다.

# IDT를 사용하여 샘플 테스트 도구 모음을 실행하세요.
<a name="run-sample"></a>

샘플 테스트 도구 모음을 실행하려면 호스트 컴퓨터에서 다음 명령을 실행하세요.

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

IDT는 샘플 테스트 도구 모음을 실행하고 결과를 콘솔로 스트리밍합니다. 테스트 실행이 완료되면 다음 정보가 표시됩니다.

```
========== Test Summary ==========
Execution Time:         5s
Tests Completed:        4
Tests Passed:           4
Tests Failed:           0
Tests Skipped:          0
----------------------------------
Test Groups:
    sample_group:       PASSED
----------------------------------
Path to AWS IoT Device Tester Report: /path/to/devicetester/results/87e673c6-1226-11eb-9269-8c8590419f30/awsiotdevicetester_report.xml
Path to Test Execution Logs: /path/to/devicetester/results/87e673c6-1226-11eb-9269-8c8590419f30/logs
Path to Aggregated JUnit Report: /path/to/devicetester/results/87e673c6-1226-11eb-9269-8c8590419f30/IDTSampleSuitePython_Report.xml
```

# 오류 해결
<a name="tutorial-troubleshooting-custom"></a>

다음 정보를 사용하면 튜토리얼 완료와 관련된 문제를 해결하는 데 도움이 됩니다.

**테스트 사례가 성공적으로 실행되지 않습니다.**
+ 테스트가 성공적으로 실행되지 않을 경우 IDT는 오류 로그를 콘솔로 스트리밍하여 테스트 실행 문제를 해결하는 데 도움을 줍니다. 이 튜토리얼의 모든 [사전 요구](prereqs-tutorial-sample.md) 사항을 충족하는지 확인하세요.

**테스트 중인 디바이스에 연결할 수 없습니다.**

다음을 확인합니다.
+ `device.json` 파일에는 올바른 IP 주소, 포트 및 인증 정보가 들어 있습니다.
+ 호스트 컴퓨터에서 SSH를 통해 디바이스에 연결할 수 있습니다.

# 자습서: 간단한 IDT 테스트 제품군 개발
<a name="create-custom-tests"></a>

테스트 제품군은 다음을 결합합니다.
+ 테스트 로직이 포함된 테스트 실행 파일
+ 테스트 제품군을 설명하는 구성 파일

이 자습서에서는 FreeRTOS용 IDT를 사용하여 단일 테스트 사례가 포함된 Python 테스트 제품군을 개발하는 방법을 보여줍니다. 이 자습서에서는 SSH를 사용하지만 FreeRTOS 디바이스와 AWS IoT Device Tester 함께를 사용하는 방법을 배우는 것이 유용합니다.

이 자습서에서는 다음 단계를 완료합니다.

1. [테스트 도구 모음 디렉터리 생성](test-suite-dir.md)

1. [구성 파일 생성](test-suite-json.md)

1. [테스트 사례 실행 파일 생성](test-suite-exe.md)

1. [테스트 도구 모음 실행](run-test-suite.md)

아래 단계에 따라 간단한 IDT 테스트 제품군 개발을 위한 자습서를 완료합니다.

**Topics**
+ [

# 간단한 IDT 테스트 제품군의 사전 조건 설정
](prereqs-tutorial-custom.md)
+ [

# 테스트 도구 모음 디렉터리 생성
](test-suite-dir.md)
+ [

# 구성 파일 생성
](test-suite-json.md)
+ [

# IDT 클라이언트 SDK 다운로드
](add-idt-sdk.md)
+ [

# 테스트 사례 실행 파일 생성
](test-suite-exe.md)
+ [

# IDT용 디바이스 정보 구성
](configure-idt-sample2.md)
+ [

# 테스트 도구 모음 실행
](run-test-suite.md)
+ [

# 오류 해결
](tutorial-troubleshooting.md)
+ [

# IDT 테스트 제품군 구성 파일 생성
](idt-json-config.md)
+ [

# IDT 테스트 오케스트레이터 구성
](idt-test-orchestrator.md)
+ [

# IDT 상태 시스템 구성
](idt-state-machine.md)
+ [

# IDT 테스트 사례 실행 파일 생성
](test-executables.md)
+ [

# IDT 컨텍스트 사용
](idt-context.md)
+ [

# 테스트 실행기 설정 구성
](set-config-custom.md)
+ [

# 사용자 지정 테스트 제품군 디버그 및 실행
](run-tests-custom.md)
+ [

# IDT 테스트 결과 및 로그 검토
](idt-review-results-logs.md)
+ [

# IDT 사용량 지표 제출
](idt-usage-metrics.md)

# 간단한 IDT 테스트 제품군의 사전 조건 설정
<a name="prereqs-tutorial-custom"></a>

이 자습서를 완료하려면 다음이 필요합니다.
+ 

  **호스트 컴퓨터 요구 사항**
  + 의 최신 버전 AWS IoT Device Tester
  + [Python](https://www.python.org/downloads/) 3.7 이상

    컴퓨터에 설치된 Python 버전 번호를 확인하려면 인스턴스에서 다음 명령을 실행합니다.

    ```
    python3 --version
    ```

    Windows에서 이 명령 사용시 오류가 반환되면 `python --version`을(를) 대신 사용하십시오. 반환된 버전 번호가 3.7 이상인 경우 Powershell 터미널에서 다음 명령을 실행하여 `python` 명령의 별칭으로 `python3`을(를) 설정합니다. 

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

    버전 정보가 반환되지 않았거나 버전 번호가 3.7 미만이면 [Python 다운로드](https://wiki.python.org/moin/BeginnersGuide/Download)의 지침에 따라 Python 3.7 이상을 설치합니다. 자세한 내용은 [Python 설명서](https://docs.python.org/3/)를 참조하세요.
  + [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에 원격으로 연결하려면 Pi에서 [SSH](https://www.raspberrypi.com/documentation/computers/remote-access.html)를 설정해야 합니다.

# 테스트 도구 모음 디렉터리 생성
<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)이 포함되어야 합니다.

**필수 파일**

**`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 클라이언트 SDK](test-executables.md#idt-client-sdk)를 사용하여 IDT가 테스트 대상 디바이스와 상호 작용하고 테스트 결과를 보고할 수 있도록 합니다. 이 튜토리얼에서는 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. 테스트 도구 모음 파일을 만드세요.

   `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-sample2"></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 AWS 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는 [IDT 클라이언트 SDK 다운로드](add-idt-sdk.md)에서 설명한 대로 올바른 폴더에 있습니다.
+ 이 튜토리얼의 모든 사전 요구 사항을 충족합니다. 자세한 내용은 [간단한 IDT 테스트 제품군의 사전 조건 설정](prereqs-tutorial-custom.md) 단원을 참조하십시오.

**테스트 중인 디바이스에 연결할 수 없습니다.**

다음을 확인합니다.
+ `device.json` 파일에는 올바른 IP 주소, 포트 및 인증 정보가 들어 있습니다.
+ 호스트 컴퓨터에서 SSH를 통해 디바이스에 연결할 수 있습니다.

# IDT 테스트 제품군 구성 파일 생성
<a name="idt-json-config"></a>

이 섹션에서는 사용자 지정 테스트 제품군을 작성할 때 포함하는 구성 파일을 생성하는 형식을 설명합니다.

**필수 구성 파일**

**`suite.json`**  
테스트 제품군 정보가 포함되어 있습니다. [suite.json 구성](#suite-json)을(를) 참조하세요.

**`group.json`**  
테스트 그룹에 대한 정보를 포함합니다. 테스트 도구 모음의 각 테스트 그룹에 대한 `group.json` 파일을 만들어야 합니다. [group.json을 구성하십시오.](#group-json)을(를) 참조하세요.

**`test.json`**  
테스트 케이스에 대한 정보가 들어 있습니다. 테스트 도구 모음의 각 테스트 케이스에 대한 `test.json` 파일을 만들어야 합니다. [test.json을 구성하십시오.](#test-json)을(를) 참조하세요.

**선택적 구성 파일**

**`test_orchestrator.yaml` 또는 `state_machine.json`**  
IDT가 테스트 제품군을 실행할 때 테스트가 실행되는 방법을 정의합니다. SSe [test\$1orchestrator.yaml 구성](#test-orchestrator-config).  
IDT v4.5.2부터 `test_orchestrator.yaml` 파일을 사용하여 테스트 워크플로를 정의합니다. 이전 버전의 IDT에서는 `state_machine.json` 파일을 사용했습니다. 상태 시스템에 대한 자세한 내용은 [IDT 상태 시스템 구성](idt-state-machine.md) 섹션을 참조하세요.

**`userdata_schema.json`**  
테스트 실행기가 설정 구성에 포함할 수 있는 [`userdata.json` 파일](set-config-custom.md#userdata-config-custom)의 스키마를 정의합니다. 이 `userdata.json` 파일은 테스트를 실행하는 데 필요하지만 `device.json` 파일에는 없는 추가 구성 정보에 사용됩니다. [userdata\$1schema.json 구성](#userdata-schema-json)을(를) 참조하세요.

구성 파일은 다음과 같이 `<custom-test-suite-folder>`에 저장됩니다.

```
<custom-test-suite-folder>
└── suite
    ├── suite.json
    ├── test_orchestrator.yaml
    ├── userdata_schema.json
    ├── <test-group-folder>
        ├── group.json
        ├── <test-case-folder>
            └── test.json
```

## suite.json 구성
<a name="suite-json"></a>

`suite.json` 파일은 환경 변수를 설정하고 테스트 도구 모음을 실행하는 데 사용자 데이터가 필요한지 여부를 결정합니다. 다음 템플릿을 사용하여 `<custom-test-suite-folder>/suite/suite.json` 파일을 구성하십시오.

```
{
    "id": "<suite-name>_<suite-version>",
    "title": "<suite-title>",
    "details": "<suite-details>",
    "userDataRequired": true | false,
    "environmentVariables": [
        {
            "key": "<name>",
            "value": "<value>",
        },
        ...
        {
            "key": "<name>",
            "value": "<value>",
        }
    ]
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`id`**  
테스트 도구 모음의 고유한 사용자 정의 ID. `id`의 값은 `suite.json` 파일이 있는 테스트 도구 모음 폴더의 이름과 일치해야 합니다. 세트 이름과 세트 버전도 다음 요구 사항을 충족해야 합니다.  
+ `<suite-name>`은(는) 언더바를 포함할 수 없습니다.
+ `<suite-version>`은(는) 다음과 같이 `x.x.x`(으)로 표시됩니다. 여기서 `x`은(는) 숫자입니다.
ID는 IDT에서 생성한 테스트 보고서에 표시됩니다.

**`title`**  
이 테스트 도구 모음에서 테스트 중인 제품 또는 기능의 사용자 정의 이름입니다. 테스트 실행기의 IDT CLI에 이름이 표시됩니다.

**`details`**  
테스트 도구 모음의 용도에 대한 짧은 설명입니다.

**`userDataRequired`**  
테스트 실행기가 `userdata.json` 파일에 사용자 지정 정보를 포함해야 하는지 여부를 정의합니다. 이 값을 `true`으(로) 설정하는 경우, 테스트 도구 모음 폴더에도 [`userdata_schema.json` 파일](#userdata-schema-json)을 포함해야 합니다.

**`environmentVariables`**  
선택 사항. 이 테스트 도구 모음에 설정할 환경 변수 배열입니다.    
**`environmentVariables.key`**  
환경 변수의 이름입니다.  
**`environmentVariables.value`**  
환경 변수의 값입니다.

## group.json을 구성하십시오.
<a name="group-json"></a>

`group.json` 파일은 테스트 그룹이 필수인지 옵션인지 여부를 정의합니다. 다음 템플릿을 사용하여 `<custom-test-suite-folder>/suite/<test-group>/group.json` 파일을 구성하십시오.

```
{
    "id": "<group-id>",
    "title": "<group-title>",
    "details": "<group-details>",
    "optional": true | false,
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`id`**  
테스트 그룹의 고유한 사용자 정의 ID입니다. `id`의 값은 `group.json` 파일이 있는 테스트 그룹 폴더의 이름과 일치해야 하며 밑줄(`_`)을 포함할 수 없습니다. ID는 IDT에서 생성한 테스트 보고서에 사용됩니다.

**`title`**  
테스트 그룹을 나타내는 서술형 이름입니다. 테스트 실행기의 IDT CLI에 이름이 표시됩니다.

**`details`**  
테스트 그룹의 용도에 대한 짧은 설명입니다.

**`optional`**  
선택 사항. IDT에서 필수 테스트 실행을 완료한 후 이 테스트 그룹을 선택적 그룹으로 표시하도록 `true`(으)로 설정합니다. 기본값은 `false`입니다.

## test.json을 구성하십시오.
<a name="test-json"></a>

`test.json` 파일은 테스트 케이스 실행 파일 및 테스트 케이스에서 사용되는 환경 변수를 결정합니다. 테스트 케이스 실행 파일 생성에 대한 자세한 내용은 [IDT 테스트 사례 실행 파일 생성](test-executables.md) 섹션을 참조하세요.

다음 템플릿을 사용하여 `<custom-test-suite-folder>/suite/<test-group>/<test-case>/test.json` 파일을 구성하십시오.

```
{
    "id": "<test-id>",
    "title": "<test-title>",
    "details": "<test-details>",
    "requireDUT": true | false,
    "requiredResources": [
        {
            "name": "<resource-name>",
            "features": [
                {
                    "name": "<feature-name>",
                    "version": "<feature-version>",
                    "jobSlots": <job-slots>
                }
            ]
        }
    ],
    "execution": {
        "timeout": <timeout>,
        "mac": {
            "cmd": "/path/to/executable",
            "args": [
                "<argument>"
            ],
        },
        "linux": {
            "cmd": "/path/to/executable",
            "args": [
                "<argument>"
            ],
        },
        "win": {
            "cmd": "/path/to/executable",
            "args": [
                "<argument>"
            ]
        }
    },
    "environmentVariables": [
        {
            "key": "<name>",
            "value": "<value>",
        }
    ]
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`id`**  
테스트 사례의 고유한 사용자 정의 ID입니다. `id`의 값은 `test.json` 파일이 있는 테스트 사례 폴더의 이름과 일치해야 하며 밑줄(`_`)을 포함할 수 없습니다. ID는 IDT에서 생성한 테스트 보고서에 사용됩니다.

**`title`**  
테스트 케이스를 나타내는 서술형 이름입니다. 테스트 실행기의 IDT CLI에 이름이 표시됩니다.

**`details`**  
테스트 케이스의 용도에 대한 짧은 설명입니다.

**`requireDUT`**  
선택 사항. 이 테스트를 실행하는 데 기기가 필요한 경우, `true`(으)로 설정하고, 그렇지 않으면 `false`(으)로 설정합니다. 기본값은 `true`입니다. 테스트 실행기는 `device.json` 파일에서 테스트를 실행하는 데 사용할 기기를 구성합니다.

**`requiredResources`**  
선택 사항. 이 테스트를 실행하는 데 필요한 리소스 기기에 대한 정보를 제공하는 배열입니다.    
**`requiredResources.name`**  
이 테스트를 실행할 때 리소스 기기에 부여하는 고유한 이름입니다.  
**`requiredResources.features`**  
사용자 정의 리소스 디바이스 기능의 배열.    
**`requiredResources.features.name`**  
기능의 이름입니다. 이 디바이스를 사용하려는 디바이스 기능. 이 이름은 테스트 실행기가 `resource.json` 파일에 제공한 기능 이름과 일치합니다.  
**`requiredResources.features.version`**  
선택 사항. 기능의 버전. 이 값은 테스트 실행기가 `resource.json` 파일에서 제공한 기능 버전과 일치합니다. 버전이 제공되지 않으면 기능이 확인되지 않습니다. 기능에 버전 번호가 필요하지 않은 경우, 이 필드를 비워 둡니다.  
**`requiredResources.features.jobSlots`**  
선택 사항. 이 기능이 지원할 수 있는 동시 테스트 수입니다. 기본값은 `1`입니다. IDT에서 개별 기능에 대해 서로 다른 기기를 사용하도록 하려면 이 값을 `1`(으)로 설정하는 것이 좋습니다.

**`execution.timeout`**  
IDT가 테스트 실행이 완료될 때까지 기다리는 시간(밀리초) 입니다. 이 값 설정에 대한 자세한 내용을 알아보려면 [IDT 테스트 사례 실행 파일 생성](test-executables.md) 섹션을 참조하세요.

**`execution.os`**  
IDT를 실행하는 호스트 컴퓨터의 운영 체제에 따라 실행할 테스트 케이스 실행 파일입니다. 지원되는 값은 `linux`, `mac` 및 `win`입니다.    
**`execution.os.cmd`**  
지정된 운영 체제에서 실행하려는 테스트 케이스 실행 파일의 경로입니다. 이 위치는 시스템 경로에 있어야 합니다.  
**`execution.os.args`**  
선택 사항. 테스트 케이스 실행 파일을 실행하기 위해 제공할 인수입니다.

**`environmentVariables`**  
선택 사항. 이 테스트 케이스에 설정된 환경 변수 배열입니다.    
**`environmentVariables.key`**  
환경 변수의 이름입니다.  
**`environmentVariables.value`**  
환경 변수의 값입니다.
`test.json` 파일과 `suite.json` 파일에서 동일한 환경 변수를 지정하는 경우, `test.json` 파일의 값이 우선합니다.

## test\$1orchestrator.yaml 구성
<a name="test-orchestrator-config"></a>

테스트 오케스트레이터는 테스트 제품군 실행 흐름을 제어하는 구조입니다. 테스트 제품군의 시작 상태를 결정하고, 사용자 정의 규칙을 기반으로 상태 전환을 관리하며, 최종 상태에 도달할 때까지 해당 상태를 계속 전환합니다.

테스트 제품군에 사용자 정의 테스트 오케스트레이터가 포함되어 있지 않은 경우 IDT가 테스트 오케스트레이터를 생성합니다.

기본 테스트 오케스트레이터는 다음 기능을 수행합니다.
+ 테스트 실행기에 전체 테스트 제품군 대신 특정 테스트 그룹을 선택하고 실행할 수 있는 기능을 제공합니다.
+ 특정 테스트 그룹을 선택하지 않은 경우, 테스트 제품군의 모든 테스트 그룹을 무작위 순서로 실행합니다.
+ 보고서를 생성하고 각 테스트 그룹 및 테스트 사례의 테스트 결과를 보여주는 콘솔 요약을 인쇄합니다.

IDT 테스트 오케스트레이터의 작동 방식에 대한 자세한 내용은 [IDT 테스트 오케스트레이터 구성](idt-test-orchestrator.md) 섹션을 참조하세요.

## userdata\$1schema.json 구성
<a name="userdata-schema-json"></a>

`userdata_schema.json` 파일은 테스트 실행기가 사용자 데이터를 제공하는 스키마를 결정합니다. 테스트 도구 모음에 `device.json` 파일에 없는 정보가 필요한 경우, 사용자 데이터가 필요합니다. 예를 들어 테스트에는 Wi-Fi 네트워크 자격 증명, 특정 오픈 포트 또는 사용자가 제공해야 하는 인증서가 필요할 수 있습니다. 이 정보는 `userdata`(이)라는 입력 파라미터로 IDT에 제공될 수 있습니다. 이때 값은 `<device-tester-extract-location>/config` 폴더에 생성한 `userdata.json` 파일입니다. `userdata.json` 파일 형식은 테스트 도구 모음에 포함된 `userdata_schema.json` 파일을 기반으로 합니다.

테스트 실행기가 `userdata.json` 파일을 제공해야 함을 나타내려면:

1. `suite.json` 파일에서 `userDataRequired`을(를) `true`(으)로 설정합니다.

1. `<custom-test-suite-folder>`에서 `userdata_schema.json` 파일을 생성하십시오.

1. `userdata_schema.json` 파일을 편집하여 유효한 [IETF 초안 v4 JSON 스키마](https://json-schema.org/specification-links#draft-4)를 생성하십시오.

IDT는 테스트 제품군을 실행하면 자동으로 스키마를 읽고 이를 사용하여 테스트 실행기가 제공한 `userdata.json` 파일을 검증합니다. 유효한 경우, `userdata.json` 파일의 내용은 [IDT 컨텍스트](idt-context.md)와 [테스트 오케스트레이터 컨텍스트](idt-test-orchestrator.md#idt-test-orchestrator-context) 모두에서 사용할 수 있습니다.

# IDT 테스트 오케스트레이터 구성
<a name="idt-test-orchestrator"></a>

IDT v4.5.2부터 IDT에는 새로운 *테스트 오케스트레이터* 구성 요소가 포함됩니다. 테스트 오케스트레이터는 테스트 제품군 실행 흐름을 제어하고 IDT가 모든 테스트 실행을 완료한 후 테스트 보고서를 생성하는 IDT 구성 요소입니다. 테스트 오케스트레이터는 사용자 정의 규칙을 기반으로 테스트 선택 및 테스트 실행 순서를 결정합니다.

테스트 제품군에 사용자 정의 테스트 오케스트레이터가 포함되어 있지 않은 경우 IDT가 테스트 오케스트레이터를 생성합니다.

기본 테스트 오케스트레이터는 다음 기능을 수행합니다.
+ 테스트 실행기에 전체 테스트 제품군 대신 특정 테스트 그룹을 선택하고 실행할 수 있는 기능을 제공합니다.
+ 특정 테스트 그룹을 선택하지 않은 경우, 테스트 제품군의 모든 테스트 그룹을 무작위 순서로 실행합니다.
+ 보고서를 생성하고 각 테스트 그룹 및 테스트 사례의 테스트 결과를 보여주는 콘솔 요약을 인쇄합니다.

테스트 오케스트레이터는 IDT 상태 시스템을 대체합니다. 테스트 제품군을 개발할 때 IDT 상태 시스템 대신 테스트 오케스트레이터를 사용하는 것이 좋습니다. 테스트 오케스트레이터는 다음과 같은 향상된 기능을 제공합니다.
+ IDT 상태 시스템이 사용하는 명령형 형식이 아닌 선언적 형식을 사용합니다. 이를 통해 실행할 테스트 및 실행 시기를 지정할 수 있습니다.
+ 특정 그룹 처리, 보고서 생성, 오류 처리 및 결과 추적을 관리하므로 이러한 작업을 수동으로 관리할 필요가 없습니다.
+ 기본적으로 주석을 지원하는 YAML 형식을 사용합니다.
+ 동일한 워크플로를 정의하는 데 테스트 오케스트레이터보다 80% 적은 디스크 공간이 필요합니다.
+ 사전 테스트 검증을 추가하여 워크플로 정의에 잘못된 테스트 ID 또는 순환 종속성이 포함되어 있지 않은지 확인합니다.

## 테스트 오케스트레이터 형식
<a name="idt-test-orchestrator-format"></a>

다음 템플릿을 사용하여 `custom-test-suite-folder/suite/test_orchestrator.yaml` 파일을 직접 구성할 수 있습니다.

```
Aliases:
  string: context-expression

ConditionalTests:
  - Condition: context-expression
    Tests:
      - test-descriptor

Order:
  - - group-descriptor
    - group-descriptor

Features:
  - Name: feature-name
    Value: support-description
    Condition: context-expression
    Tests:
        - test-descriptor
    OneOfTests:
        - test-descriptor
    IsRequired: boolean
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

`Aliases`  
선택 사항. 컨텍스트 표현식에 매핑되는 사용자 정의 문자열입니다. 별칭을 사용하면 테스트 오케스트레이터 구성의 컨텍스트 표현식을 식별하기 위한 표시 이름을 생성할 수 있습니다. 이는 복잡한 컨텍스트 표현식이나 여러 위치에서 사용하는 표현식을 생성할 때 특히 유용합니다.  
컨텍스트 표현식을 사용하여 다른 IDT 구성의 데이터에 액세스할 수 있는 컨텍스트 쿼리를 저장할 수 있습니다. 자세한 내용은 [컨텍스트에서 데이터 액세스](idt-context.md#accessing-context-data) 단원을 참조하십시오.  

**Example**  
**예제**  

```
Aliases:
    FizzChosen: "'{{$pool.features[?(@.name == 'Fizz')].value[0]}}' == 'yes'"    
    BuzzChosen: "'{{$pool.features[?(@.name == 'Buzz')].value[0]}}' == 'yes'"    
    FizzBuzzChosen: "'{{$aliases.FizzChosen}}' && '{{$aliases.BuzzChosen}}'"
```

`ConditionalTests`  
선택 사항. 조건 목록 및 각 조건이 충족될 때 실행되는 해당 테스트 사례입니다. 각 조건에는 여러 테스트 사례가 있을 수 있지만 특정 테스트 사례를 하나의 조건에만 할당할 수 있습니다.  
기본적으로 IDT는 이 목록의 조건에 할당되지 않은 테스트 사례를 모두 실행합니다. 이 섹션을 지정하지 않으면 IDT가 테스트 제품군의 모든 테스트 그룹을 실행합니다.  
`ConditionalTests` 목록의 각 항목에는 다음 파라미터가 포함되어 있습니다.    
`Condition`  
부울 값으로 평가되는 컨텍스트 표현식입니다. 평가된 값이 true인 경우 IDT는 `Tests` 파라미터에 지정된 테스트 사례를 실행합니다.  
`Tests`  
테스트 설명자의 목록입니다.  
각 테스트 설명자는 테스트 그룹 ID와 하나 이상의 테스트 사례 ID를 사용하여 특정 테스트 그룹에서 실행할 개별 테스트를 식별합니다. 테스트 설명자는 다음 형식을 사용합니다.  

```
GroupId: group-id
CaseIds: [test-id, test-id] # optional
```

**Example**  
**예제**  
다음 예제에서는 `Aliases`와 같이 정의할 수 있는 일반 컨텍스트 표현식을 사용합니다.  

```
ConditionalTests:
    - Condition: "{{$aliases.Condition1}}"
      Tests:
          - GroupId: A
          - GroupId: B
    - Condition: "{{$aliases.Condition2}}"
      Tests:
          - GroupId: D
    - Condition: "{{$aliases.Condition1}} || {{$aliases.Condition2}}"
      Tests:
          - GroupId: C
```

IDT는 정의된 조건에 따라 다음과 같이 테스트 그룹을 선택합니다.
+ `Condition1`이 true인 경우 IDT는 테스트 그룹 A, B 및 C의 테스트를 실행합니다.
+ `Condition2`이 true인 경우 IDT는 테스트 그룹 C 및 D의 테스트를 실행합니다.

`Order`  
선택 사항. 테스트를 실행하는 순서입니다. 테스트 순서는 테스트 그룹 수준에서 지정합니다. 이 섹션을 지정하지 않으면 IDT는 해당하는 모든 테스트 그룹을 무작위 순서로 실행합니다. `Order`의 값은 그룹 설명자 목록의 목록입니다. `Order` 목록에 없는 모든 테스트 그룹은 나열된 다른 테스트 그룹과 병렬로 실행할 수 있습니다.  

각 그룹 설명자 목록에는 하나 이상의 그룹 설명자가 포함되며 각 설명자에 지정된 그룹을 실행하는 순서를 식별합니다. 다음 형식을 사용하여 개별 그룹 설명자를 정의할 수 있습니다.
+ `group-id` - 기존 테스트 그룹의 그룹 ID입니다.
+ `[group-id, group-id]` - 서로 임의의 순서로 실행할 수 있는 테스트 그룹의 목록입니다.
+ `"*"` - 와일드카드 이는 현재 그룹 설명자 목록에 아직 지정되지 않은 모든 테스트 그룹의 목록과 동일합니다.

`Order`의 값은 다음 요구 사항도 충족해야 합니다.
+ 그룹 설명자에서 지정하는 테스트 그룹 ID가 테스트 제품군에 있어야 합니다.
+ 각 그룹 설명자 목록에는 테스트 그룹이 하나 이상 포함되어야 합니다.
+ 각 그룹 설명자 목록에는 고유한 그룹 ID가 포함되어야 합니다. 개별 그룹 설명자 내에서 테스트 그룹 ID를 반복해서 사용할 수 없습니다.
+ 그룹 설명자 목록에는 와일드카드 그룹 설명자가 최대 하나만 포함될 수 있습니다. 와일드카드 그룹 설명자는 목록의 첫 번째 또는 마지막 항목이어야 합니다.

**Example**  
**예제**  
테스트 그룹 A, B, C, D, E가 포함된 테스트 제품군의 경우 다음 예제 목록은 IDT가 먼저 테스트 그룹 A 및 테스트 그룹 B를 순서대로 실행한 다음 테스트 그룹 C, D, E를 순서에 상관없이 실행하도록 지정하는 다양한 방법을 보여줍니다.  
+ 

  ```
  Order:
      - - A
        - B
        - [C, D, E]
  ```
+ 

  ```
  Order:
      - - A
        - B
        - "*"
  ```
+ 

  ```
  Order:
      - - A
        - B
      
      - - B
        - C
      
      - - B
        - D
      
      - - B
        - E
  ```

`Features`  
선택 사항. IDT가 `awsiotdevicetester_report.xml` 파일에 추가하려는 제품 기능의 목록입니다. 이 섹션을 지정하지 않으면 IDT는 보고서에 제품 기능을 추가하지 않습니다.  
제품 기능은 디바이스가 충족할 수 있는 특정 기준에 대한 사용자 정의 정보입니다. 예를 들어, MQTT 제품 기능은 디바이스가 MQTT 메시지를 올바르게 게시하도록 지정할 수 있습니다. `awsiotdevicetester_report.xml`에서는 지정된 테스트의 통과 여부에 따라 제품 기능이 `supported`, `not-supported` 또는 사용자 정의 값으로 설정됩니다.  
`Features` 목록의 각 항목은 다음 파라미터로 구성됩니다.    
`Name`  
기능의 이름입니다.  
`Value`  
선택 사항. 보고서에서 `supported` 대신 사용할 사용자 지정 값입니다. 이 값을 지정하지 않으면 IDT가 테스트 결과에 따라 기능 값을 `supported` 또는 `not-supported`로 설정합니다. 동일한 기능을 다른 조건으로 테스트하는 경우, `Features` 목록에 있는 기능의 각 인스턴스에 대해 사용자 지정 값을 사용할 수 있으며, IDT는 지원되는 조건에 대해 기능 값을 연결합니다. 자세한 내용을 알아보려면 다음 섹션을 참조하세요.  
`Condition`  
부울 값으로 평가되는 컨텍스트 표현식입니다. 평가된 값이 true인 경우 IDT는 테스트 제품군 실행을 완료한 후 테스트 보고서에 기능을 추가합니다. 평가된 값이 false인 경우 테스트가 보고서에 포함되지 않습니다.  
`Tests`  
선택 사항. 테스트 설명자의 목록입니다. 기능이 지원되려면 이 목록에 지정된 모든 테스트를 통과해야 합니다.  
이 목록의 각 테스트 설명자는 테스트 그룹 ID와 하나 이상의 테스트 사례 ID를 사용하여 특정 테스트 그룹에서 실행할 개별 테스트를 식별합니다. 테스트 설명자는 다음 형식을 사용합니다.  

```
GroupId: group-id
CaseIds: [test-id, test-id] # optional
```
`Features` 목록의 각 기능에 대해 `Tests` 또는 `OneOfTests` 중 하나를 지정해야 합니다.  
`OneOfTests`  
선택 사항. 테스트 설명자의 목록입니다. 기능이 지원되려면 이 목록에 지정된 테스트를 하나 이상 통과해야 합니다.  
이 목록의 각 테스트 설명자는 테스트 그룹 ID와 하나 이상의 테스트 사례 ID를 사용하여 특정 테스트 그룹에서 실행할 개별 테스트를 식별합니다. 테스트 설명자는 다음 형식을 사용합니다.  

```
GroupId: group-id
CaseIds: [test-id, test-id] # optional
```
`Features` 목록의 각 기능에 대해 `Tests` 또는 `OneOfTests` 중 하나를 지정해야 합니다.  
`IsRequired`  
테스트 보고서에서 기능이 필요한지 여부를 정의하는 부울 값입니다. 기본값은 `false`입니다.

## 테스트 오케스트레이터 컨텍스트
<a name="idt-test-orchestrator-context"></a>

테스트 오케스트레이터 컨텍스트는 실행 중에 테스트 오케스트레이터가 사용할 수 있는 데이터가 포함된 읽기 전용 JSON 문서입니다. 테스트 오케스트레이터 컨텍스트는 테스트 오케스트레이터에서만 액세스할 수 있으며 테스트 흐름을 결정하는 정보를 포함합니다. 예를 들어 `userdata.json` 파일에서 테스트 실행기가 구성한 정보를 사용하여 특정 테스트 실행이 필요한지 여부를 결정할 수 있습니다.

테스트 오케스트레이터 컨텍스트는 다음 형식을 사용합니다.

```
{
    "pool": {
        <device-json-pool-element>
    },
    "userData": {
        <userdata-json-content>
    },
    "config": {
        <config-json-content>
    }
}
```

`pool`  
테스트 실행을 위해 선택한 디바이스 풀에 대한 정보입니다. 선택한 디바이스 풀의 경우 이 정보는 `device.json` 파일에 정의된 해당 최상위 디바이스 풀 배열 요소에서 검색됩니다.

`userData`  
`userdata.json` 파일에 있는 정보입니다.

`config`  
`config.json` 파일에 있는 정보입니다.

JSONPath 표기법을 사용하여 컨텍스트를 쿼리할 수 있습니다. 상태 정의의 JSONPath 쿼리 구문은 `{{query}}`입니다. 테스트 오케스트레이터 컨텍스트에서 데이터에 액세스할 때는 각 값이 문자열, 숫자 또는 부울로 평가되어야 합니다.

JSONPath 표기법을 사용하여 컨텍스트에서 데이터에 액세스하는 방법에 대한 자세한 내용은 [IDT 컨텍스트 사용](idt-context.md) 섹션을 참조하십시오.

# IDT 상태 시스템 구성
<a name="idt-state-machine"></a>

**중요**  
IDT v4.5.2부터 이 상태 시스템은 더 이상 사용되지 않습니다. 새 테스트 오케스트레이터를 사용하는 것이 가장 좋습니다. 자세한 내용은 [IDT 테스트 오케스트레이터 구성](idt-test-orchestrator.md) 단원을 참조하십시오.

상태 시스템은 테스트 제품군 실행 흐름을 제어하는 구조입니다. 테스트 도구 모음의 시작 상태를 결정하고, 사용자 정의 규칙을 기반으로 상태 전환을 관리하며, 최종 상태에 도달할 때까지 해당 상태를 계속 전환합니다.

테스트 제품군에 사용자 정의 상태 머신이 포함되지 않은 경우 IDT가 상태 머신을 자동으로 생성합니다. 기본 상태 머신은 다음 기능을 수행합니다.
+ 테스트 실행기에 전체 테스트 제품군 대신 특정 테스트 그룹을 선택하고 실행할 수 있는 기능을 제공합니다.
+ 특정 테스트 그룹을 선택하지 않은 경우, 테스트 제품군의 모든 테스트 그룹을 무작위 순서로 실행합니다.
+ 보고서를 생성하고 각 테스트 그룹 및 테스트 사례의 테스트 결과를 보여주는 콘솔 요약을 인쇄합니다.

IDT 테스트 제품군의 상태 머신은 다음 기준을 충족해야 합니다.
+ 각 상태는 테스트 그룹 실행 또는 보고서 파일 생성과 같이 IDT가 취할 수 있는 작업에 해당합니다.
+ 상태로 전환하면 상태와 관련된 작업이 실행됩니다.
+ 각 상태는 다음 상태의 전환 규칙을 정의합니다.
+ 종료 상태는 `Succeed` 또는 `Fail` 중 하나여야 합니다.

## 상태 머신 형식
<a name="state-machine-format"></a>

다음 템플릿을 사용하여 `<custom-test-suite-folder>/suite/state_machine.json` 파일을 직접 구성할 수 있습니다.

```
{
  "Comment": "<description>",
  "StartAt": "<state-name>",
  "States": {
    "<state-name>": {
      "Type": "<state-type>",
      // Additional state configuration
    }
    
    // Required states
    "Succeed": {
      "Type": "Succeed"
    },
    "Fail": {
      "Type": "Fail"
    }
  }
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Comment`**  
상태 머신의 설명입니다.

**`StartAt`**  
IDT가 테스트 제품군을 실행하기 시작하는 상태의 이름. `StartAt`의 값은 `States` 객체에 나열된 상태 중 하나로 설정해야 합니다.

**`States`**  
사용자 정의 상태 이름을 유효한 IDT 상태에 매핑하는 객체입니다. 각 상태.*state-name* 객체에는 상태 *state-name*에 매핑된 유효한 상태의 정의가 포함됩니다.  
`States` 객체에는 `Succeed` 및 `Fail` 상태가 포함되어야 합니다. 유효한 상태에 대한 자세한 내용은 [유효한 상태 및 상태 정의](#valid-states) 섹션을 참조하세요.

## 유효한 상태 및 상태 정의
<a name="valid-states"></a>

이 섹션에서는 IDT 상태 머신에서 사용할 수 있는 모든 유효한 상태의 상태 정의를 설명합니다. 다음 상태 중 일부는 테스트 케이스 수준의 구성을 지원합니다. 하지만 꼭 필요한 경우가 아니면 테스트 케이스 수준 대신 테스트 그룹 수준에서 상태 전환 규칙을 구성하는 것이 좋습니다.

**Topics**
+ [

### RunTask
](#state-runtask)
+ [

### Choice
](#state-choice)
+ [

### Parallel
](#state-parallel)
+ [

### AddProductFeatures
](#state-addproductfeatures)
+ [

### Report
](#state-report)
+ [

### LogMessage
](#state-logmessage)
+ [

### SelectGroup
](#state-selectgroup)
+ [

### Fail
](#state-fail)
+ [

### Succeed
](#state-succeed)

### RunTask
<a name="state-runtask"></a>

`RunTask` 상태는 테스트 제품군에 정의된 테스트 그룹에서 테스트 케이스를 실행합니다.

```
{
    "Type": "RunTask",
    "Next": "<state-name>",
    "TestGroup": "<group-id>",
    "TestCases": [
        "<test-id>"
    ],
    "ResultVar": "<result-name>"
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Next`**  
현재 상태에서 작업을 실행한 후 전환할 상태의 이름입니다.

**`TestGroup`**  
선택 사항. 실행할 테스트 그룹의 ID. 이 값을 지정하지 않으면 IDT는 테스트 실행기가 선택한 테스트 그룹을 실행합니다.

**`TestCases`**  
선택 사항. `TestGroup`에서 지정한 그룹의 테스트 케이스 ID 배열. IDT는 `TestGroup` 및 `TestCases` 값을 기반으로 다음과 같이 테스트 실행 동작을 결정합니다.  
+ `TestGroup`과 `TestCases`가 모두 지정된 경우 IDT는 테스트 그룹에서 지정된 테스트 케이스를 실행합니다.
+ `TestCases`가 지정되었지만 `TestGroup`이 지정되지 않은 경우 IDT는 지정된 테스트 케이스를 실행합니다.
+ `TestGroup`이 지정되었지만 `TestCases`가 지정되지 않은 경우 IDT는 지정된 테스트 그룹 내의 모든 테스트 케이스를 실행합니다.
+ `TestGroup` 또는 `TestCases` 둘 다 지정되지 않은 경우 IDT는 테스트 실행기가 IDT CLI에서 선택한 테스트 그룹에서 모든 테스트 케이스를 실행합니다. 테스트 실행기에 대한 그룹 선택을 활성화하려면 `statemachine.json` 파일에 `RunTask` 및 `Choice` 상태를 모두 포함해야 합니다. 작동 방식에 대한 예제는 [상태 시스템 예시: 사용자가 선택한 테스트 그룹 실행](#allow-specific-groups)을 참조하십시오.

  테스트 실행기의 IDT CLI 명령 활성화에 대한 자세한 내용은 [IDT CLI 명령을 활성화합니다.](test-executables.md#idt-cli-coop) 섹션을 참조하세요.

**`ResultVar`**  
테스트 실행 결과와 함께 설정할 컨텍스트 변수의 이름. `TestGroup`에 대한 값을 지정하지 않은 경우 이 값을 지정하지 마십시오. IDT는 다음에 따라 `ResultVar`에서 `true` 또는 `false`로 정의한 변수 값을 설정합니다.  
+ 변수 이름의 `text_text_passed` 형식인 경우 값은 첫 번째 테스트 그룹의 모든 테스트를 통과했는지 아니면 건너뛰었는지로 설정됩니다.
+ 다른 모든 경우에는 값이 모든 테스트 그룹의 모든 테스트를 통과했는지 아니면 건너뛰었는지로 설정됩니다.

일반적으로 `RunTask` 상태를 사용하여 개별 테스트 케이스 ID를 지정하지 않고 테스트 그룹 ID를 지정하면 IDT가 지정된 테스트 그룹의 모든 테스트 케이스를 실행하게 됩니다. 이 상태에서 실행되는 모든 테스트 케이스는 무작위 순서로 병렬로 실행됩니다. 그러나 모든 테스트 케이스를 실행하는 데 디바이스가 필요하고 사용 가능한 디바이스가 하나뿐인 경우에는 테스트 케이스가 대신 순차적으로 실행됩니다.

**오류 처리**

지정된 테스트 그룹 또는 테스트 케이스 ID가 유효하지 않은 경우 이 상태에서는 `RunTaskError` 실행 오류가 발생합니다. 상태에서 실행 오류가 발생하는 경우 상태 머신 컨텍스트의 `hasExecutionError` 변수도 `true`로 설정됩니다.

### Choice
<a name="state-choice"></a>

`Choice` 상태를 사용하면 사용자 정의 조건에 따라 전환할 다음 상태를 동적으로 설정할 수 있습니다.

```
{
    "Type": "Choice",
    "Default": "<state-name>", 
    "FallthroughOnError": true | false,
    "Choices": [
        {
            "Expression": "<expression>",
            "Next": "<state-name>"
        }
    ]
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Default`**  
`Choices`에 정의된 표현식을 `true`로 평가할 수 없는 경우 전환할 기본 상태입니다.

**`FallthroughOnError`**  
선택 사항. 상태에서 표현식을 평가할 때 오류가 발생할 경우의 동작을 지정합니다. 평가 결과 오류가 발생할 경우 표현식을 건너뛰려면 `true`로 설정합니다. 일치하는 표현식이 없는 경우 상태 머신은 해당 `Default` 상태로 전환됩니다. `false` 값이 지정하지 않은 경우 기본값은 `FallthroughOnError`입니다.

**`Choices`**  
현재 상태에서 동작을 실행한 후 전환할 상태를 결정하는 표현식 및 상태의 배열입니다.    
**`Choices.Expression`**  
부울 값으로 평가되어야 하는 표현식 문자열입니다. 표현식이 `true`로 평가되면 상태 머신은 `Choices.Next`에 정의된 상태로 전환됩니다. 표현식 문자열은 상태 시스템 컨텍스트에서 값을 검색한 다음 해당 값에 대한 연산을 수행하여 부울 값에 도달합니다. 상태 시스템 컨텍스트에 액세스하는 방법에 대한 자세한 내용은 [상태 머신 컨텍스트](#state-machine-context) 섹션을 참조하세요.  
**`Choices.Next`**  
`Choices.Expression`에 정의된 표현식이 `true`로 평가되면 전환할 상태의 이름입니다.

**오류 처리**

`Choice` 상태는 다음과 같은 경우에 오류 처리를 요구할 수 있습니다.
+ 선택 표현식의 일부 변수는 상태 머신 컨텍스트에 존재하지 않습니다.
+ 표현식의 결과는 부울 값이 아닙니다.
+ JSON 조회 결과는 문자열, 숫자 또는 부울이 아닙니다.

이 상태에서는 `Catch` 블록을 사용하여 오류를 처리할 수 없습니다. 오류가 발생했을 때 상태 머신 실행을 중지하려면 `FallthroughOnError`를 `false`로 설정해야 합니다. 하지만 사용 사례에 따라 다음 중 하나를 수행하도록 `FallthroughOnError`를 `true`로 설정하는 것이 좋습니다.
+ 액세스하는 변수가 존재하지 않을 것으로 예상되는 경우가 있다면, `Default`의 값과 추가 `Choices` 블록을 사용하여 다음 상태를 지정하십시오.
+ 액세스 중인 변수가 항상 존재해야 하는 경우 `Default` 상태를 `Fail`로 설정하십시오.

### Parallel
<a name="state-parallel"></a>

`Parallel` 상태를 사용하면 새 상태 머신을 서로 병렬로 정의하고 실행할 수 있습니다.

```
{
    "Type": "Parallel",
    "Next": "<state-name>",
    "Branches": [
        <state-machine-definition>
    ]
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Next`**  
현재 상태에서 작업을 실행한 후 전환할 상태의 이름입니다.

**`Branches`**  
실행할 상태 머신 정의의 배열입니다. 각 스테이트 머신 정의에는 고유한 `StartAt`, `Succeed`, `Fail` 상태가 포함되어야 합니다. 이 배열의 상태 머신 정의는 자체 정의 이외의 상태를 참조할 수 없습니다.  
각 브랜치 상태 머신은 동일한 상태 머신 컨텍스트를 공유하므로 한 브랜치에서 변수를 설정한 다음 다른 브랜치에서 해당 변수를 읽으면 예상치 못한 동작이 발생할 수 있습니다.

브랜치 상태 머신을 모두 실행한 후에만 `Parallel` 상태가 다음 상태로 이동합니다. 디바이스가 필요한 각 상태는 디바이스를 사용할 수 있을 때까지 실행을 대기합니다. 여러 디바이스를 사용할 수 있는 경우 이 상태는 여러 그룹의 테스트 케이스를 병렬로 실행합니다. 사용할 수 있는 디바이스가 충분하지 않으면 테스트 케이스가 순차적으로 실행됩니다. 테스트 케이스는 병렬로 실행될 때 무작위 순서로 실행되므로 동일한 테스트 그룹에서 테스트를 실행하는 데 여러 디바이스가 사용될 수 있습니다.

**오류 처리**

실행 오류를 처리하려면 브랜치 상태 머신과 부모 상태 머신이 모두 해당 `Fail` 상태로 전환되는지 확인하십시오.

브랜치 상태 머신은 부모 상태 머신에 실행 오류를 전송하지 않으므로 `Catch` 블록을 사용하여 브랜치 상태 머신의 실행 오류를 처리할 수 없습니다. 대신 공유 상태 머신 컨텍스트의 `hasExecutionErrors` 값을 사용하십시오. 이렇게 하는 방법의 예는 [상태 머신 예제: 두 테스트 그룹을 병렬로 실행](#run-in-parallel) 섹션을 참조하세요.

### AddProductFeatures
<a name="state-addproductfeatures"></a>

`AddProductFeatures` 상태에서는 IDT에서 생성한 `awsiotdevicetester_report.xml` 파일에 제품 기능을 추가할 수 있습니다.

제품 기능은 디바이스가 충족할 수 있는 특정 기준에 대한 사용자 정의 정보입니다. 예를 들어, `MQTT` 제품 기능은 디바이스가 MQTT 메시지를 올바르게 게시하도록 지정할 수 있습니다. 보고서에서 제품 기능은 지정된 테스트의 통과 여부에 따라 `supported`, `not-supported` 또는 사용자 지정 값으로 설정됩니다.



**참고**  
`AddProductFeatures` 상태는 자체적으로 보고서를 생성하지 않습니다. 보고서를 생성하려면 이 상태를 [`Report` 상태로](#state-report) 전환해야 합니다.

```
{
    "Type": "Parallel",
    "Next": "<state-name>",
    "Features": [
        {
            "Feature": "<feature-name>", 
            "Groups": [
                "<group-id>"
            ],
            "OneOfGroups": [
                "<group-id>"
            ],
            "TestCases": [
                "<test-id>"
            ],
            "IsRequired": true | false,
            "ExecutionMethods": [
                "<execution-method>"
            ]
        }
    ]
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Next`**  
현재 상태에서 작업을 실행한 후 전환할 상태의 이름입니다.

**`Features`**  
`awsiotdevicetester_report.xml` 파일에 표시할 제품 기능의 배열.    
**`Feature`**  
기능의 이름입니다.  
**`FeatureValue`**  
선택 사항. 보고서에서 `supported` 대신 사용할 사용자 지정 값입니다. 이 값을 지정하지 않으면 테스트 결과에 따라 기능 값이 `supported` 또는 `not-supported`로 설정됩니다.  
`FeatureValue`에 사용자 지정 값을 사용하면 동일한 기능을 다른 조건으로 테스트할 수 있으며, IDT는 지원되는 조건에 대한 기능 값을 연결합니다. 예를 들어, 다음 발췌문은 두 개의 개별 기능 값이 있는 `MyFeature` 기능을 보여줍니다.  

```
...
{
    "Feature": "MyFeature",
    "FeatureValue": "first-feature-supported",
    "Groups": ["first-feature-group"]
},
{
    "Feature": "MyFeature",
    "FeatureValue": "second-feature-supported",
    "Groups": ["second-feature-group"]
},
...
```
두 테스트 그룹이 모두 통과하면 기능 값이 `first-feature-supported, second-feature-supported`로 설정됩니다.  
**`Groups`**  
선택 사항. 테스트 그룹 ID의 배열입니다. 기능을 지원하려면 지정된 각 테스트 그룹 내의 모든 테스트를 통과해야 합니다.  
**`OneOfGroups`**  
선택 사항. 테스트 그룹 ID의 배열입니다. 기능이 지원되려면 지정된 테스트 그룹 중 하나 이상의 모든 테스트를 통과해야 합니다.  
**`TestCases`**  
선택 사항. 테스트 케이스 ID의 배열입니다. 이 값을 지정하면 다음이 적용됩니다.  
+ 기능이 지원되려면 지정된 모든 테스트 케이스를 통과해야 합니다.
+ `Groups`은 테스트 그룹 ID는 하나만 포함해야 합니다.
+ `OneOfGroups`은 지정하지 않아야 합니다.  
**`IsRequired`**  
선택 사항. 보고서에서 이 기능을 선택적 기능으로 표시하려면 `false`로 설정합니다. 기본값은 `true`입니다.  
**`ExecutionMethods`**  
선택 사항. `device.json` 파일에 지정된 `protocol` 값과 일치하는 실행 메서드의 배열. 이 값을 지정하는 경우 테스트 실행기는 이 배열의 값 중 하나와 일치하는 `protocol` 값을 지정하여 보고서에 기능을 포함해야 합니다. 이 값을 지정하지 않으면 기능이 항상 보고서에 포함됩니다.

`AddProductFeatures` 상태를 사용하려면 `RunTask` 상태의 `ResultVar` 값을 다음 값 중 하나로 설정해야 합니다.
+ 개별 테스트 케이스 ID를 지정한 경우 `ResultVar`을(를) `group-id_test-id_passed`(으)로 설정합니다.
+ 개별 테스트 케이스 ID를 지정하지 않은 경우 `ResultVar`을(를) `group-id_passed`(으)로 설정합니다.

`AddProductFeatures` 상태에서는 다음과 같은 방식으로 테스트 결과를 확인합니다.
+ 테스트 케이스 ID를 지정하지 않은 경우 각 테스트 그룹의 결과는 상태 머신 컨텍스트의 `group-id_passed` 변수 값에 따라 결정됩니다.
+ 테스트 케이스 ID를 지정한 경우 각 테스트의 결과는 상태 머신 컨텍스트의 `group-id_test-id_passed` 변수 값을 기반으로 결정됩니다.

**오류 처리**

이 상태에서 제공된 그룹 ID가 유효한 그룹 ID가 아닌 경우 이 상태로 인해 `AddProductFeaturesError` 실행 오류가 발생합니다. 상태에서 실행 오류가 발생하는 경우 상태 머신 컨텍스트의 `hasExecutionErrors` 변수도 `true`로 설정됩니다.

### Report
<a name="state-report"></a>

`Report` 상태는 `suite-name_Report.xml` 및 `awsiotdevicetester_report.xml` 파일을 생성합니다. 또한 이 상태는 보고서를 콘솔로 스트리밍합니다.

```
{
    "Type": "Report",
    "Next": "<state-name>"
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Next`**  
현재 상태에서 작업을 실행한 후 전환할 상태의 이름입니다.

테스트 실행기가 테스트 결과를 볼 수 있도록 테스트 실행 흐름이 끝날 무렵에는 항상 `Report` 상태로 전환해야 합니다. 일반적으로 이 상태 이후의 다음 상태는 `Succeed`입니다.

**오류 처리**

이 상태에서 보고서를 생성하는 데 문제가 발생하면 `ReportError` 실행 오류가 발생합니다.

### LogMessage
<a name="state-logmessage"></a>

`LogMessage` 상태는 `test_manager.log` 파일을 생성하고 로그 메시지를 콘솔로 스트리밍합니다.

```
{
    "Type": "LogMessage",
    "Next": "<state-name>"
    "Level": "info | warn | error"
    "Message": "<message>"
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Next`**  
현재 상태에서 작업을 실행한 후 전환할 상태의 이름입니다.

**`Level`**  
로그 메시지를 생성할 때의 오류 수준입니다. 유효하지 않은 수준을 지정하면 이 상태가 오류 메시지를 생성하고 삭제합니다.

**`Message`**  
로그할 메시지.

### SelectGroup
<a name="state-selectgroup"></a>

`SelectGroup` 상태는 상태 머신 컨텍스트를 업데이트하여 선택된 그룹을 나타냅니다. 이 상태에서 설정된 값은 이후의 모든 `Choice` 상태에서 사용됩니다.

```
{
    "Type": "SelectGroup",
    "Next": "<state-name>"
    "TestGroups": [
        <group-id>"
    ]
}
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Next`**  
현재 상태에서 작업을 실행한 후 전환할 상태의 이름입니다.

**`TestGroups`**  
선택된 것으로 표시될 테스트 그룹 배열입니다. 이 배열의 각 테스트 그룹 ID에 대해 `group-id_selected` 변수는 컨텍스트에서 `true`로 설정됩니다. IDT는 지정된 그룹이 존재하는지 여부를 확인하지 않으므로 유효한 테스트 그룹 ID를 제공해야 합니다.

### Fail
<a name="state-fail"></a>

`Fail` 상태는 상태 머신이 제대로 실행되지 않았음을 나타냅니다. 이는 상태 머신의 종료 상태이며 각 상태 머신 정의에는 이 상태가 포함되어야 합니다.

```
{
    "Type": "Fail"
}
```

### Succeed
<a name="state-succeed"></a>

`Succeed` 상태는 상태 머신이 올바르게 실행되었음을 나타냅니다. 이는 상태 머신의 종료 상태이며 각 상태 머신 정의에는 이 상태가 포함되어야 합니다.

```
{
    "Type": "Succeed"
}
```

## 상태 머신 컨텍스트
<a name="state-machine-context"></a>

상태 머신 컨텍스트는 실행 중에 상태 머신이 사용할 수 있는 데이터를 포함하는 읽기 전용 JSON 문서입니다. 상태 머신 컨텍스트는 상태 머신에서만 액세스할 수 있으며 테스트 흐름을 결정하는 정보를 포함합니다. 예를 들어 `userdata.json` 파일에서 테스트 실행기가 구성한 정보를 사용하여 특정 테스트 실행이 필요한지 여부를 결정할 수 있습니다.

상태 머신 컨텍스트는 다음 형식을 사용합니다.

```
{
    "pool": {
        <device-json-pool-element>
    },
    "userData": {
        <userdata-json-content>
    },
    "config": {
        <config-json-content>
    },
    "suiteFailed": true | false,
    "specificTestGroups": [
        "<group-id>"
    ],
    "specificTestCases": [
        "<test-id>"
    ],
    "hasExecutionErrors": true
}
```

**`pool`**  
테스트 실행을 위해 선택한 디바이스 풀에 대한 정보. 선택한 디바이스 풀의 경우 이 정보는 `device.json` 파일에 정의된 해당 최상위 디바이스 풀 배열 요소에서 검색됩니다.

**`userData`**  
`userdata.json` 파일의 정보.

**`config`**  
정보는 `config.json` 파일을 정의합니다.

**`suiteFailed`**  
값은 상태 머신이 시작될 때 `false`로 설정됩니다. 테스트 그룹이 `RunTask` 상태로 실패하는 경우 이 값은 상태 머신의 남은 실행 기간 동안으로 `true`로 설정됩니다.

**`specificTestGroups`**  
테스트 실행기가 전체 테스트 제품군 대신 실행할 특정 테스트 그룹을 선택하면 이 키가 생성되고 여기에는 특정 테스트 그룹 ID 목록이 포함됩니다.

**`specificTestCases`**  
테스트 실행기가 전체 테스트 제품군 대신 실행할 특정 테스트 케이스를 선택하면 이 키가 생성되고 여기에는 특정 테스트 케이스 ID 목록이 포함됩니다.

**`hasExecutionErrors`**  
상태 머신이 시작될 때 종료되지 않습니다. 어떤 상태에서든 실행 오류가 발생하는 경우 이 변수가 생성되고 남은 상태 머신 실행 기간 동안 `true`로 설정됩니다.

JSONPath 표기법을 사용하여 컨텍스트를 쿼리할 수 있습니다. 상태 정의의 JSONPath 쿼리 구문은 `{{$.query}}`입니다. 일부 상태에서는 JSONPath 쿼리를 자리 표시자 문자열로 사용할 수 있습니다. IDT는 자리 표시자 문자열을 컨텍스트에서 평가된 JSONPath 쿼리의 값으로 대체합니다. 다음 값에 자리 표시자를 사용할 수 있습니다.
+ `RunTask` 상태의 `TestCases` 값.
+ `Expression` 값 `Choice` 상태.

상태 머신 컨텍스트에서 데이터에 액세스할 때 다음 조건이 충족되는지 확인하십시오.
+ JSON 경로는 `$.`로 시작해야 합니다.
+ 각 값은 문자열, 숫자 또는 부울로 평가되어야 합니다.

JSONPath 표기법을 사용하여 컨텍스트에서 데이터에 액세스하는 방법에 대한 자세한 내용은 [IDT 컨텍스트 사용](idt-context.md) 섹션을 참조하십시오.

## 실행 오류
<a name="execution-errors"></a>

실행 오류는 상태 머신이 상태를 실행할 때 발생하는 상태 머신 정의의 오류입니다. IDT는 `test_manager.log` 파일의 각 오류에 대한 정보를 기록하고 로그 메시지를 콘솔로 스트리밍합니다.

다음 방법을 사용하여 실행 오류를 처리할 수 있습니다.
+ 상태 정의에 [`Catch` 블록](#catch)을 추가합니다.
+ 상태 머신 컨텍스트에서 [`hasExecutionErrors` 값](#context)의 값을 확인합니다.

### Catch
<a name="catch"></a>

`Catch`를 사용하려면 상태 정의에 다음을 추가하십시오.

```
"Catch": [
    {    
        "ErrorEquals": [
            "<error-type>"
        ]
        "Next": "<state-name>" 
    }
]
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`Catch.ErrorEquals`**  
캐치할 오류 유형의 배열입니다. 실행 오류가 지정된 값 중 하나와 일치하면 상태 머신이 `Catch.Next`에서 지정된 상태로 전환됩니다. 발생하는 오류 유형에 대한 자세한 내용은 각 상태 정의를 참조하십시오.

**`Catch.Next`**  
현재 상태에서 `Catch.ErrorEquals`에서 지정한 값 중 하나와 일치하는 실행 오류가 발생하는 경우 전환할 다음 상태입니다.

Catch 블록은 둘 중 하나가 일치할 때까지 순차적으로 처리됩니다. Catch 블록에 나열된 오류와 일치하는 오류가 없으면 상태 머신이 계속 실행됩니다. 실행 오류는 잘못된 상태 정의로 인해 발생하므로 상태에 실행 오류가 발생하면 Fail 상태로 전환하는 것이 좋습니다.

### hasExecutionError
<a name="context"></a>

일부 상태에서는 실행 오류가 발생하는 경우 오류가 발생하는 것 외에도 상태 시스템 컨텍스트에서 `hasExecutionError` 값을 `true`로 설정합니다. 이 값을 사용하여 오류 발생 시기를 감지한 다음 `Choice` 상태를 사용하여 상태 머신을 해당 `Fail` 상태로 전환할 수 있습니다.

이 메서드는 다음과 특징이 있습니다.
+ 상태 머신은 `hasExecutionError`에 할당된 어떤 값으로도 시작되지 않으며 특정 상태가 값을 설정하기 전까지는 이 값을 사용할 수 없습니다. 즉, 실행 오류가 발생하지 않을 경우 상태 머신이 중지되지 않도록 이 값에 액세스하는 `Choice` 상태에 대해 명시적으로 `FallthroughOnError`를 `false`로 설정해야 합니다.
+ `true`로 설정한 후에는 `hasExecutionError`가 false로 설정되거나 컨텍스트에서 제거되지 않습니다. 즉, 이 값은 `true`로 처음 설정할 때만 유용하며 이후의 모든 상태에서는 의미 있는 값을 제공하지 않습니다.
+ `hasExecutionError` 값은 `Parallel` 상태의 모든 브랜치 상태 머신과 공유되므로 액세스 순서에 따라 예상치 못한 결과가 발생할 수 있습니다.

이러한 특성 때문에 Catch 블록을 대신 사용할 수 있는 경우에는 이 방법을 사용하지 않는 것이 좋습니다.

## 상태 머신 예제
<a name="state-machine-examples"></a>

이 섹션에서는 몇 가지 상태 시스템 구성의 예제를 제공합니다.

**Topics**
+ [

### 상태 머신 예제: 단일 테스트 그룹 실행
](#single-test-group)
+ [

### 상태 머신 예제: 사용자가 선택한 테스트 그룹 실행
](#allow-specific-groups)
+ [

### 상태 머신 예제: 제품 기능이 포함된 단일 테스트 그룹 실행
](#run-with-product-features)
+ [

### 상태 머신 예제: 두 테스트 그룹을 병렬로 실행
](#run-in-parallel)

### 상태 머신 예제: 단일 테스트 그룹 실행
<a name="single-test-group"></a>

이 상태 머신:
+ ID `GroupA`를 사용하여 테스트 그룹을 실행하며 이 ID는 `group.json` 파일에 있어야 합니다.
+ 실행 오류가 있는지 확인하고 오류가 있는 경우, `Fail`로 전환합니다.
+ 보고서를 생성하고 오류가 없는 경우 `Succeed`로 전환하고 그렇지 않으면 `Fail`로 전환합니다.

```
{
    "Comment": "Runs a single group and then generates a report.",
    "StartAt": "RunGroupA",
    "States": {
        "RunGroupA": {
            "Type": "RunTask",
            "Next": "Report",
            "TestGroup": "GroupA",
            "Catch": [
                {
                    "ErrorEquals": [
                        "RunTaskError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "Report": {
            "Type": "Report",
            "Next": "Succeed",
            "Catch": [
                {
                    "ErrorEquals": [
                        "ReportError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "Succeed": {
            "Type": "Succeed"
        },
        "Fail": {
            "Type": "Fail"
        }
    }
}
```

### 상태 머신 예제: 사용자가 선택한 테스트 그룹 실행
<a name="allow-specific-groups"></a>

이 상태 머신:
+ 테스트 실행기가 특정 테스트 그룹을 선택했는지 확인합니다. 테스트 실행기가 테스트 그룹을 선택하지 않으면 테스트 케이스를 선택할 수 없기 때문에 상태 머신은 특정 테스트 케이스를 확인하지 않습니다.
+ 테스트 그룹을 선택한 경우: 
  + 선택한 테스트 그룹 내에서 테스트 케이스를 실행합니다. 이를 위해 상태 머신은 `RunTask` 상태의 테스트 그룹이나 테스트 케이스를 명시적으로 지정하지 않습니다.
  + 모든 테스트를 실행한 후 보고서를 생성하고 종료합니다.
+ 테스트 그룹을 선택하지 않은 경우:
  + 테스트 그룹 `GroupA`에서 테스트를 실행합니다.
  + 보고서를 생성하고 종료합니다.

```
{
    "Comment": "Runs specific groups if the test runner chose to do that, otherwise runs GroupA.",
    "StartAt": "SpecificGroupsCheck",
    "States": {
        "SpecificGroupsCheck": {
            "Type": "Choice",
            "Default": "RunGroupA",
            "FallthroughOnError": true,
            "Choices": [
                {
                    "Expression": "{{$.specificTestGroups[0]}} != ''",
                    "Next": "RunSpecificGroups"
                }
            ]
        },
        "RunSpecificGroups": {
            "Type": "RunTask",
            "Next": "Report",
            "Catch": [
                {
                    "ErrorEquals": [
                        "RunTaskError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "RunGroupA": {
            "Type": "RunTask",
            "Next": "Report",
            "TestGroup": "GroupA",
            "Catch": [
                {
                    "ErrorEquals": [
                        "RunTaskError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "Report": {
            "Type": "Report",
            "Next": "Succeed",
            "Catch": [
                {
                    "ErrorEquals": [
                        "ReportError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "Succeed": {
            "Type": "Succeed"
        },
        "Fail": {
            "Type": "Fail"
        }
    }
}
```

### 상태 머신 예제: 제품 기능이 포함된 단일 테스트 그룹 실행
<a name="run-with-product-features"></a>

이 상태 머신:
+ 테스트 그룹 `GroupA`를 실행합니다.
+ 실행 오류가 있는지 확인하고 오류가 있는 경우, `Fail`로 전환합니다.
+ `awsiotdevicetester_report.xml` 파일에 `FeatureThatDependsOnGroupA` 기능을 추가합니다.
  + `GroupA`가 통과하면 기능이 `supported`로 설정됩니다.
  + 이 기능은 보고서에서 선택 사항으로 표시되어 있지 않습니다.
+ 보고서를 생성하고 오류가 없는 경우 `Succeed`로 전환하고 그렇지 않으면 `Fail`로 전환합니다.

```
{
    "Comment": "Runs GroupA and adds product features based on GroupA",
    "StartAt": "RunGroupA",
    "States": {
        "RunGroupA": {
            "Type": "RunTask",
            "Next": "AddProductFeatures",
            "TestGroup": "GroupA",
            "ResultVar": "GroupA_passed",
            "Catch": [
                {
                    "ErrorEquals": [
                        "RunTaskError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "AddProductFeatures": {
            "Type": "AddProductFeatures",
            "Next": "Report",
            "Features": [
                {
                    "Feature": "FeatureThatDependsOnGroupA",
                    "Groups": [
                        "GroupA"
                    ],
                    "IsRequired": true
                }
            ]
        },
        "Report": {
            "Type": "Report",
            "Next": "Succeed",
            "Catch": [
                {
                    "ErrorEquals": [
                        "ReportError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "Succeed": {
            "Type": "Succeed"
        },
        "Fail": {
            "Type": "Fail"
        }
    }
}
```

### 상태 머신 예제: 두 테스트 그룹을 병렬로 실행
<a name="run-in-parallel"></a>

이 상태 머신:
+ `GroupA`및 `GroupB` 테스트 그룹을 병렬로 실행합니다. 브랜치 상태 머신의 `RunTask` 상태에 의해 컨텍스트에 저장된 `ResultVar` 변수는 `AddProductFeatures` 상태에서 사용할 수 있습니다.
+ 실행 오류가 있는지 확인하고 오류가 있는 경우, `Fail`로 전환합니다. 이 상태 머신은 `Catch` 블록을 사용하지 않습니다. 해당 메서드는 브랜치 상태 머신의 실행 오류를 감지하지 못하기 때문입니다.
+ 통과한 그룹을 기반으로 `awsiotdevicetester_report.xml` 파일에 기능을 추가합니다.
  + `GroupA`가 통과하면 기능이 `supported`로 설정됩니다.
  + 이 기능은 보고서에서 선택 사항으로 표시되어 있지 않습니다.
+ 보고서를 생성하고 오류가 없는 경우 `Succeed`로 전환하고 그렇지 않으면 `Fail`로 전환합니다.

디바이스 풀에 두 개의 디바이스가 구성된 경우 `GroupA` 및 `GroupB` 둘 다 동시에 실행할 수 있습니다. 그러나 `GroupA` 또는 `GroupB` 둘 중 하나에 여러 테스트가 포함된 경우에는 두 디바이스 모두 해당 테스트에 할당될 수 있습니다. 디바이스가 하나만 구성된 경우 테스트 그룹은 순차적으로 실행됩니다.

```
{
    "Comment": "Runs GroupA and GroupB in parallel",
    "StartAt": "RunGroupAAndB",
    "States": {
        "RunGroupAAndB": {
            "Type": "Parallel",
            "Next": "CheckForErrors",
            "Branches": [
                {
                    "Comment": "Run GroupA state machine",
                    "StartAt": "RunGroupA",
                    "States": {
                        "RunGroupA": {
                            "Type": "RunTask",
                            "Next": "Succeed",
                            "TestGroup": "GroupA",
                            "ResultVar": "GroupA_passed",
                            "Catch": [
                                {
                                    "ErrorEquals": [
                                        "RunTaskError"
                                    ],
                                    "Next": "Fail"
                                }
                            ]
                        },
                        "Succeed": {
                            "Type": "Succeed"
                        },
                        "Fail": {
                            "Type": "Fail"
                        }
                    }
                },
                {
                    "Comment": "Run GroupB state machine",
                    "StartAt": "RunGroupB",
                    "States": {
                        "RunGroupA": {
                            "Type": "RunTask",
                            "Next": "Succeed",
                            "TestGroup": "GroupB",
                            "ResultVar": "GroupB_passed",
                            "Catch": [
                                {
                                    "ErrorEquals": [
                                        "RunTaskError"
                                    ],
                                    "Next": "Fail"
                                }
                            ]
                        },
                        "Succeed": {
                            "Type": "Succeed"
                        },
                        "Fail": {
                            "Type": "Fail"
                        }
                    }
                }
            ]
        },
        "CheckForErrors": {
            "Type": "Choice",
            "Default": "AddProductFeatures",
            "FallthroughOnError": true,
            "Choices": [
                {
                    "Expression": "{{$.hasExecutionErrors}} == true",
                    "Next": "Fail"
                }
            ]
        },
        "AddProductFeatures": {
            "Type": "AddProductFeatures",
            "Next": "Report",
            "Features": [
                {
                    "Feature": "FeatureThatDependsOnGroupA",
                    "Groups": [
                        "GroupA"
                    ],
                    "IsRequired": true
                },
                {
                    "Feature": "FeatureThatDependsOnGroupB",
                    "Groups": [
                        "GroupB"
                    ],
                    "IsRequired": true
                }
            ]
        },
        "Report": {
            "Type": "Report",
            "Next": "Succeed",
            "Catch": [
                {
                    "ErrorEquals": [
                        "ReportError"
                    ],
                    "Next": "Fail"
                }
            ]
        },
        "Succeed": {
            "Type": "Succeed"
        },
        "Fail": {
            "Type": "Fail"
        }
    }
}
```

# IDT 테스트 사례 실행 파일 생성
<a name="test-executables"></a>

다음과 같은 방법으로 테스트 제품군 폴더에 테스트 사례 실행 파일을 생성하고 배치할 수 있습니다.
+ `test.json` 파일의 인수 또는 환경 변수를 사용하여 실행할 테스트를 결정하는 테스트 제품군의 경우, 전체 테스트 제품군에 대해 단일 테스트 사례 실행 파일을 생성하거나 테스트 제품군의 각 테스트 그룹에 대해 테스트 실행 파일을 생성할 수 있습니다.
+ 지정된 명령을 기반으로 특정 테스트를 실행하려는 테스트 세트의 경우, 테스트 세트의 각 테스트 사례에 대해 테스트 사례 실행 파일을 하나씩 만듭니다.

테스트 작성자는 사용 사례에 적합한 접근 방식을 결정하고 그에 따라 테스트 사례 실행 파일을 구성할 수 있습니다. 각 `test.json` 파일에 올바른 테스트 케이스 실행 파일 경로를 제공하고 지정된 실행 파일이 올바르게 실행되는지 확인합니다.

모든 디바이스에서 테스트 케이스를 실행할 준비가 되면 IDT는 다음 파일을 읽습니다.
+ 선택한 테스트 사례에 대한 `test.json`에 따라 시작할 프로세스와 설정할 환경 변수가 결정됩니다.
+ 테스트 제품군용 `suite.json`에 따라 설정할 환경 변수가 결정됩니다.

IDT는 `test.json` 파일에 지정된 명령과 인수를 기반으로 필수 테스트 실행 파일 프로세스를 시작하고 필요한 환경 변수를 프로세스에 전달합니다.

## IDT 클라이언트 SDK 사용
<a name="idt-client-sdk"></a>

IDT 클라이언트 SDK를 사용하면 IDT 및 테스트 대상 디바이스와 상호 작용하는 데 사용할 수 있는 API 명령을 사용하여 테스트 실행 파일에 테스트 로직을 작성하는 방법을 간소화할 수 있습니다. IDT는 현재 다음과 같은 SDK를 제공합니다.
+ Python용 IDT 클라이언트 SDK
+ Go용 IDT 클라이언트 SDK
+ Java용 IDT 클라이언트 SDK

이러한 SDK는 `<device-tester-extract-location>/sdks` 폴더에 있습니다. 새 테스트 케이스 실행 파일을 만들 때는 사용할 SDK를 테스트 케이스 실행 파일이 들어 있는 폴더에 복사하고 코드에서 SDK를 참조해야 합니다. 이 섹션에서는 테스트 케이스 실행 파일에서 사용할 수 있는 사용 가능한 API 명령에 대한 간략한 설명을 제공합니다.

**Topics**
+ [

### 디바이스 상호작용
](#api-device-interaction)
+ [

### IDT 상호 작용
](#api-idt-interaction)
+ [

### 호스트 상호작용
](#api-host-interaction)

### 디바이스 상호작용
<a name="api-device-interaction"></a>

다음 명령을 사용하면 추가 디바이스 상호 작용 및 연결 관리 기능을 구현하지 않고도 테스트 중인 디바이스와 통신할 수 있습니다.

**`ExecuteOnDevice`**  
테스트 세트가 SSH 또는 Docker 셸 연결을 지원하는 디바이스에서 셸 명령을 실행할 수 있습니다.

**`CopyToDevice`**  
테스트 세트가 IDT를 실행하는 호스트 컴퓨터의 로컬 파일을 SSH 또는 Docker 셸 연결을 지원하는 디바이스의 지정된 위치로 복사할 수 있습니다.

**`ReadFromDevice`**  
테스트 세트가 UART 연결을 지원하는 디바이스의 직렬 포트에서 읽을 수 있도록 허용합니다.

**참고**  
IDT는 컨텍스트의 디바이스 액세스 정보를 사용하여 만든 디바이스에 대한 직접 연결을 관리하지 않으므로 테스트 사례 실행 파일에서 이러한 디바이스 상호 작용 API 명령을 사용하는 것이 좋습니다. 하지만 이러한 명령이 테스트 사례 요구 사항을 충족하지 않는 경우, IDT 컨텍스트에서 디바이스 액세스 정보를 검색하고 이를 사용하여 테스트 세트에서 디바이스에 직접 연결할 수 있습니다.  
직접 연결하려면 테스트 중인 디바이스와 리소스 디바이스에 대해 각각 `device.connectivity` 및 `resource.devices.connectivity` 필드에서 정보를 검색합니다. IDT 컨텍스트 사용에 관한 자세한 내용은 [IDT 컨텍스트 사용](idt-context.md) 섹션을 참조합니다.

### IDT 상호 작용
<a name="api-idt-interaction"></a>

다음 명령을 사용하면 테스트 세트가 IDT와 통신할 수 있습니다.

**`PollForNotifications`**  
테스트 세트에서 IDT의 알림을 확인할 수 있습니다.

**`GetContextValue ` 및 `GetContextString`**  
테스트 세트가 IDT 컨텍스트에서 값을 검색할 수 있도록 합니다. 자세한 내용은 [IDT 컨텍스트 사용](idt-context.md) 단원을 참조하십시오.

**`SendResult`**  
테스트 세트에서 테스트 사례 결과를 IDT에 보고할 수 있습니다. 이 명령은 테스트 세트의 각 테스트 케이스 끝에서 직접적으로 호출해야 합니다.

### 호스트 상호작용
<a name="api-host-interaction"></a>

다음 명령을 사용하면 테스트 세트가 호스트 머신과 통신할 수 있습니다.

**`PollForNotifications`**  
테스트 세트에서 IDT의 알림을 확인할 수 있습니다.

**`GetContextValue` 및 `GetContextString`**  
테스트 세트가 IDT 컨텍스트에서 값을 검색할 수 있도록 합니다. 자세한 내용은 [IDT 컨텍스트 사용](idt-context.md) 단원을 참조하십시오.

**`ExecuteOnHost`**  
테스트 세트가 로컬 머신에서 명령을 실행할 수 있도록 하고 IDT가 테스트 케이스 실행 수명 주기를 관리할 수 있도록 합니다.

## IDT CLI 명령을 활성화합니다.
<a name="idt-cli-coop"></a>

`run-suite` 명령 IDT CLI는 테스트 실행기가 테스트 실행을 사용자 지정할 수 있는 몇 가지 옵션을 제공합니다. 테스트 실행기가 이러한 옵션을 사용하여 사용자 지정 테스트 세트를 실행할 수 있도록 하려면 IDT CLI에 대한 지원을 구현해야 합니다. 지원을 구현하지 않는 경우, 테스트 실행기는 여전히 테스트를 실행할 수 있지만 일부 CLI 옵션은 제대로 작동하지 않습니다. 이상적인 고객 경험을 제공하려면 IDT CLI에서 `run-suite` 명령에 대한 다음 인수에 대한 지원을 구현하는 것이 좋습니다.

**`timeout-multiplier`**  
테스트를 실행하는 동안 모든 제한 시간에 적용할 1.0보다 큰 값을 지정합니다.  
테스트 실행기는 이 인수를 사용하여 실행하려는 테스트 사례의 제한 시간을 늘릴 수 있습니다. 테스트 실행기가 `run-suite` 명령에서 이 인수를 지정하면 IDT는 이 인수를 사용하여 IDT\$1TEST\$1TIMEOUT 환경 변수의 값을 계산하고 IDT 컨텍스트에서 `config.timeoutMultiplier` 필드를 설정합니다. 이 인수를 뒷받침하려면 다음을 수행하여야 합니다.  
+ `test.json` 파일의 제한 시간 값을 직접 사용하는 대신 IDT\$1TEST\$1TIMEOUT 환경 변수를 읽고 올바르게 계산된 제한 시간 값을 구합니다.
+ IDT 컨텍스트에서 `config.timeoutMultiplier` 값을 검색하여 장기 실행 제한 시간에 적용합니다.
제한 시간 이벤트로 인한 조기 종료에 대한 자세한 내용은 [종료 동작 지정](#test-exec-exiting)을(를) 참조하세요.

**`stop-on-first-failure`**  
장애가 발생할 경우, IDT에서 모든 테스트 실행을 중지하도록 지정합니다.  
테스트 실행기가 `run-suite` 명령에 이 인수를 지정하면 IDT는 장애가 발생하는 즉시 테스트 실행을 중단합니다. 그러나 테스트 케이스가 병렬로 실행되는 경우, 예상치 못한 결과가 발생할 수 있습니다. 지원을 구현하려면 IDT에서 이 이벤트가 발생할 경우, 테스트 로직에서 실행 중인 모든 테스트 사례를 중지하고, 임시 리소스를 정리하고, 테스트 결과를 IDT에 보고하도록 지시해야 합니다. 실패 시 조기 종료에 대한 자세한 내용은 [종료 동작 지정](#test-exec-exiting) 섹션을 참조하세요.

**`group-id` 및 `test-id`**  
IDT가 선택한 테스트 그룹 또는 테스트 케이스만 실행하도록 지정합니다.  
테스트 실행기는 `run-suite` 명령과 함께 이러한 인수를 사용하여 다음과 같은 테스트 실행 동작을 지정할 수 있습니다.  
+ 지정된 테스트 제품군에 있는 모든 테스트 그룹을 실행합니다.
+ 지정된 테스트 그룹 내에서 엄선된 테스트를 실행합니다.
이러한 인수를 지원하려면 테스트 세트의 상태 머신이 상태 머신의 특정 `RunTask` 및 `Choice` 상태 세트를 포함해야 합니다. 사용자 지정 상태 머신을 사용하지 않는 경우, 기본 IDT 상태 머신에 필요한 상태가 포함되므로 추가 조치를 취할 필요가 없습니다. 하지만 사용자 지정 상태 머신을 사용하는 경우에는 [상태 머신 예제: 사용자가 선택한 테스트 그룹 실행](idt-state-machine.md#allow-specific-groups)을(를) 샘플로 사용하여 상태 머신에 필요한 상태를 추가합니다.

IDT CLI 명령에 대한 자세한 내용은 [사용자 지정 테스트 제품군 디버그 및 실행](run-tests-custom.md) 단원을 참조합니다.

## 이벤트 로그 작성
<a name="test-exec-logs"></a>

테스트가 실행되는 동안 `stdout` 및 `stderr`에 데이터를 보내 콘솔에 이벤트 로그와 오류 메시지를 기록합니다. 콘솔 메시지의 형식에 대한 자세한 정보는 [콘솔 메시지 형식](idt-review-results-logs.md#idt-console-format)에서 확인하세요.

IDT가 테스트 세트 실행을 마치면 `<devicetester-extract-location>/results/<execution-id>/logs` 폴더에 있는 `test_manager.log` 파일에서도 이 정보를 확인할 수 있습니다.

테스트 대상 디바이스의 로그를 포함하여 테스트 실행의 로그를 `<device-tester-extract-location>/results/execution-id/logs` 폴더에 있는 `<group-id>_<test-id>` 파일에 기록하도록 각 테스트 사례를 구성할 수 있습니다. 이렇게 하려면 `testData.logFilePath` 쿼리를 사용하여 IDT 컨텍스트에서 로그 파일의 경로를 검색하고 해당 경로에 파일을 만든 다음 원하는 콘텐츠를 작성해야 합니다. IDT는 실행 중인 테스트 케이스를 기반으로 경로를 자동으로 업데이트합니다. 테스트 사례에 대한 로그 파일을 만들지 않기로 선택하면 해당 테스트 사례에 대한 파일이 생성되지 않습니다.

필요에 따라 `<device-tester-extract-location>/logs` 폴더에 추가 로그 파일을 생성하도록 텍스트 실행 파일을 설정할 수도 있습니다. 파일을 덮어쓰지 않도록 로그 파일 이름에 고유한 접두사를 지정하는 것이 좋습니다.

## 결과를 IDT에 보고합니다.
<a name="test-exec-results"></a>

IDT는 테스트 결과를 `awsiotdevicetester_report.xml` 및 `suite-name_report.xml` 파일에 기록합니다. 이 보고서 파일은 `<device-tester-extract-location>/results/<execution-id>/`에 위치합니다. 두 보고서 모두 테스트 세트의 실행 결과를 캡처합니다. IDT에서 이러한 보고서에 사용하는 스키마에 대한 자세한 내용은 [IDT 테스트 결과 및 로그 검토](idt-review-results-logs.md)을(를) 참조합니다.

`suite-name_report.xml` 파일 내용을 채우려면 테스트 실행이 완료되기 전에 `SendResult` 명령을 사용하여 테스트 결과를 IDT에 보고해야 합니다. IDT에서 테스트 결과를 찾을 수 없는 경우, 테스트 사례에 오류가 발생합니다. 다음 Python 발췌문은 테스트 결과를 IDT로 보내는 명령을 보여줍니다.

```
request-variable = SendResultRequest(TestResult(result))
client.send_result(request-variable)
```

API를 통해 결과를 보고하지 않는 경우, IDT는 테스트 아티팩트 폴더에서 테스트 결과를 찾습니다. 이 폴더의 경로는 IDT 컨텍스트의 `testData.testArtifactsPath` 파일에 저장됩니다. 이 폴더에서 IDT는 찾은 첫 번째 알파벳순으로 정렬된 XML 파일을 테스트 결과로 사용합니다.

테스트 로직이 JUnit XML 결과를 생성하는 경우, 결과를 파싱한 다음 API를 사용하여 IDT에 제출하는 대신 아티팩트 폴더의 XML 파일에 테스트 결과를 기록하여 결과를 IDT에 직접 제공할 수 있습니다.

이 방법을 사용하는 경우, 테스트 로직이 테스트 결과를 정확하게 요약하고 결과 파일의 형식을 `suite-name_report.xml` 파일과 동일한 형식으로 지정해야 합니다. IDT는 제공된 데이터에 대한 검증을 수행하지 않습니다. 단, 다음과 같은 경우는 예외입니다.
+ IDT는 `testsuites` 태그의 모든 속성을 무시합니다. 대신 보고된 다른 테스트 그룹 결과에서 태그 속성을 계산합니다.
+ 하나 이상의 `testsuite` 태그가 `testsuites` 내에 있어야 합니다.

IDT는 모든 테스트 사례에 동일한 아티팩트 폴더를 사용하고 테스트 실행 사이에 결과 파일을 삭제하지 않기 때문에 IDT에서 잘못된 파일을 읽을 경우, 이 방법을 사용하면 잘못된 보고가 발생할 수도 있습니다. 생성된 XML 결과 파일은 모든 테스트 사례에서 동일한 이름을 사용하여 각 테스트 사례의 결과를 덮어쓰고 IDT에서 사용할 수 있는 올바른 결과가 있는지 확인하는 것이 좋습니다. 테스트 세트의 보고에는 혼합된 접근 방식을 사용할 수 있습니다. 즉, 일부 테스트 사례에는 XML 결과 파일을 사용하고 다른 테스트 사례에는 API를 통해 결과를 제출하는 등 혼합된 접근 방식을 사용할 수 있지만 이 방법은 권장되지 않습니다.

## 종료 동작 지정
<a name="test-exec-exiting"></a>

테스트 케이스에서 실패 또는 오류 결과가 보고되더라도 텍스트 실행 파일이 항상 종료 코드 0으로 종료되도록 구성합니다. 0이 아닌 종료 코드는 테스트 케이스가 실행되지 않았음을 나타내거나 테스트 케이스 실행 파일이 IDT에 결과를 전달할 수 없는 경우에만 사용합니다. IDT가 0이 아닌 종료 코드를 받으면 테스트 케이스에 오류가 발생하여 테스트 케이스를 실행할 수 없게 된 것으로 표시합니다.

IDT는 다음 이벤트에서 테스트 케이스가 완료되기 전에 테스트 케이스의 실행을 중단하도록 요청하거나 예상할 수 있습니다. 이 정보를 사용하여 테스트 케이스에서 이러한 각 이벤트를 감지하도록 테스트 케이스 실행 파일을 구성합니다.

****제한 시간****  
테스트 케이스가 `test.json` 파일에 지정된 제한 시간 값보다 오래 실행될 때 발생합니다. 테스트 실행기가 `timeout-multiplier` 인수를 사용하여 제한 시간 승수를 지정한 경우, IDT는 승수로 제한 시간 값을 계산합니다.  
이 이벤트를 탐지하려면 IDT\$1TEST\$1TIMEOUT 환경 변수를 사용합니다. 테스트 실행기가 테스트를 시작하면 IDT는 IDT\$1TEST\$1TIMEOUT 환경 변수의 값을 계산된 제한 시간 값(초)으로 설정하고 변수를 테스트 케이스 실행 파일로 전달합니다. 변수 값을 읽어 적절한 타이머를 설정할 수 있습니다.

****인터럽트****  
테스트 러너가 IDT를 인터럽트할 때 발생합니다. 예를 들어, Ctrl\$1C 키를 누르면 됩니다.  
터미널은 신호를 모든 하위 프로세스에 전파하므로 인터럽트 신호를 감지하도록 테스트 케이스에 신호 처리기를 구성하기만 하면 됩니다.  
또는 정기적으로 API를 폴링하여 `PollForNotifications` API 응답의 `CancellationRequested` 부울 값을 확인할 수도 있습니다. IDT는 인터럽트 신호를 수신하면 `CancellationRequested` 부울 값을 `true`(으)로 설정합니다.

****첫 번째 실패 시 중지****  
현재 테스트 케이스와 병렬로 실행 중인 테스트 케이스가 실패하고 테스트 실행기가 `stop-on-first-failure` 인수를 사용하여 IDT에 오류가 발생할 경우, 중지하도록 지정하는 경우, 발생합니다.  
이 이벤트를 탐지하기 위해 주기적으로 API를 폴링하여 `PollForNotifications` API 응답의 `CancellationRequested` 부울 값을 확인할 수 있습니다. IDT에서 장애가 발생하고 첫 번째 실패 시 중지되도록 구성된 경우, IDT는 `CancellationRequested` 부울 값을 `true`(으)로 설정합니다.

이러한 이벤트가 발생하면 IDT는 현재 실행 중인 테스트 케이스의 실행이 완료될 때까지 5분 동안 기다립니다. 실행 중인 모든 테스트 케이스가 5분 내에 종료되지 않으면 IDT는 각 프로세스를 강제로 중지합니다. 프로세스가 종료되기 전에 IDT에서 테스트 결과를 받지 못한 경우, 테스트 케이스가 제한 시간이 초과된 것으로 표시됩니다. 가장 좋은 방법은 테스트 케이스에서 이벤트 중 하나가 발생할 때 다음 작업을 수행하도록 하는 것입니다.

1. 일반 테스트 로직 실행을 중단합니다.

1. 테스트 대상 디바이스의 테스트 아티팩트와 같은 임시 리소스를 모두 정리합니다.

1. 테스트 실패 또는 오류와 같은 테스트 결과를 IDT에 보고합니다.

1. 종료합니다.

# IDT 컨텍스트 사용
<a name="idt-context"></a>

IDT가 테스트 도구 모음을 실행할 때, 테스트 도구 모음은 각 테스트 실행 방식을 결정하는 데 사용할 수 있는 데이터 세트에 액세스할 수 있습니다. 이 데이터를 IDT 컨텍스트라고 합니다. 예를 들어 테스트 러너가 `userdata.json` 파일로 제공한 사용자 데이터 구성은 IDT 컨텍스트의 테스트 도구 모음에서 사용할 수 있도록 만들어졌습니다.

IDT 컨텍스트는 읽기 전용 JSON 문서로 간주할 수 있습니다. 테스트 도구 모음은 객체, 배열, 숫자 등과 같은 표준 JSON 데이터 유형을 사용하여 컨텍스트에서 데이터를 검색하고, 컨텍스트에 데이터를 쓸 수 있습니다.

## 컨텍스트 스키마
<a name="idt-context-schema"></a>

IDT 컨텍스트는 다음 형식을 사용합니다.

```
{
    "config": {
        <config-json-content>
        "timeoutMultiplier": timeout-multiplier,
        "idtRootPath": <path/to/IDT/root>
    },
    "device": {
        <device-json-device-element>
    },
    "devicePool": {
        <device-json-pool-element>
    },
    "resource": {
        "devices": [
            {
                <resource-json-device-element>
                "name": "<resource-name>"
            }
        ]
    },
    "testData": {
        "awsCredentials": {
            "awsAccessKeyId": "<access-key-id>",
            "awsSecretAccessKey": "<secret-access-key>",
            "awsSessionToken": "<session-token>"
        },
        "logFilePath": "/path/to/log/file"
    },
    "userData": {
        <userdata-json-content>
    }
}
```

**`config`**  
[`config.json` 파일](set-config-custom.md#config-json-custom)의 정보입니다. `config` 필드에는 다음과 같은 추가 필드도 포함됩니다.    
**`config.timeoutMultiplier`**  
테스트 제품군에서 사용하는 모든 시간 제한 값의 승수입니다. 이 값은 IDT CLI에서 테스트 러너에 의해 지정됩니다. 기본값은 `1`입니다.  
**`config.idRootPath`**  
이 값은 `userdata.json` 파일을 구성하는 동안 IDT의 절대 경로 값을 나타내는 자리 표시자입니다. 빌드 및 플래시 명령에서 사용됩니다.

**`device`**  
테스트 실행을 위해 선택한 디바이스에 대한 정보입니다. 이 정보는 선택한 디바이스의 [`device.json` 파일](set-config-custom.md#device-config-custom)에 있는 `devices` 배열 요소와 동일합니다.

**`devicePool`**  
테스트 실행을 위해 선택한 디바이스 풀에 대한 정보. 이 정보는 선택한 디바이스 풀에 대해 `device.json` 파일에 정의된 최상위 디바이스 풀 배열 요소와 동일합니다.

**`resource`**  
`resource.json` 파일의 리소스 디바이스에 대한 정보.    
**`resource.devices`**  
이 정보는 `resource.json` 파일에 정의된 `devices` 배열과 동일합니다. 각 `devices` 요소에는 다음과 같은 추가 필드가 포함됩니다.    
**`resource.device.name`**  
리소스 디바이스의 이름입니다. 이 값은 `test.json` 파일의 `requiredResource.name` 값으로 설정됩니다.

**`testData.awsCredentials`**  
테스트에서 클라우드에 연결하는 데 사용하는 AWS 자격 증명입니다 AWS . 이 정보는 `config.json` 파일에서 가져옵니다.

**`testData.logFilePath`**  
테스트 사례가 로그 메시지를 기록하는 로그 파일의 경로입니다. 이 파일이 존재하지 않는 경우 테스트 도구 모음에서 해당 파일을 생성합니다.

**`userData`**  
테스트 러너가 [`userdata.json` 파일](set-config-custom.md#userdata-config-custom)에서 제공한 정보.

## 컨텍스트에서 데이터 액세스
<a name="accessing-context-data"></a>

`GetContextValue` 및 `GetContextString` API를 사용하여 구성 파일 및 텍스트 실행 파일에서 JSONPath 표기법을 사용해 컨텍스트를 쿼리할 수 있습니다. IDT 컨텍스트에 액세스하기 위한 JSONPath 문자열의 구문은 다음과 같이 다양합니다.
+ `suite.json`와(과) `test.json`에서는 `{{query}}`을(를) 사용합니다. 즉, 루트 요소 `$.`을(를) 사용하여 표현식을 시작하지 마십시오.
+ `statemachine.json`에서는 `{{$.query}}`을(를) 사용합니다.
+ API 명령에서는 명령에 따라 `query` 또는 `{{$.query}}`을(를) 사용합니다. 자세한 내용을 알아보려면 SDK에서 인라인 설명서를 참조하세요.

다음 표에서는 일반적인 foobar JSONPath 표현식의 연산자를 설명합니다.


| 연산자  | 설명  | 
| --- | --- | 
| \$1 | 루트 요소. IDT의 최상위 컨텍스트 값은 객체이므로 일반적으로 \$1.를 사용하여 쿼리를 시작합니다. | 
| .childName | 객체의 이름 childName을 사용하여 하위 요소에 액세스합니다. 배열에 적용하면 이 연산자가 각 요소에 적용된 새 배열이 생성됩니다. 요소 이름은 대/소문자를 구분합니다. 예를 들어, config 객체의 awsRegion 값에 액세스하기 위한 쿼리는 \$1.config.awsRegion입니다. | 
| [start:end] | 배열에서 요소를 필터링하여 start 인덱스부터 end 인덱스까지의 항목을 검색합니다. | 
| [index1, index2, ... , indexN] | 배열에서 요소를 필터링하여 지정된 인덱스에서만 항목을 검색합니다. | 
| [?(expr)] | expr 표현식을 사용하여 배열에서 요소를 필터링합니다. 이 표현식은 부울 값으로 평가되어야 합니다. | 

필터 표현식을 생성하려면 다음 구문을 사용합니다.

```
<jsonpath> | <value> operator <jsonpath> | <value> 
```

이 구문에서: 
+ `jsonpath`은(는) 표준 JSON 구문을 사용하는 JSONPath입니다.
+ `value`은(는) 표준 JSON 구문을 사용하는 모든 사용자 지정 값입니다.
+ `operator`는 다음 작업 중 하나를 호출합니다.
  + `<` (미만)
  + `<=` (이하)
  + `==` (같음)

    표현식의 JSONPath 또는 값이 배열, 부울 또는 객체 값인 경우 이것이 사용할 수 있는 유일하게 지원되는 바이너리 연산자입니다.
  + `>=` (이상)
  + `>` (초과)
  + `=~`(정규 표현식 일치). 필터 표현식에서 이 연산자를 사용하려면 표현식 왼쪽의 JSONPath 또는 값이 문자열로 평가되어야 하고, 오른쪽은 [RE2 구문](https://github.com/google/re2/wiki/Syntax)을 따르는 패턴 값이어야 합니다.

\$1\$1*query*\$1\$1 형식의 JSONPath 쿼리를 `test.json` 파일의 `args` 및 `environmentVariables` 필드, `suite.json` 파일의 `environmentVariables` 필드 내에서 자리 표시자 문자열로 사용할 수 있습니다. IDT는 컨텍스트 조회를 수행하고 쿼리의 평가된 값으로 필드를 채웁니다. 예를 들어 `suite.json` 파일에서 자리 표시자 문자열을 사용하여 각 테스트 사례에 따라 변경되는 환경 변수 값을 지정할 수 있으며, IDT는 환경 변수를 각 테스트 사례에 맞는 값으로 채웁니다. 하지만 `test.json` 및 `suite.json` 파일에서 자리 표시자 문자열을 사용하는 경우 쿼리에 다음 사항을 고려해야 합니다.
+ 쿼리에서 나타나는 `devicePool` 키는 모두 소문자로 입력해야 합니다. 즉, `devicepool`을(를) 대신 사용하십시오.
+ 배열의 경우 문자열 배열만 사용할 수 있습니다. 또한 배열은 비표준 `item1, item2,...,itemN` 형식을 사용합니다. 배열에 요소가 하나만 포함된 경우 이 배열은 `item`(으)로 직렬화되어 문자열 필드와 구분할 수 없게 됩니다.
+ 자리 표시자를 사용하여 컨텍스트에서 객체를 검색할 수 없습니다.

이러한 고려 사항 때문에 가능하면 `test.json` 및 `suite.json` 파일의 자리 표시자 문자열 대신 API를 사용하여 테스트 로직의 컨텍스트에 액세스하는 것이 좋습니다. 하지만 경우에 따라 JSONPath 자리 표시자를 사용하여 단일 문자열을 가져와서 환경 변수로 설정하는 것이 더 편리할 수 있습니다.

# 테스트 실행기 설정 구성
<a name="set-config-custom"></a>

사용자 지정 테스트 제품군을 실행하려면 테스트 실행기가 실행하려는 테스트 제품군을 기반으로 설정을 구성해야 합니다. 설정은 `<device-tester-extract-location>/configs/` 폴더에 있는 구성 파일 템플릿을 기반으로 지정됩니다. 필요한 경우 테스트 실행기는 IDT가 AWS 클라우드에 연결하는 데 사용할 AWS 자격 증명도 설정해야 합니다.

테스트 작성자는 [테스트 도구 모음을 디버깅](run-tests-custom.md)하도록 이러한 파일을 구성해야 합니다. 테스트 러너가 테스트 도구 모음을 실행하는 데 필요한 대로 다음 설정을 구성할 수 있도록 지침을 제공해야 합니다.

## device.json 구성
<a name="device-config-custom"></a>

`device.json` 파일은 테스트가 실행되는 디바이스에 대한 정보가 필요합니다(예: IP 주소, 로그인 정보, 운영 체제, CPU 아키텍처).

테스트 러너는 `<device-tester-extract-location>/configs/` 폴더에 있는 다음 템플릿 `device.json` 파일을 사용하여 이 정보를 제공할 수 있습니다. 

```
[
    {
        "id": "<pool-id>",
        "sku": "<pool-sku>",
        "features": [
            {
                "name": "<feature-name>",             
                "value": "<feature-value>",                
                "configs": [
                    {
                        "name": "<config-name>",                    
                        "value": "<config-value>"
                    }
                ],
            }
        ],     
        "devices": [
            {
                "id": "<device-id>",    
                "pairedResource": "<device-id>", //used for no-op protocol
                "connectivity": {
                    "protocol": "ssh | uart | docker | no-op",                   
                    // ssh
                    "ip": "<ip-address>",
                    "port": <port-number>,
                    "publicKeyPath": "<public-key-path>",
                    "auth": {
                        "method": "pki | password",
                        "credentials": {
                            "user": "<user-name>", 
                            // pki
                            "privKeyPath": "/path/to/private/key",
                                         
                            // password
                            "password": "<password>",
                        }
                    },
                    
                    // uart
                    "serialPort": "<serial-port>",
                    
                    // docker
                    "containerId": "<container-id>",
                    "containerUser": "<container-user-name>",
                }
            }
        ]
    }
]
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`id`**  
*디바이스 풀*이라고 하는 디바이스 모음을 고유하게 식별하는 사용자 정의 영숫자 ID입니다. 풀에 속한 디바이스의 하드웨어는 서로 동일해야 합니다. 테스트 제품군을 실행할 때 풀에 있는 디바이스는 워크로드를 병렬화하는 데 사용됩니다. 다양한 테스트를 실행하기 위해 여러 디바이스가 사용됩니다.

**`sku`**  
테스트 대상 디바이스를 고유하게 식별하는 영숫자 값입니다. SKU는 정규화된 장치를 추적하는 데 사용됩니다.  
 AWS Partner Device Catalog에 보드를 나열하려면 여기에서 지정하는 SKU가 나열 프로세스에서 사용하는 SKU와 일치해야 합니다.

**`features`**  
선택 사항. 디바이스의 지원되는 기능이 포함된 배열입니다. 디바이스 기능은 테스트 도구 모음에서 구성한 사용자 정의 값입니다. `device.json` 파일에 포함할 기능 이름 및 값에 대한 정보를 테스트 러너에게 제공해야 합니다. 예를 들어, 다른 디바이스의 MQTT 서버 역할을 하는 디바이스를 테스트하려는 경우 이름이 `MQTT_QoS`로 지정된 기능에 대해 지원되는 특정 수준을 검증하도록 테스트 로직을 구성할 수 있습니다. 테스트 실행기는 이 기능 이름을 제공하고 기능 값을 디바이스에서 지원하는 QoS 수준으로 설정합니다. 제공된 정보는 `devicePool.features` 쿼리를 사용하여 [IDT 컨텍스트](idt-context.md)에서 검색하거나 `pool.features` 쿼리를 사용하여 [상태 머신 컨텍스트](idt-state-machine.md#state-machine-context)에서 검색할 수 있습니다.    
**`features.name`**  
기능의 이름입니다.  
**`features.value`**  
지원되는 기능 값.  
**`features.configs`**  
필요한 경우 기능에 대한 구성 설정.    
**`features.config.name`**  
구성 설정의 이름입니다.  
**`features.config.value`**  
지원되는 설정값.

**`devices`**  
테스트할 풀의 디바이스 배열입니다. 최소 1개 이상의 디바이스가 필요합니다.    
**`devices.id`**  
테스트 대상 디바이스의 고유한 사용자 정의 식별자입니다.  
**`devices.pairedResource`**  
리소스 디바이스의 고유한 사용자 정의 식별자입니다. 이 값은 `no-op` 연결 프로토콜을 사용하여 디바이스를 테스트할 때 필요합니다.  
**`connectivity.protocol`**  
이러한 디바이스와 통신하는 데 사용되는 통신 프로토콜입니다. 풀의 각 디바이스는 동일한 프로토콜을 사용해야 합니다.  
현재 지원되는 값은 물리적 디바이스의 경우 `ssh` 및 `uart`, Docker 컨테이너의 경우 `docker`, IDT 호스트 시스템과 직접 연결되지 않지만 호스트 시스템과 통신하기 위해 물리적 미들웨어로 리소스 디바이스가 필요한 디바이스의 경우 `no-op`뿐입니다.  
비운영 디바이스의 경우 `devices.pairedResource`에서 리소스 디바이스 ID를 구성합니다. 또한 `resource.json` 파일에도 이 ID를 지정해야 합니다. 페어링된 디바이스는 테스트 대상 디바이스와 물리적으로 페어링된 디바이스여야 합니다. IDT가 페어링된 리소스 디바이스를 식별하여 연결한 후에는 `test.json` 파일에 설명된 기능에 따라 IDT가 다른 리소스 디바이스에 연결하지 않습니다.  
**`connectivity.ip`**  
테스트 대상 디바이스의 IP 입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
**`connectivity.port`**  
선택 사항. SSH 연결하는 데 사용하는 포트 번호입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
**`connectivity.publicKeyPath`**  
 선택 사항. 테스트 대상 디바이스에 대한 연결을 인증하는 데 사용되는 퍼블릭 키의 전체 경로입니다. `publicKeyPath`를 지정하면 IDT가 테스트 대상 디바이스에 SSH 연결을 설정할 때 디바이스의 퍼블릭 키를 검증합니다. 이 값을 지정하지 않으면 IDT는 SSH 연결을 생성하지만 디바이스의 퍼블릭 키를 확인하지는 않습니다.  
퍼블릭 키의 경로를 지정하고 안전한 방법을 사용하여 이 퍼블릭 키를 가져오는 것이 좋습니다. 표준 명령줄 기반 SSH 클라이언트의 경우 퍼블릭 키는 `known_hosts` 파일에 제공됩니다. 별도의 퍼블릭 키 파일을 지정하는 경우 이 파일은 `known_hosts` 파일과 동일한 형식, 즉, `ip-address key-type public-key`을 사용해야 합니다.  
**`connectivity.auth`**  
연결에 대한 인증 정보입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.    
**`connectivity.auth.method`**  
지정된 연결 프로토콜을 통해 디바이스에 액세스하는 데 사용되는 인증 방법입니다.  
지원되는 값은 다음과 같습니다.  
+ `pki`
+ `password`  
**`connectivity.auth.credentials`**  
인증에 사용되는 자격 증명입니다.    
**`connectivity.auth.credentials.password`**  
테스트 대상 디바이스에 로그인하기 위해 사용하는 암호입니다.  
이 값은 `connectivity.auth.method`가 `password`로 설정된 경우에만 적용됩니다.  
**`connectivity.auth.credentials.privKeyPath`**  
테스트 대상 디바이스에 로그인하는 데 사용하는 프라이빗 키의 전체 경로입니다.  
이 값은 `connectivity.auth.method`가 `pki`로 설정된 경우에만 적용됩니다.  
**`connectivity.auth.credentials.user`**  
테스트 대상 디바이스에 로그인하기 위한 사용자 이름입니다.  
**`connectivity.serialPort`**  
선택 사항. 디바이스가 연결된 직렬 포트입니다.  
이 속성은 `connectivity.protocol`이 `uart`로 설정된 경우에만 적용됩니다.  
**`connectivity.containerId`**  
테스트 대상 Docker 컨테이너의 컨테이너 ID 또는 이름입니다.  
이 속성은 `connectivity.protocol`이 `docker`로 설정된 경우에만 적용됩니다.  
**`connectivity.containerUser`**  
선택 사항. 컨테이너 내부 사용자의 사용자 이름입니다. 기본값은 Dockerfile에 제공된 사용자입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `docker`로 설정된 경우에만 적용됩니다.
테스트 러너가 테스트를 위해 잘못된 디바이스 연결을 구성했는지 확인하기 위해 상태 머신 컨텍스트에서 `pool.Devices[0].Connectivity.Protocol`을 검색하고 이를 `Choice` 상태에서 예상한 값과 비교할 수 있습니다. 잘못된 프로토콜이 사용된 경우 `LogMessage` 상태를 사용하여 메시지를 인쇄하고 `Fail` 상태로 전환하세요.  
또는 오류 처리 코드를 사용하여 잘못된 디바이스 유형에 대한 테스트 실패를 보고할 수 있습니다.

## (선택 사항) userdata.json 구성
<a name="userdata-config-custom"></a>

`userdata.json` 파일에는 테스트 도구 모음에 필요하지만 `device.json` 파일에 지정되지 않은 모든 추가 정보가 들어 있습니다. 이 파일의 형식은 테스트 도구 모음에 정의된 [`userdata_scheme.json` 파일](idt-json-config.md#userdata-schema-json)에 따라 달라집니다. 테스트 작성자인 경우, 이 정보를 작성한 테스트 도구 모음을 실행할 사용자에게 제공해야 합니다.

## (선택 사항) resource.json 구성
<a name="resource-config-custom"></a>

`resource.json` 파일에는 리소스 디바이스로 사용될 모든 디바이스에 대한 정보가 들어 있습니다. 리소스 디바이스는 테스트 대상 디바이스의 특정 기능을 테스트하는 데 필요한 디바이스입니다. 예를 들어 디바이스의 Bluetooth 기능을 테스트하려면 리소스 디바이스를 사용하여 디바이스가 제대로 연결될 수 있는지 테스트할 수 있습니다. 리소스 디바이스는 선택 사항이며 필요한 만큼 리소스 디바이스를 요청할 수 있습니다. 테스트 작성자는 [test.json 파일](idt-json-config.md#test-json)을 사용하여 테스트에 필요한 리소스 디바이스 기능을 정의합니다. 그런 다음 테스트 러너는 `resource.json` 파일을 사용하여 필수 기능을 갖춘 리소스 디바이스 풀을 제공합니다. 이 정보를 작성한 테스트 도구 모음을 실행할 사용자에게 제공해야 합니다.

테스트 러너는 `<device-tester-extract-location>/configs/` 폴더에 있는 다음 템플릿 `resource.json` 파일을 사용하여 이 정보를 제공할 수 있습니다. 

```
[
    {
        "id": "<pool-id>",
        "features": [
            {
                "name": "<feature-name>",             
                "version": "<feature-value>",                
                "jobSlots": <job-slots>
            }
        ],     
        "devices": [
            {
                "id": "<device-id>",              
                "connectivity": {
                    "protocol": "ssh | uart | docker",                   
                    // ssh
                    "ip": "<ip-address>",
                    "port": <port-number>,
                    "publicKeyPath": "<public-key-path>",
                    "auth": {
                        "method": "pki | password",
                        "credentials": {
                            "user": "<user-name>", 
                            // pki
                            "privKeyPath": "/path/to/private/key",
                                         
                            // password
                            "password": "<password>",
                        }
                    },
                    
                    // uart
                    "serialPort": "<serial-port>",
                    
                    // docker
                    "containerId": "<container-id>",
                    "containerUser": "<container-user-name>",
                }
            }
        ]
    }
]
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**`id`**  
*디바이스 풀*이라고 하는 디바이스 모음을 고유하게 식별하는 사용자 정의 영숫자 ID입니다. 풀에 속한 디바이스의 하드웨어는 서로 동일해야 합니다. 테스트 제품군을 실행할 때 풀에 있는 디바이스는 워크로드를 병렬화하는 데 사용됩니다. 다양한 테스트를 실행하기 위해 여러 디바이스가 사용됩니다.

**`features`**  
선택 사항. 디바이스의 지원되는 기능이 포함된 배열입니다. 이 필드에 필요한 정보는 테스트 도구 모음의 [test.json 파일](idt-json-config.md#test-json)에 정의되어 있으며, 실행할 테스트와 이 테스트를 실행하는 방법을 결정합니다. 테스트 도구 모음에 기능이 필요하지 않은 경우에는 이 필드가 필요하지 않습니다.    
**`features.name`**  
기능의 이름입니다.  
**`features.version`**  
기능 버전.  
**`features.jobSlots`**  
디바이스를 동시에 사용할 수 있는 테스트 수를 나타내는 설정입니다. 기본값은 `1`입니다.

**`devices`**  <a name="device-array"></a>
테스트할 풀의 디바이스 배열입니다. 최소 1개 이상의 디바이스가 필요합니다.    
**`devices.id`**  
테스트 대상 디바이스의 고유한 사용자 정의 식별자입니다.  
**`connectivity.protocol`**  
이러한 디바이스와 통신하는 데 사용되는 통신 프로토콜입니다. 풀의 각 디바이스는 동일한 프로토콜을 사용해야 합니다.  
현재 지원되는 값은 `uart` 물리적 디바이스의 경우 및, `docker` Docker 컨테이너의 경우 `ssh` 입니다.  
**`connectivity.ip`**  
테스트 대상 디바이스의 IP 입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
**`connectivity.port`**  
선택 사항. SSH 연결하는 데 사용하는 포트 번호입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
**`connectivity.publicKeyPath`**  
 선택 사항. 테스트 대상 디바이스에 대한 연결을 인증하는 데 사용되는 퍼블릭 키의 전체 경로입니다. `publicKeyPath`를 지정하면 IDT가 테스트 대상 디바이스에 SSH 연결을 설정할 때 디바이스의 퍼블릭 키를 검증합니다. 이 값을 지정하지 않으면 IDT는 SSH 연결을 생성하지만 디바이스의 퍼블릭 키를 확인하지는 않습니다.  
퍼블릭 키의 경로를 지정하고 안전한 방법을 사용하여 이 퍼블릭 키를 가져오는 것이 좋습니다. 표준 명령줄 기반 SSH 클라이언트의 경우 퍼블릭 키는 `known_hosts` 파일에 제공됩니다. 별도의 퍼블릭 키 파일을 지정하는 경우 이 파일은 `known_hosts` 파일과 동일한 형식, 즉, `ip-address key-type public-key`을 사용해야 합니다.  
**`connectivity.auth`**  
연결에 대한 인증 정보입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.    
**`connectivity.auth.method`**  
지정된 연결 프로토콜을 통해 디바이스에 액세스하는 데 사용되는 인증 방법입니다.  
지원되는 값은 다음과 같습니다.  
+ `pki`
+ `password`  
**`connectivity.auth.credentials`**  
인증에 사용되는 자격 증명입니다.    
**`connectivity.auth.credentials.password`**  
테스트 대상 디바이스에 로그인하기 위해 사용하는 암호입니다.  
이 값은 `connectivity.auth.method`가 `password`로 설정된 경우에만 적용됩니다.  
**`connectivity.auth.credentials.privKeyPath`**  
테스트 대상 디바이스에 로그인하는 데 사용하는 프라이빗 키의 전체 경로입니다.  
이 값은 `connectivity.auth.method`가 `pki`로 설정된 경우에만 적용됩니다.  
**`connectivity.auth.credentials.user`**  
테스트 대상 디바이스에 로그인하기 위한 사용자 이름입니다.  
**`connectivity.serialPort`**  
선택 사항. 디바이스가 연결된 직렬 포트입니다.  
이 속성은 `connectivity.protocol`이 `uart`로 설정된 경우에만 적용됩니다.  
**`connectivity.containerId`**  
테스트 대상 Docker 컨테이너의 컨테이너 ID 또는 이름입니다.  
이 속성은 `connectivity.protocol`이 `docker`로 설정된 경우에만 적용됩니다.  
**`connectivity.containerUser`**  
선택 사항. 컨테이너 내부 사용자의 사용자 이름입니다. 기본값은 Dockerfile에 제공된 사용자입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `docker`로 설정된 경우에만 적용됩니다.

## (선택 사항) config.json 구성
<a name="config-json-custom"></a>

`config.json` 파일 형식의 IDT용 구성 정보가 들어 있습니다. 일반적으로 테스트 실행기는 IDT 및 선택적으로 AWS 리전에 대한 AWS 사용자 자격 증명을 제공하는 경우를 제외하고이 파일을 수정할 필요가 없습니다. 필요한 권한이 있는 자격 증명이 제공되면 AWS 가 사용량 지표를 AWS IoT Device Tester 수집하여에 제출합니다 AWS. 이는 옵트인 기능이며 IDT 기능을 개선하는 데 사용됩니다. 자세한 내용은 [IDT 사용량 지표 제출](idt-usage-metrics.md) 단원을 참조하십시오.

테스트 실행기는 다음 방법 중 하나로 자격 AWS 증명을 구성할 수 있습니다.
+ **보안 인증 파일**

  IDT는 AWS CLI와 동일한 자격 증명 파일을 사용합니다. 자세한 내용은 [구성 및 자격 증명 파일](https://docs.aws.amazon.com/cli/latest/userguide/cli-config-files.html)을 참조하십시오.

  자격 증명 파일의 위치는 사용하는 운영 체제에 따라 달라집니다.
  + macOS, Linux의 경우: `~/.aws/credentials`
  + Windows: `C:\Users\UserName\.aws\credentials`
+ **환경 변수**

  환경 변수는 운영 체제에서 유지 관리하고 시스템 명령에서 사용하는 변수입니다. SSH 세션 중에 정의된 변수는 해당 세션이 종료된 후에는 사용할 수 없습니다. IDT는 `AWS_ACCESS_KEY_ID` 및 `AWS_SECRET_ACCESS_KEY` 환경 변수를 사용하여 AWS 보안 인증을 저장할 수 있습니다.

  Linux, macOS 또는 Unix에서 이러한 변수를 설정하려면 **export**를 사용합니다.

  ```
  export AWS_ACCESS_KEY_ID=<your_access_key_id>
  export AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
  ```

  Windows에서 이러한 변수를 설정하려면 **set**을 사용합니다.

  ```
  set AWS_ACCESS_KEY_ID=<your_access_key_id>
  set AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
  ```

IDT에 대한 AWS 자격 증명을 구성하려면 테스트 실행기는 `<device-tester-extract-location>/configs/` 폴더에 있는 `config.json` 파일의 `auth` 섹션을 편집합니다.

```
{
    "log": {
        "location": "logs"
    },
    "configFiles": {
        "root": "configs",
        "device": "configs/device.json"
    },
    "testPath": "tests",
    "reportPath": "results",
    "awsRegion": "<region>",
    "auth": {
        "method": "file | environment",
        "credentials": {
            "profile": "<profile-name>"
        }
    }
}
]
```

여기 설명된 것처럼 값이 포함된 모든 필드는 필수입니다.

**참고**  
이 파일의 모든 경로는 *<device-tester-extract-location>*을 기준으로 정의됩니다.

**`log.location`**  
*<device-tester-extract-location>*에 있는 로그 폴더의 경로.

**`configFiles.root`**  
구성 파일이 포함된 폴더 경로입니다.

**`configFiles.device`**  
`device.json` 파일 경로입니다.

**`testPath`**  
테스트 도구 모음이 들어 있는 폴더의 경로.

**`reportPath`**  
IDT에서 테스트 도구 모음을 실행한 후 테스트 결과를 포함할 폴더의 경로입니다.

**`awsRegion`**  
선택 사항. 테스트 제품군에서 사용할 AWS 리전입니다. 설정하지 않으면 테스트 도구 모음은 각 테스트 도구 모음에 지정된 기본 리전을 사용합니다.

**`auth.method`**  
IDT가 자격 AWS 증명을 검색하는 데 사용하는 메서드입니다. 지원되는 값은 보안 인증 파일에서 보안 인증을 검색하는 `file`와(과) 환경 변수를 사용하여 보안 인증을 검색하는 `environment`입니다.

**`auth.credentials.profile`**  
보안 인증 파일에서 사용할 보안 인증 프로필. 이 속성은 `auth.method`이 `file`로 설정된 경우에만 적용됩니다.

# 사용자 지정 테스트 제품군 디버그 및 실행
<a name="run-tests-custom"></a>

[필요한 구성](set-config-custom.md)이 설정되면 IDT에서 테스트 도구 모음을 실행할 수 있습니다. 전체 테스트 제품군의 런타임은 하드웨어와 테스트 제품군의 구성에 따라 달라집니다. 참고로, Raspberry Pi 3B에서 전체 FreeRTOS 검증 테스트 제품군을 완료하는 데 약 30분이 걸립니다.

테스트 제품군을 작성할 때 IDT를 사용하여 테스트 제품군을 디버그 모드에서 실행하여 코드를 실행하기 전에 검사하거나 테스트 실행기에 제공할 수 있습니다.

## IDT를 디버그 모드에서 실행합니다.
<a name="idt-debug-mode"></a>

테스트 도구 모음은 디바이스와 상호 작용하고, 컨텍스트를 제공하고, 결과를 받기 위해 IDT를 사용하기 때문에 IDT 상호 작용 없이 IDE에서 테스트 도구 모음을 간단히 디버깅할 수는 없습니다. 이를 위해 IDT CLI는 IDT를 디버그 모드에서 실행할 수 있는 `debug-test-suite` 명령을 제공합니다. 다음 명령을 실행하여 `debug-test-suite`에 대해 사용 가능한 옵션을 봅니다.

```
devicetester_[linux | mac | win_x86-64] debug-test-suite -h
```

IDT를 디버그 모드에서 실행할 때 IDT는 실제로 테스트 제품군을 시작하거나 테스트 오케스트레이터를 실행하지 않습니다. 대신 IDE와 상호 작용하여 IDE에서 실행 중인 테스트 제품군의 요청에 응답하고 콘솔에 로그를 인쇄합니다. IDT는 타임아웃이 발생하지 않으며 수동으로 중단될 때까지 종료를 기다립니다. 디버그 모드에서도 IDT는 테스트 오케스트레이터를 실행하지 않으며 보고서 파일을 생성하지 않습니다. 테스트 제품군을 디버깅하려면 IDE를 사용하여 IDT가 일반적으로 구성 파일에서 얻는 일부 정보를 제공해야 합니다. 다음 정보를 제공하는지 확인합니다.
+ 각 테스트의 환경 변수 및 인수 IDT는 `test.json` 또는 `suite.json`에서 이 정보를 읽지 않습니다.
+ 리소스 디바이스를 선택하기 위한 인수. IDT는 `test.json`에서 이 정보를 읽지 않습니다.

테스트 도구 모음을 디버깅하려면 다음 단계를 완료하세요.

1.  테스트 도구 모음을 실행하는 데 필요한 설정 구성 파일을 생성합니다. 예를 들어, 테스트 도구 모음에 `device.json`, `resource.json`, 및 `user data.json`이(가) 필요한 경우, 필요에 따라 모두 구성해야 합니다.

1. 다음 명령을 실행하여 IDT를 디버그 모드로 설정하고 테스트를 실행하는 데 필요한 디바이스를 선택합니다.

   ```
   devicetester_[linux | mac | win_x86-64] debug-test-suite [options]
   ```

   이 명령을 실행하면 IDT는 테스트 도구 모음의 요청을 기다린 다음 요청에 응답합니다. 또한 IDT는 IDT Client SDK의 케이스 프로세스에 필요한 환경 변수를 생성합니다.

1. IDE에서 `run` 또는 `debug` 구성을 사용하여 다음을 수행합니다.

   1. IDT에서 생성한 환경 변수의 값을 설정합니다.

   1. `test.json` 및 `suite.json` 파일에 지정한 모든 환경 변수 또는 인수의 값을 설정합니다.

   1. 필요에 따라 중단점을 설정합니다.

1. IDE에서 테스트 도구 모음을 실행합니다.

   필요한 횟수만큼 테스트 도구 모음을 디버깅하고 다시 실행할 수 있습니다. 디버그 모드에서는 IDT가 타임아웃되지 않습니다.

1.  디버깅을 완료한 후 IDT를 중단하여 디버그 모드를 종료하십시오.

## 테스트를 실행하기 위한 IDT CLI 명령
<a name="idt-cli-commands"></a>

다음 섹션에서는 IDT CLI 명령에 대해 설명합니다.

------
#### [ IDT v4.0.0 ]

**`help`**  <a name="idt-command-help"></a>
지정된 명령에 대한 정보를 나열합니다.

**`list-groups`**  <a name="idt-command-list-groups"></a>
지정된 테스트 제품군에 있는 그룹을 나열합니다.

**`list-suites`**  <a name="idt-command-list-suites"></a>
사용 가능한 테스트 제품군을 나열합니다.

**`list-supported-products`**  
IDT 버전에 대해 지원되는 제품(이 경우, FreeRTOS 버전)과 현재 IDT 버전에 사용 가능한 FreeRTOS 검증 테스트 제품군 버전을 나열합니다.

**`list-test-cases`**  
주어진 테스트 그룹의 테스트 사례를 나열합니다. 다음 옵션이 지원됩니다.  
+ `group-id`. 검색할 테스트 그룹입니다. 이 옵션은 필수이며 단일 그룹을 지정해야 합니다.

**`run-suite`**  
디바이스의 풀에 대해 테스트 제품군을 실행합니다. 다음은 몇 가지 일반적으로 사용되는 옵션입니다:  
+ `suite-id`. 실행할 테스트 제품군 버전입니다. 지정하지 않으면 IDT는 `tests` 폴더의 최신 버전을 사용합니다.
+ `group-id`. 실행할 테스트 그룹(쉼표로 구분된 목록). 지정하지 않으면 IDT는 테스트 제품군의 모든 테스트 그룹을 실행합니다.
+ `test-id`. 실행할 테스트 케이스(쉼표로 구분된 목록). 지정된 경우, `group-id`은(는) 단일 그룹을 지정해야 합니다.
+ `pool-id`. 테스트할 디바이스 풀. `device.json` 파일에 여러 디바이스 풀이 정의되어 있는 경우, 테스트 실행기는 하나의 풀을 지정해야 합니다.
+ `timeout-multiplier`. 사용자 정의 승수를 사용하여 테스트에 대해 `test.json` 파일에 지정된 테스트 실행 제한 시간을 수정하도록 IDT를 구성합니다.
+ `stop-on-first-failure`. 첫 번째 실패 시 실행을 중지하도록 IDT를 구성합니다. 이 옵션은 지정된 테스트 그룹을 디버깅하는 데 `group-id`와(과) 함께 사용해야 합니다.
+ `userdata`. 테스트 도구 모음을 실행하는 데 필요한 사용자 데이터 정보가 포함된 파일을 설정합니다. 이는 테스트 도구 모음 `suite.json` 파일에서 `userdataRequired`이(가) true로 설정된 경우에만 필요합니다.
`run-suite` 옵션에 대한 자세한 내용은 다음 `help` 옵션을 사용하십시오.  

```
devicetester_[linux | mac | win_x86-64] run-suite -h
```

**`debug-test-suite`**  
테스트 도구 모음을 디버그 모드에서 실행합니다. 자세한 내용은 [IDT를 디버그 모드에서 실행합니다.](#idt-debug-mode) 단원을 참조하십시오.

------

# IDT 테스트 결과 및 로그 검토
<a name="idt-review-results-logs"></a>

이 섹션에서는 IDT가 콘솔 로그와 테스트 보고서를 생성하는 형식을 설명합니다.

## 콘솔 메시지 형식
<a name="idt-console-format"></a>

AWS IoT Device Tester 는 테스트 제품군을 시작할 때 콘솔에 메시지를 인쇄하기 위해 표준 형식을 사용합니다. 다음 발췌문은 IDT에서 생성한 콘솔 메시지의 한 가지 예를 보여줍니다.

```
[INFO] [2000-01-02 03:04:05]: Using suite: MyTestSuite_1.0.0 executionId=9a52f362-1227-11eb-86c9-8c8590419f30
```

대부분의 콘솔 메시지는 다음 필드로 구성되어 있습니다.

**`time`**  
로깅된 이벤트의 전체 ISO 8601 타임스탬프.

**`level`**  
로깅된 이벤트의 메시지 수준. 일반적으로 로깅된 메시지 수준은 `info`, `warn` 또는 `error`중 하나입니다. IDT는 예상 이벤트가 발생하여 이벤트가 일찍 종료되는 경우 `fatal` 또는 `panic` 메시지를 표시합니다.

**`msg`**  
로깅된 메시지.

**`executionId`**  
현재 IDT 프로세스의 고유 ID 문자열입니다. 이 ID는 개별 IDT 실행을 구분하는 데 사용됩니다.

테스트 제품군에서 생성된 콘솔 메시지는 테스트 대상 디바이스와 테스트 제품군, 테스트 그룹 및 IDT가 실행하는 테스트 케이스에 대한 추가 정보를 제공합니다. 다음 발췌문은 테스트 제품군에서 생성한 콘솔 메시지의 한 가지 예를 보여줍니다:

```
[INFO] [2000-01-02 03:04:05]: Hello world! suiteId=MyTestSuitegroupId=myTestGroup testCaseId=myTestCase deviceId=my-deviceexecutionId=9a52f362-1227-11eb-86c9-8c8590419f30
```

콘솔 메시지의 테스트 제품군 관련 부분에는 다음 필드가 포함됩니다.

**`suiteId`**  
현재 실행 중인 테스트 제품군의 이름.

**`groupId`**  
현재 실행 중인 테스트 그룹의 ID.

**`testCaseId`**  
현재 실행 중인 테스트 케이스의 ID.

**`deviceId`**  
현재 테스트 사례에서 사용 중인 테스트 대상 디바이스의 ID입니다.

테스트 요약에는 테스트 제품군, 실행된 각 그룹의 테스트 결과, 생성된 로그 및 보고서 파일의 위치에 대한 정보가 포함됩니다. 다음 예제에서는 테스트 요약 메시지를 보여줍니다.

```
========== Test Summary ==========
Execution Time:     5m00s
Tests Completed:    4
Tests Passed:       3
Tests Failed:       1
Tests Skipped:      0
----------------------------------
Test Groups:
    GroupA:         PASSED
    GroupB:         FAILED
----------------------------------
Failed Tests:
    Group Name: GroupB
        Test Name: TestB1
            Reason: Something bad happened
----------------------------------
Path to AWS IoT Device Tester Report: /path/to/awsiotdevicetester_report.xml
Path to Test Execution Logs: /path/to/logs
Path to Aggregated JUnit Report: /path/to/MyTestSuite_Report.xml
```

## AWS IoT Device Tester 스키마 보고
<a name="idt-report"></a>

 `awsiotdevicetester_report.xml`은 다음 정보가 포함된 서명된 보고서입니다.
+ IDT 버전
+ 테스트 제품군 버전입니다.
+ 보고서에 서명하는 데 사용된 보고서 서명 및 키.
+ `device.json` 파일에 지정된 SKU 및 디바이스 풀 이름.
+ 테스트된 제품 버전 및 디바이스 특성.
+ 테스트 결과의 집계 요약 이 정보는 `suite-name_report.xml` 파일에 포함된 정보와 동일합니다.

```
<apnreport>
    <awsiotdevicetesterversion>idt-version</awsiotdevicetesterversion>
    <testsuiteversion>test-suite-version</testsuiteversion>
    <signature>signature</signature>
    <keyname>keyname</keyname>
    <session>
        <testsession>execution-id</testsession>
        <starttime>start-time</starttime>
        <endtime>end-time</endtime>
    </session>
    <awsproduct>
        <name>product-name</name>
        <version>product-version</version>
        <features>
            <feature name="<feature-name>" value="supported | not-supported | <feature-value>" type="optional | required"/>
        </features>
    </awsproduct>
    <device>
        <sku>device-sku</sku>
        <name>device-name</name>
        <features>
            <feature name="<feature-name>" value="<feature-value>"/>
        </features>
        <executionMethod>ssh | uart | docker</executionMethod>
    </device>
    <devenvironment>
        <os name="<os-name>"/>
    </devenvironment>
    <report>
        <suite-name-report-contents>
    </report>
</apnreport>
```

`awsiotdevicetester_report.xml` 파일에는 테스트하는 제품에 대한 정보와 테스트 제품군을 실행한 후 확인된 제품 기능에 대한 정보를 포함하는 `<awsproduct>` 태그가 포함되어 있습니다.

**`<awsproduct>` 태그에 사용되는 속성**

**`name`**  
테스트하는 제품의 이름입니다.

**`version`**  
테스트하는 제품의 버전입니다.

**`features`**  
확인된 기능입니다. 필수로 `required` 표시된 특성은 테스트 제품군에서 디바이스를 검증하는 데 필요합니다. 다음 코드 조각은 `awsiotdevicetester_report.xml` 파일에 이 정보가 나타나는 방식을 보여 줍니다.  

```
<feature name="ssh" value="supported" type="required"></feature>
```
`optional` 표시된 특성은 검증에 필요하지 않습니다. 다음 코드 조각은 선택적 기능을 보여 줍니다.  

```
<feature name="hsi" value="supported" type="optional"></feature>
<feature name="mqtt" value="not-supported" type="optional"></feature>
```

## 테스트 제품군 보고서 스키마
<a name="suite-report"></a>

`suite-name_Result.xml` 보고서는 [JUnit XML 형식](https://llg.cubic.org/docs/junit/)입니다. [Jenkins](https://jenkins.io/), [Bamboo](https://www.atlassian.com/software/bamboo) 등과 같은 지속적 통합 및 배포 플랫폼에 이 보고서를 통합할 수 있습니다. 보고서는 테스트 결과의 집계 요약을 포함합니다.

```
<testsuites name="<suite-name> results" time="<run-duration>" tests="<number-of-test>" failures="<number-of-tests>" skipped="<number-of-tests>" errors="<number-of-tests>" disabled="0">
    <testsuite name="<test-group-id>" package="" tests="<number-of-tests>" failures="<number-of-tests>" skipped="<number-of-tests>" errors="<number-of-tests>" disabled="0">
        <!--success-->
        <testcase classname="<classname>" name="<name>" time="<run-duration>"/>
        <!--failure-->
        <testcase classname="<classname>" name="<name>" time="<run-duration>">
            <failure type="<failure-type>">
                reason
            </failure>
        </testcase>
        <!--skipped-->
        <testcase classname="<classname>" name="<name>" time="<run-duration>">
            <skipped>
                reason
            </skipped>
        </testcase>
        <!--error-->
        <testcase classname="<classname>" name="<name>" time="<run-duration>">
            <error>
                reason
            </error>
        </testcase>
    </testsuite>
</testsuites>
```

`awsiotdevicetester_report.xml` 또는 `suite-name_report.xml`의 보고서 섹션에는 실행된 테스트 및 결과가 나열됩니다.

첫 번째 XML 태그 `<testsuites>`에는 테스트 실행의 요약이 포함됩니다. 예제:

```
<testsuites name="MyTestSuite results" time="2299" tests="28" failures="0" errors="0" disabled="0">
```

**`<testsuites>` 태그에 사용되는 속성**

**`name`**  
테스트 제품군의 이름입니다.

**`time`**  
테스트 제품군를 실행하는 데 걸린 시간(초).

**`tests`**  
실행된 테스트의 수입니다.

**`failures`**  
실행되었지만 통과하지 못한 테스트의 수입니다.

**`errors`**  
IDT에서 실행하지 못한 테스트의 수입니다.

**`disabled`**  
이 속성은 사용되지 않으므로 무시해도 좋습니다.

테스트 실패 또는 오류의 경우 `<testsuites>` XML 태그를 검토하여 실패한 테스트를 식별할 수 있습니다. `<testsuites>` 태그 내부의 `<testsuite>` XML 태그는 테스트 그룹에 대한 테스트 결과 요약을 보여 줍니다. 예제:

```
<testsuite name="combination" package="" tests="1" failures="0" time="161" disabled="0" errors="0" skipped="0">
```

형식은 `<testsuites>` 태그와 비슷하지만, 사용되지 않고 무시할 수 있는 `skipped` 속성이 있습니다. 각 `<testsuite>` XML 태그 내부에는 테스트 그룹에 실행된 각 테스트에 대한 `<testcase>` 태그가 있습니다. 예제:

```
<testcase classname="Security Test" name="IP Change Tests" attempts="1"></testcase>
```

**`<testcase>` 태그에 사용되는 속성**

**`name`**  
테스트의 이름입니다.

**`attempts`**  
IDT에서 테스트 사례를 실행한 횟수입니다.

테스트가 실패하거나 오류가 발생하는 경우 문제 해결에 대한 정보와 함께 `<failure>` 또는 `<error>` 태그가 `<testcase>` 태그에 추가됩니다. 예제:

```
<testcase classname="mcu.Full_MQTT" name="MQTT_TestCase" attempts="1">
	<failure type="Failure">Reason for the test failure</failure>
	<error>Reason for the test execution error</error>
</testcase>
```

# IDT 사용량 지표 제출
<a name="idt-usage-metrics"></a>

자격 AWS 증명에 필요한 권한을 제공하는 경우는 사용량 지표를 AWS IoT Device Tester 수집하여 제출합니다 AWS. 이는 옵트인 기능이며 IDT 기능을 개선하는 데 사용됩니다. IDT는 다음과 같은 정보를 수집합니다.
+ IDT를 실행하는 데 사용되는 AWS 계정 ID
+  테스트 실행에 사용된 IDT CLI 명령
+ 실행되는 테스트 제품군
+ *<device-tester-extract-location>* 폴더의 테스트 제품군
+ 디바이스 풀에 구성된 디바이스 수
+ 테스트 케이스 이름 및 런타임
+ 테스트 결과 정보(예: 테스트 통과, 실패, 오류 발생 또는 건너뛰었는지 여부)
+ 제품 기능 테스트
+ IDT 종료 행동(예: 예상치 못한 종료 또는 조기 종료) 

 IDT가 전송하는 모든 정보는 `<device-tester-extract-location>/results/<execution-id>/` 폴더의 `metrics.log` 파일에도 기록됩니다. 로그 파일을 보면 테스트 실행 중에 수집된 정보를 볼 수 있습니다. 이 파일은 사용량 지표를 수집하도록 선택한 경우에만 생성됩니다.

지표 수집을 비활성화하기 위해 추가 조치를 취할 필요가 없습니다. 자격 AWS 증명을 저장하지 말고 자격 증명이 저장된 경우 해당 AWS 자격 증명에 액세스하도록 `config.json` 파일을 구성하지 마십시오.

## 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

## 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인[하는 데 도움이 필요하면 사용 설명서의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요. *AWS Sign-In * 

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요.
+ 의 사용자 및 그룹 AWS IAM Identity Center:

  권한 세트를 생성합니다. *AWS IAM Identity Center 사용자 안내서*에서 [권한 세트 생성](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)의 지침을 따릅니다.
+ ID 제공업체를 통해 IAM에서 관리되는 사용자:

  ID 페더레이션을 위한 역할을 생성합니다. *IAM 사용자 설명서*의 [Create a role for a third-party identity provider (federation)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)의 지침을 따릅니다.
+ IAM 사용자:
  + 사용자가 맡을 수 있는 역할을 생성합니다. *IAM 사용자 설명서*에서 [Create a role for an IAM user](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)의 지침을 따릅니다.
  + (권장되지 않음) 정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. *IAM 사용 설명서*에서 [사용자(콘솔)에 권한 추가](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)의 지침을 따릅니다.

## IDT에 AWS 자격 증명 제공
<a name="idt-metrics-creds"></a>

IDT가 자격 AWS 증명에 액세스하고 지표를 제출하도록 허용하려면 다음을 AWS수행합니다.

1. IAM 사용자의 AWS 자격 증명을 환경 변수 또는 자격 증명 파일에 저장합니다.

   1. 다음 명령을 실행하여 환경 변수를 설정합니다.

      ```
      AWS_ACCESS_KEY_ID=access-key
      AWS_SECRET_ACCESS_KEY=secret-access-key
      ```

   1. 자격 증명 파일을 사용하려면 다음 정보를 `.aws/credentials file:`에 추가합니다.

      ```
      [profile-name]
      aws_access_key_id=access-key
      aws_secret_access_key=secret-access-key
      ```

1. `config.json` 파일의 `auth` 섹션을 구성합니다. 자세한 내용은 [(선택 사항) config.json 구성](set-config-custom.md#config-json-custom) 단원을 참조하십시오.