

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

# AWS IoT Greengrass V2용 AWS IoT Device Tester 사용
<a name="device-tester-for-greengrass-ug"></a>

AWS IoT Device Tester(IDT)는 IoT 장치를 검증할 수 있는 다운로드 가능한 테스트 프레임워크입니다. AWS IoT Greengrass용 IDT를 사용하여 AWS IoT Greengrass 검증 제품군을 실행하고, 디바이스용 사용자 지정 테스트 제품군을 생성하고 실행할 수 있습니다.

AWS IoT Greengrass용 IDT는 테스트 대상 장치에 연결된 호스트 컴퓨터(Windows, macOS 또는 Linux)에서 실행됩니다. 이 IDT는 테스트를 실행하고 결과를 집계합니다. 또한 테스트 프로세스를 관리하기 위한 명령줄 인터페이스를 제공합니다.

## AWS IoT Greengrass 검증 제품군
<a name="gg-qual-suite"></a>

AWS IoT Greengrass V2용 AWS IoT Device Tester를 사용하면 AWS IoT Greengrass 코어 소프트웨어가 하드웨어에서 실행되고 AWS 클라우드와 통신할 수 있는지 확인할 수 있습니다. 또한 이 IDT는 AWS IoT Core와의 엔드 투 엔드 테스트를 수행합니다. 예를 들어 디바이스에서 구성 요소를 배포하고 업그레이드할 수 있는지 확인합니다.

AWS Partner Device Catalog에 하드웨어를 추가하려면 AWS IoT Greengrass 검증 제품군을 실행하여 AWS IoT에 제출할 수 있는 테스트 보고서를 생성합니다. 자세한 내용은 [AWS Device Qualification Program](https://aws.amazon.com/partners/dqp/)을 참조하세요.

![\[AWS IoT Greengrass V2용 AWS IoT Device Tester에서 AWS IoT Greengrass 코어 소프트웨어가 하드웨어에서 실행되고 AWS 클라우드와 통신하는지 확인하는 방식의 개요입니다.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v2/developerguide/images/devicetester_gg.png)


AWS IoT Greengrass V2용 IDT는 *테스트 제품군* 및 *테스트 그룹*의 개념을 사용하여 테스트를 구성합니다.<a name="idt-test-suites-groups"></a>
+ 테스트 제품군은 장치가 AWS IoT Greengrass의 특정 버전에서 작동하는지 확인하는 데 사용되는 테스트 그룹 집합입니다.
+ 테스트 그룹은 구성 요소 배포와 같은 특정 특성과 관련된 개별 테스트 집합입니다.

 자세한 내용은 [IDT를 사용하여 AWS IoT Greengrass 검증 제품군 실행](idt-greengrass-qualification.md) 섹션을 참조하세요.

## 사용자 지정 테스트 제품군
<a name="custom-test-suite"></a>

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

테스트 작성자가 사용자 지정 테스트 제품군을 구성하는 방법에 따라 사용자 지정 테스트 제품군을 실행하는 데 필요한 설정 구성이 결정됩니다. 자세한 내용은 [IDT를 사용하여 자체 테스트 제품군 개발 및 실행](idt-custom-tests.md) 섹션을 참조하세요.

# AWS IoT Device Tester for AWS IoT Greengrass V2 지원 버전
<a name="dev-test-versions"></a>

이 주제에서는 지원되는 IDT for AWS IoT Greengrass V2 버전을 나열합니다. 가장 좋은 방법은 대상 버전의 AWS IoT Greengrass V2를 지원하는 최신 버전의 IDT for AWS IoT Greengrass V2를 사용하는 것입니다. 의 새 릴리스에서는 새 버전의 IDT for AWS IoT Greengrass V2를 다운로드해야 할 AWS IoT Greengrass 수 있습니다. IDT for AWS IoT Greengrass V2가 사용 중인 버전과 호환되지 않는 경우 테스트 실행을 시작할 때 알림을 받게 AWS IoT Greengrass 됩니다.

소프트웨어를 다운로드하면 [AWS IoT Device Tester IDT 라이선스 계약](https://docs.aws.amazon.com/greengrass/v2/developerguide/idt-license.html)에 동의하는 것입니다.

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

## AWS IoT Greengrass V2의 최신 IDT 버전
<a name="idt-latest-version"></a>

이 버전의 IDT for AWS IoT Greengrass V2를 여기에 나열된 AWS IoT Greengrass 버전과 함께 사용할 수 있습니다.<a name="idt-latest-version.options"></a>

**용 IDT v4.9.4 AWS IoT Greengrass**    
지원되는 AWS IoT Greengrass 버전:   
+ [Greengrass nucleus](greengrass-nucleus-component.md) v2.12.0, v2.11.0, v2.10.0 및 v2.9.5  
IDT 소프트웨어 다운로드:  
+ [Linux](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.4_testsuite_2.5.4_linux.zip)용 테스트 제품군 GGV2Q\$12.5.4가 있는 IDT v4.9.4
+ [macOS](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.4_testsuite_2.5.4_mac.zip)용 테스트 제품군 GGV2Q\$12.5.4가 있는 IDT v4.9.4
+ [Windows](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.4_testsuite_2.5.4_win.zip)용 테스트 제품군 GGV2Q\$12.5.4가 있는 IDT v4.9.4  
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 2.12.0, 2.11.0, 2.10.0 및 2.9.5를 실행하는 디바이스에 대해 디바이스 검증 및 검증을 활성화합니다.
+ 스트림 관리자 및 기계 학습 테스트 그룹을 제거합니다.  
추가 참고 사항  
+ 디바이스가 HSM을 사용하고 nucleus 2.10.x를 사용하는 경우 Greengrass nucleus 버전 2.11.0 이상으로 마이그레이션합니다.  
테스트 제품군 버전:    
`GGV2Q_2.5.4`  
+ 2024년 5월 3일 릴리스

## 용 이전 IDT 버전 AWS IoT Greengrass
<a name="idt-earlier-versions"></a>

다음 이전 버전의 IDT for AWS IoT Greengrass V2도 지원됩니다.<a name="idt-earlier-version.options"></a>

**용 IDT v4.9.3 AWS IoT Greengrass**    
지원되는 AWS IoT Greengrass 버전:   
+ [Greengrass nucleus](greengrass-nucleus-component.md) v2.12.0, v2.11.0, v2.10.0 및 v2.9.5  
IDT 소프트웨어 다운로드:  
+ [Linux](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.3_testsuite_2.5.3_linux.zip)용 테스트 제품군 GGV2Q\$12.5.3이 있는 IDT v4.9.3
+ [macOS](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.3_testsuite_2.5.3_mac.zip)용 테스트 제품군 GGV2Q\$12.5.3이 있는 IDT v4.9.3
+ [Windows](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.3_testsuite_2.5.3_win.zip)용 테스트 제품군 GGV2Q\$12.5.3이 있는 IDT v4.9.3  
릴리스 정보:  
+ Windows 호스트에서 Linux 디바이스를 테스트할 때 또는 그 반대의 경우 구성 요소 테스트의 문제를 해결합니다.
+ `component` 테스트 그룹에서 `localcomponent` 테스트 사례를 제거합니다. 이 테스트 사례는 이제 검증에 필요하지 않습니다.  
추가 참고 사항  
+ 디바이스가 HSM을 사용하고 nucleus 2.10.x를 사용하는 경우 Greengrass nucleus 버전 2.11.0 이상으로 마이그레이션합니다.  
테스트 제품군 버전:    
`GGV2Q_2.5.3`  
+ 2024년 4월 5일 릴리스됨

## 지원되지 않는 AWS IoT Device Tester for AWS IoT Greengrass V2 버전
<a name="idt-unsupported-versions"></a>

이 주제에서는 지원되지 않는 IDT for AWS IoT Greengrass V2 버전을 나열합니다. 지원되지 않는 버전에는 버그 수정 또는 업데이트가 제공되지 않습니다. 자세한 내용은 [AWS IoT Device Tester용 AWS IoT Greengrass에 대한 지원 정책](idt-support-policy.md) 단원을 참조하십시오.

**용 IDT v4.9.2 AWS IoT Greengrass**    
릴리스 정보:  
+ Java 8이 더는 사용되지 않아서 Lambda 테스트 제품군이 실패하는 문제를 해결합니다.  
테스트 제품군 버전:    
`GGV2Q_2.5.2`  
+ 2024년 3월 18일 릴리스됨

**용 IDT v4.9.1 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 2.12.0, 2.11.0, 2.10.0 및 2.9.5가 실행되는 디바이스를 검증할 수 있습니다.
+ 사소한 버그를 수정했습니다.  
테스트 제품군 버전:    
`GGV2Q_2.5.1`  
+ 2023년 10월 5일 릴리스됨

**용 IDT v4.7.0 AWS IoT Greengrass**    
지원되는 AWS IoT Greengrass 버전:   
+ [Greengrass nucleus](greengrass-nucleus-component.md) v2.11.0, v2.10.0 및 v2.9.5  
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 2.11.0, 2.10.0 및 2.9.5가 실행되는 디바이스를 검증할 수 있습니다.
+  AWS Systems Manager Parameter Store에 IDT 사용자 데이터 값을 저장하고 자리 표시자 구문을 사용하여 구성으로 가져오는 지원을 추가합니다.
+ 사소한 버그를 수정했습니다.  
테스트 제품군 버전:    
`GGV2Q_2.5.0`  
+ 2022년 12월 13일 릴리스됨

**용 IDT v4.5.11 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 2.9.1, 2.9.0, 2.8.1, 2.8.0, 2.7.0, 2.6.0이 실행되는 디바이스를 검증할 수 있습니다.
+ 코어 디바이스에서 PreInstalled Greengrass를 테스트하는 지원을 추가합니다.
+ 사소한 버그를 수정했습니다.  
테스트 제품군 버전:    
`GGV2Q_2.4.1`  
+ 2022년 10월 13일 릴리스됨

**용 IDT v4.5.8 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 2.7.0, 2.6.0 및 2.5.6이 실행되는 디바이스를 검증할 수 있습니다.
+ 코어 디바이스에서 PreInstalled Greengrass로 테스트할 수 있습니다.
+ 사소한 버그를 수정했습니다.  
테스트 제품군 버전:    
`GGV2Q_2.4.0`  
+ 2022년 8월 12일 릴리스됨

**용 IDT v4.5.3 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 2.7.0, 2.6.0, 2.5.6, 2.5.5, 2.5.4 및 2.5.3이 실행되는 디바이스를 검증할 수 있습니다.
+ ECR 기반 Docker 이미지가 사용되도록 DockerApplicationManager 테스트를 업데이트합니다.
+ 사소한 버그를 수정했습니다.  
테스트 제품군 버전:    
`GGV2Q_2.3.1`  
+ 2022년 4월 15일 릴리스됨

**용 IDT v4.5.1 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 v2.5.3이 실행되는 디바이스를 검증할 수 있습니다.
+  AWS IoT Greengrass 코어 소프트웨어에서 사용되는 프라이빗 키 및 인증서 저장에 하드웨어 보안 모듈(HSM)이 사용되는 리눅스 기반 디바이스 검증에 대한 지원을 추가합니다.
+ 사용자 지정 테스트 제품군을 구성하기 위한 새로운 IDT 테스트 오케스트레이터를 구현합니다. 자세한 내용은 [IDT 테스트 오케스트레이터 구성](idt-test-orchestrator.md) 단원을 참조하십시오.
+ 추가 사소한 버그 수정 사항.  
테스트 제품군 버전:    
`GGV2Q_2.3.0`  
+ 2022년 1월 11일 릴리스됨

**용 IDT v4.4.1 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 v2.5.2가 실행되는 디바이스를 검증할 수 있습니다.
+ 테스트 중인 디바이스가 AWS 리소스와 상호 작용하기 위해 수임하는 토큰 교환 역할로 사용자 정의 IAM 역할을 사용할 수 있는 지원을 추가합니다.

  [`userdata.json` 파일](set-config.md#userdata-config) 에서 IAM 역할을 지정할 수 있습니다. 사용자 지정 역할을 지정하면 IDT에서는 테스트 실행 중 기본 토큰 교환 역할이 생성되지 않고 해당 역할이 사용됩니다.
+ 추가 사소한 버그 수정 사항.  
테스트 제품군 버전:    
`GGV2Q_2.2.1`  
+ 2021년 12월 12일 릴리스됨

**용 IDT v4.4.0 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 v2.5.0이 실행되는 디바이스를 검증할 수 있습니다.
+ Windows에서 AWS IoT Greengrass 코어 소프트웨어를 실행하는 디바이스의 검증 및 검증에 대한 지원을 추가합니다.
+ Secure Shell(SSH) 디바이스 연결에 대한 퍼블릭 키 검증 사용을 지원합니다.
+ 보안 모범 사례로 IDT 권한 IAM 정책을 개선합니다.
+ 추가 사소한 버그 수정 사항.  
테스트 제품군 버전:    
`GGV2Q_2.1.0`  
+ 2021년 11월 19일 릴리스됨

**용 IDT v4.2.0 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 v2.2.0 이상을 실행하는 디바이스에서 다음 기능의 검증에 대한 지원을 포함합니다.
  + Docker - Amazon Elastic Container Registry(Amazon ECR)의 Docker 컨테이너 이미지를 디바이스에서 다운로드할 수 있는지 검증합니다.
  + 기계 학습 - 디바이스의 기계 학습(ML) 추론 수행에 [딥 러닝 런타임](https://github.com/neo-ai/neo-ai-dlr) 또는 [TensorFlow Lite](https://www.tensorflow.org/lite/guide/python) ML 프레임워크가 사용될 수 있는지 검증합니다.
  + 스트림 관리자 - 디바이스가 AWS IoT Greengrass 스트림 관리자를 다운로드, 설치 및 실행할 수 있는지 확인합니다.
+  AWS IoT Greengrass 코어 소프트웨어 버전 v2.4.0, v2.3.0, v2.2.0 및 v2.1.0이 실행되는 디바이스를 검증할 수 있습니다.
+ 각 테스트 사례에 대한 테스트 로그를 `<device-tester-extract-location>/results/<execution-id>/logs/<test-group-id>` 디렉터리 내 별도의 *<test-case-id>* 폴더에 그룹화합니다.
+ 추가 사소한 버그 수정 사항.  
테스트 제품군 버전:    
`GGV2Q_2.0.1`  
+ 2021년 8월 31일 릴리스됨

**용 IDT v4.1.0 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 v2.3.0, v2.2.0, v2.1.0 및 v2.0.5가 실행되는 디바이스를 검증할 수 있습니다.
+ `GreengrassNucleusVersion` 및 `GreengrassCLIVersion` 속성 지정에 대한 요구 사항을 제거하여 `userdata.json` 구성을 개선합니다.
+  AWS IoT Greengrass 코어 소프트웨어 v2.1.0 이상 버전에 대한 Lambda 및 MQTT 기능 검증 지원이 포함되어 있습니다. 이제 IDT for AWS IoT Greengrass V2를 사용하여 코어 디바이스가 Lambda 함수를 실행할 수 있고 디바이스가 AWS IoT Core MQTT 주제를 게시하고 구독할 수 있는지 확인할 수 있습니다.
+ 로깅 기능을 개선합니다.
+ 추가 사소한 버그 수정 사항.  
테스트 제품군 버전:    
`GGV2Q_1.1.1`  
+ 2021년 6월 18일 릴리스됨

**용 IDT v4.0.2 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 v2.1.0이 실행되는 디바이스를 검증할 수 있습니다.
+  AWS IoT Greengrass 코어 소프트웨어 v2.1.0 이상 버전에 대한 Lambda 및 MQTT 기능 검증에 대한 지원을 추가합니다. 이제 IDT for AWS IoT Greengrass V2를 사용하여 코어 디바이스가 Lambda 함수를 실행할 수 있고 디바이스가 AWS IoT Core MQTT 주제를 게시하고 구독할 수 있는지 확인할 수 있습니다.
+ 로깅 기능을 개선합니다.
+ 추가 사소한 버그 수정 사항.  
테스트 제품군 버전:    
`GGV2Q_1.1.1`  
+ 2021년 5월 5일 릴리스됨

**용 IDT v4.0.1 AWS IoT Greengrass**    
릴리스 정보:  
+  AWS IoT Greengrass 코어 소프트웨어 버전 2 소프트웨어가 실행되는 디바이스를 검증할 수 있습니다.
+ 용를 사용하여 사용자 지정 테스트 제품군을 개발하고 실행할 AWS IoT Device Tester 수 있습니다 AWS IoT Greengrass. 자세한 내용은 [IDT를 사용하여 자체 테스트 제품군 개발 및 실행](idt-custom-tests.md) 단원을 참조하십시오.
+ macOS 및 Windows용 코드 서명 IDT 애플리케이션을 제공합니다. macOS에서는 IDT에 대한 보안 예외를 부여해야 할 수도 있습니다. 자세한 내용은 [macOS에서의 보안 예외](idt-troubleshooting.md#security-exception-macos) 단원을 참조하십시오.  
테스트 제품군 버전:    
`GGV2Q_1.0.0`  
+ 2020년 12월 22일 릴리스됨
+ `features` 배열에서 해당 `value`를 `yes`로 설정하지 않으면 테스트 제품군에서는 검증에 필요한 테스트만 실행됩니다.

# AWS IoT Greengrass V2용 IDT 다운로드
<a name="idt-programmatic-download"></a>

이 주제에서는 AWS IoT Greengrass V2용 AWS IoT Device Tester를 다운로드하는 옵션에 대해 설명합니다. 다음 소프트웨어 다운로드 링크 중 하나를 사용하거나 지침에 따라 프로그래밍 방식으로 IDT를 다운로드할 수 있습니다.

**Topics**
+ [수동으로 IDT 다운로드](#idt-download-options)
+ [프로그래밍 방식으로 IDT 다운로드](#idt-programmatic-download-process)

소프트웨어를 다운로드하면 [AWS IoT Device Tester IDT 라이선스 계약](https://docs.aws.amazon.com/greengrass/v2/developerguide/idt-license.html)에 동의하는 것입니다.

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

## 수동으로 IDT 다운로드
<a name="idt-download-options"></a>

이 주제에서는 AWS IoT Greengrass V2용 IDT의 지원되는 버전을 나열합니다. 가장 좋은 방법은 AWS IoT Greengrass V2의 대상 버전을 지원하는 AWS IoT Greengrass V2용 IDT의 최신 버전을 사용하는 것입니다. AWS IoT Greengrass의 새 릴리스를 사용하려면 새 버전의 AWS IoT Greengrass V2용 IDT를 다운로드해야 합니다. AWS IoT Greengrass V2용 IDT가 사용 중인 AWS IoT Greengrass 버전과 호환되지 않을 경우 테스트 실행을 시작할 때 알림이 제공됩니다.

  <a name="idt-latest-version.options"></a>  
**AWS IoT Greengrass용 IDT v4.9.4**    
지원되는 AWS IoT Greengrass 버전   
+ [Greengrass nucleus](greengrass-nucleus-component.md) v2.12.0, v2.11.0, v2.10.0 및 v2.9.5  
IDT 소프트웨어 다운로드:  
+ [Linux](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.4_testsuite_2.5.4_linux.zip)용 테스트 제품군 GGV2Q\$12.5.4가 있는 IDT v4.9.4
+ [macOS](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.4_testsuite_2.5.4_mac.zip)용 테스트 제품군 GGV2Q\$12.5.4가 있는 IDT v4.9.4
+ [Windows](https://docs.aws.amazon.com/greengrass/v2/developerguide/devicetester_greengrass_v2_4.9.4_testsuite_2.5.4_win.zip)용 테스트 제품군 GGV2Q\$12.5.4가 있는 IDT v4.9.4  
릴리스 정보:  
+ AWS IoT Greengrass 코어 소프트웨어 버전 2.12.0, 2.11.0, 2.10.0 및 2.9.5를 실행하는 디바이스에 대해 디바이스 검증이 활성화됩니다.
+ 스트림 관리자 및 기계 학습 테스트 그룹을 제거합니다.  
추가 참고 사항  
+ 디바이스가 HSM을 사용하고 nucleus 2.10.x를 사용하는 경우 Greengrass nucleus 버전 2.11.0 이상으로 마이그레이션합니다.  
테스트 제품군 버전:    
`GGV2Q_2.5.4`  
+ 2024년 5월 3일 릴리스

## 프로그래밍 방식으로 IDT 다운로드
<a name="idt-programmatic-download-process"></a>

IDT는 프로그래밍 방식으로 IDT를 다운로드할 수 있는 URL을 검색하는 데 사용할 수 있는 API 작업을 제공합니다. 또한 이 API 작업을 사용하여 IDT가 최신 버전인지 확인할 수 있습니다. 이 API 작업에는 다음과 같은 엔드포인트가 있습니다.

```
https://download.devicetester.iotdevicesecosystem.amazonaws.com/latestidt
```

이 API 작업을 직접 호출하려면 **iot-device-tester:LatestIdt** 작업을 수행할 수 있는 권한이 있어야 합니다. AWS 서명을 포함하고 `iot-device-tester`를 서비스 이름으로 사용합니다.

### API 요청
<a name="idt-programmatic-download-request"></a>

HostOS - 호스트 시스템의 운영 체제입니다. 다음 옵션 중 하나를 선택합니다.  
+ `mac`
+ `linux`
+ `windows`

TestSuiteType - 테스트 제품군의 유형입니다. 다음 옵션을 선택합니다.  
`GGV2` - AWS IoT Greengrass V2용 IDT

ProductVersion  
(선택 사항) Greengrass nucleus의 버전. 이 서비스는 해당 버전의 Greengrass nucleus와 호환되는 최신 버전의 IDT를 반환합니다. 이 옵션을 지정하지 않으면 서비스가 최신 버전의 IDT를 반환합니다.

### API 응답
<a name="idt-programmatic-download-response"></a>

API 응답은 다음 형식을 갖습니다. `DownloadURL`에는 zip 파일이 포함됩니다.

```
{
    "Success": True or False,
    "Message": Message,
    "LatestBk": {
        "Version": The version of the IDT binary,
        "TestSuiteVersion": The version of the test suite,
        "DownloadURL": The URL to download the IDT Bundle, valid for one hour
    }
 }
```

### 예시
<a name="idt-programmatic-download-examples"></a>

다음 예제를 참조하여 프로그래밍 방식으로 IDT를 다운로드할 수 있습니다. 이들 예제는 `AWS_ACCESS_KEY_ID` 및 `AWS_SECRET_ACCESS_KEY` 환경 변수에 저장한 보안 인증 정보를 사용합니다. 보안 모범 사례를 따르려면 코드에 보안 인증 정보를 저장하지 마세요.

**Example 예제: cURL 버전 7.75.0 이상을 사용하여 다운로드(Mac 및 Linux)**  
cURL 버전 7.75.0 이상을 사용하는 경우 `aws-sigv4` 플래그를 사용하여 API 요청에 서명할 수 있습니다. 이 예제에서는 [jq](https://stedolan.github.io/jq/)를 사용하여 응답에서 다운로드 URL을 파싱합니다.  
`aws-sigv4` 플래그에는 curl GET 요청의 쿼리 파라미터가 **HostOs/ProductVersion/TestSuiteType** 또는 **HostOs/TestSuiteType**의 순서로 되어 있어야 합니다. 이 순서를 준수하지 않으면 API Gateway에서 표준 문자열에 대해 일치하지 않는 서명을 가져오는 오류가 발생합니다.  
선택적 파라미터 **ProductVersion**이 포함된 경우 [AWS IoT Greengrass V2용 AWS IoT Device Tester의 지원되는 버전](dev-test-versions.md)에 있는 지원되는 제품 버전을 사용해야 합니다.
+ *us-west-2*를 해당 AWS 리전으로 바꿉니다. 리전 코드의 목록은 [리전 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요.
+ *linux*를 호스트 시스템의 운영 체제로 바꿉니다.
+ *2.5.3*을 AWS IoT Greengrass nucleus의 버전으로 바꿉니다.

```
url=$(curl --request GET "https://download.devicetester.iotdevicesecosystem.amazonaws.com/latestidt?HostOs=linux&ProductVersion=2.5.3&TestSuiteType=GGV2" \
--user $AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY \
--aws-sigv4 "aws:amz:us-west-2:iot-device-tester" \
| jq -r '.LatestBk["DownloadURL"]')

curl $url --output devicetester.zip
```

**Example 예제: 이전 버전의 cURL을 사용하여 다운로드(Mac 및 Linux)**  
사용자가 서명 및 계산한 AWS 서명과 함께 다음 cURL 명령을 사용할 수 있습니다. AWS 서명을 서명 및 계산하는 방법에 대한 자세한 내용은 [AWS API 요청 서명](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)을 참조하세요.  
+ *linux*를 호스트 시스템의 운영 체제로 바꿉니다.
+ *Timestamp*를 날짜 및 시간(예: **20220210T004606Z**)으로 바꿉니다.
+ *Date*를 날짜(예: **20220210**)로 바꿉니다.
+ *AWSRegion*을 해당 AWS 리전으로 바꿉니다. 리전 코드의 목록은 [리전 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요.
+ *AAWSSignature*를 사용자가 생성한 [AWS 서명](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)으로 바꿉니다.

```
curl --location --request GET 'https://download.devicetester.iotdevicesecosystem.amazonaws.com/latestidt?HostOs=linux&TestSuiteType=GGV2' \
--header 'X-Amz-Date: Timestamp \
--header 'Authorization: AWS4-HMAC-SHA256 Credential=$AWS_ACCESS_KEY_ID/Date/AWSRegion/iot-device-tester/aws4_request, SignedHeaders=host;x-amz-date, Signature=AWSSignature'
```

**Example 예제: Python 스크립트를 사용하여 다운로드**  
이 예제에서는 Python [요청](https://pypi.org/project/requests/) 라이브러리를 사용합니다. 이 예제는 Python 예제에서 *AWS 일반 참조*의 [AWS API 요청 서명](https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html)으로 수정되었습니다.    
  
+ *us-west-2*를 해당 리전으로 바꿉니다. 리전 코드의 목록은 [리전 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요.
+ *linux*를 호스트 시스템의 운영 체제로 바꿉니다.

```
# Copyright 2010-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# This file is licensed under the Apache License, Version 2.0 (the "License").
# You may not use this file except in compliance with the License. A copy of the
#License is located at
#
# http://aws.amazon.com/apache2.0/
#
# This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
# OF ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.

# See: http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html
# This version makes a GET request and passes the signature
# in the Authorization header.
import sys, os, base64, datetime, hashlib, hmac 
import requests # pip install requests
# ************* REQUEST VALUES *************
method = 'GET'
service = 'iot-device-tester'
host = 'download.devicetester.iotdevicesecosystem.amazonaws.com'
region = 'us-west-2'
endpoint = 'https://download.devicetester.iotdevicesecosystem.amazonaws.com/latestidt'
request_parameters = 'HostOs=linux&TestSuiteType=GGV2'
            
# Key derivation functions. See:
# http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python
def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()

def getSignatureKey(key, dateStamp, regionName, serviceName):
    kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp)
    kRegion = sign(kDate, regionName)
    kService = sign(kRegion, serviceName)
    kSigning = sign(kService, 'aws4_request')
    return kSigning
    
# Read AWS access key from env. variables or configuration file. Best practice is NOT
# to embed credentials in code.
access_key = os.environ.get('AWS_ACCESS_KEY_ID')
secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
if access_key is None or secret_key is None:
    print('No access key is available.')
    sys.exit()
    
# Create a date for headers and the credential string
t = datetime.datetime.utcnow()
amzdate = t.strftime('%Y%m%dT%H%M%SZ')
datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope

# ************* TASK 1: CREATE A CANONICAL REQUEST *************
# http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
# Step 1 is to define the verb (GET, POST, etc.)--already done.
# Step 2: Create canonical URI--the part of the URI from domain to query 
# string (use '/' if no path)
canonical_uri = '/latestidt' 
# Step 3: Create the canonical query string. In this example (a GET request),
# request parameters are in the query string. Query string values must
# be URL-encoded (space=%20). The parameters must be sorted by name.
# For this example, the query string is pre-formatted in the request_parameters variable.
canonical_querystring = request_parameters
# Step 4: Create the canonical headers and signed headers. Header names
# must be trimmed and lowercase, and sorted in code point order from
# low to high. Note that there is a trailing \n.
canonical_headers = 'host:' + host + '\n' + 'x-amz-date:' + amzdate + '\n'
# Step 5: Create the list of signed headers. This lists the headers
# in the canonical_headers list, delimited with ";" and in alpha order.
# Note: The request can include any headers; canonical_headers and
# signed_headers lists those that you want to be included in the 
# hash of the request. "Host" and "x-amz-date" are always required.
signed_headers = 'host;x-amz-date'
# Step 6: Create payload hash (hash of the request body content). For GET
# requests, the payload is an empty string ("").
payload_hash = hashlib.sha256(('').encode('utf-8')).hexdigest()
# Step 7: Combine elements to create canonical request
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash

# ************* TASK 2: CREATE THE STRING TO SIGN*************
# Match the algorithm to the hashing algorithm you use, either SHA-1 or
# SHA-256 (recommended)
algorithm = 'AWS4-HMAC-SHA256'
credential_scope = datestamp + '/' + region + '/' + service + '/' + 'aws4_request'
string_to_sign = algorithm + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()
# ************* TASK 3: CALCULATE THE SIGNATURE *************
# Create the signing key using the function defined above.
signing_key = getSignatureKey(secret_key, datestamp, region, service)
# Sign the string_to_sign using the signing_key
signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()

# ************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST *************
# The signing information can be either in a query string value or in 
# a header named Authorization. This code shows how to use a header.
# Create authorization header and add to request headers
authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
# The request can include any headers, but MUST include "host", "x-amz-date", 
# and (for this scenario) "Authorization". "host" and "x-amz-date" must
# be included in the canonical_headers and signed_headers, as noted
# earlier. Order here is not significant.
# Python note: The 'host' header is added automatically by the Python 'requests' library.
headers = {'x-amz-date':amzdate, 'Authorization':authorization_header}

# ************* SEND THE REQUEST *************
request_url = endpoint + '?' + canonical_querystring
print('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')
print('Request URL = ' + request_url)
response = requests.get(request_url, headers=headers)
print('\nRESPONSE++++++++++++++++++++++++++++++++++++')
print('Response code: %d\n' % response.status_code)
print(response.text)

download_url = response.json()["LatestBk"]["DownloadURL"]
r = requests.get(download_url)
open('devicetester.zip', 'wb').write(r.content)
```

# IDT를 사용하여 AWS IoT Greengrass 검증 제품군 실행
<a name="idt-greengrass-qualification"></a>

 AWS IoT Device Tester for AWS IoT Greengrass V2를 사용하여 AWS IoT Greengrass 코어 소프트웨어가 하드웨어에서 실행되고와 통신할 수 있는지 확인할 수 있습니다 AWS 클라우드. 또한를 사용하여 end-to-end 테스트를 수행합니다 AWS IoT Core. 예를 들어 디바이스에서 구성 요소를 배포하고 업그레이드할 수 있는지 확인합니다.

디바이스 테스트 외에도 IDT for AWS IoT Greengrass V2는 검증 프로세스를 용이하게 AWS 계정 하기 위해에 리소스(예: AWS IoT 사물, 그룹 등)를 생성합니다.

<a name="idt-aws-credentials"></a>이러한 리소스를 생성하기 위해 IDT for AWS IoT Greengrass V2는 `config.json` 파일에 구성된 AWS 자격 증명을 사용하여 사용자를 대신하여 API를 호출합니다. 이러한 리소스는 테스트 중 다양한 시점에서 프로비저닝됩니다.

IDT for AWS IoT Greengrass V2를 사용하여 AWS IoT Greengrass 검증 제품군을 실행할 때 다음 단계를 수행합니다.

1. 디바이스 및 자격 증명 구성을 로드하고 검증합니다.

1. 필수 로컬 및 클라우드 리소스를 사용하여 선택한 테스트를 수행합니다.

1. 로컬 및 클라우드 리소스를 정리합니다.

1. 보드에서 검증에 필요한 테스트를 통과했는지를 나타내는 테스트 보고서를 생성합니다.

## 테스트 제품군 버전
<a name="idt-test-suite-versions"></a>

IDT for AWS IoT Greengrass V2는 테스트를 테스트 제품군과 테스트 그룹으로 구성합니다.<a name="idt-test-suites-groups"></a>
+ 테스트 제품군은 장치가 AWS IoT Greengrass의 특정 버전에서 작동하는지 확인하는 데 사용되는 테스트 그룹 집합입니다.
+ 테스트 그룹은 구성 요소 배포와 같은 특정 특성과 관련된 개별 테스트 집합입니다.

테스트 제품군은 `major.minor.patch` 형식을 사용하여 버전이 지정됩니다(예: `GGV2Q_1.0.0`). IDT를 다운로드하면 패키지에 최신 Greengrass 검증 제품군 버전이 포함됩니다.

**중요**  
지원되지 않는 테스트 제품군 버전의 테스트는 장치 검증에 유효하지 않습니다. IDT는 지원되지 않는 버전에 대한 검증 보고서를 인쇄하지 않습니다. 자세한 내용은 [AWS IoT Device Tester용 AWS IoT Greengrass에 대한 지원 정책](idt-support-policy.md) 단원을 참조하십시오.  
를 실행`list-supported-products`하여 현재 버전의 IDT에서 지원하는 AWS IoT Greengrass 및 테스트 제품군의 버전을 나열할 수 있습니다.

## 테스트 그룹 설명
<a name="dt-test-groups"></a>

**코어 검증을 위한 필수 테스트 그룹**  
이러한 테스트 그룹은 AWS Partner Device Catalog에 대한 AWS IoT Greengrass V2 디바이스를 검증하는 데 필요합니다.    
코어 종속성  
디바이스가 AWS IoT Greengrass 코어 소프트웨어에 대한 모든 소프트웨어 및 하드웨어 요구 사항을 충족하는지 여부를 확인합니다. 이 테스트 그룹에는 다음 테스트 사례가 포함됩니다.    
Java 버전  
테스트 중인 디바이스에 필요한 Java 버전이 설치되어 있는지 확인합니다. Java 8 이상이 AWS IoT Greengrass 필요합니다.  
사전 테스트 검증  
디바이스가 테스트 실행을 위한 소프트웨어 요구 사항을 충족하는지 확인합니다.  
+ Linux 기반 디바이스의 경우 이 테스트는 디바이스가 다음 Linux 명령을 실행할 수 있는지 확인합니다.

  `chmod`, `cp`, `echo`, `grep`, `kill`, `ln`, `mkinfo`, `ps`, `rm`, `sh`, `uname` 
+ Windows 기반 디바이스의 경우 이 테스트는 디바이스에 다음 Microsoft 소프트웨어가 설치되어 있는지 확인합니다.

  [Powershell](https://learn.microsoft.com/en-us/powershell/?view=powershell-7.1) v5.1 이상, [.NET](https://learn.microsoft.com/en-us/dotnet/) v4.6.1 이상, [Visual C\$1\$1](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170) 2017 이상, [PsExec 유틸리티](https://learn.microsoft.com/en-us/sysinternals/downloads/psexec)  
버전 검사기  
 AWS IoT Greengrass 제공된 버전이 사용 중인 AWS IoT 디바이스 테스터 버전과 호환되는지 확인합니다.  
구성 요소  
디바이스가 구성 요소를 배포하고 업그레이드할 수 있는지 확인합니다. 이 테스트 그룹에는 다음 테스트가 포함됩니다.    
클라우드 구성 요소  
클라우드 구성 요소에 대한 디바이스 기능을 검증합니다.  
로컬 구성 요소  
로컬 구성 요소에 대한 디바이스 기능을 검증합니다.  
Lambda  
이 테스트는 Windows 기반 디바이스에 적용되지 않습니다.  
디바이스가 Java 런타임을 사용하는 Lambda 함수 구성 요소를 배포할 수 있고 Lambda 함수가 AWS IoT Core MQTT 주제를 작업 메시지의 이벤트 소스로 사용할 수 있는지 확인합니다.  
MQTT  
디바이스가 AWS IoT Core MQTT 주제를 구독하고 게시할 수 있는지 확인합니다.

**선택적 테스트 그룹**  
이러한 테스트 그룹은 선택 사항으로, Linux 기반 Greengrass 코어 디바이스를 검증하는 데만 사용됩니다. 선택적 테스트를 받기로 선택하면 디바이스 카탈로그에 추가 기능이 있는 AWS Partner 디바이스가 나열됩니다.  
Docker 종속성  
<a name="description-docker"></a>디바이스가 AWS제공 Docker 애플리케이션 관리자(`aws.greengrass.DockerApplicationManager`) 구성 요소를 사용하는 데 필요한 모든 기술 종속성을 충족하는지 확인합니다.  
Docker 애플리케이션 관리자 검증  
<a name="description-docker-app-manager-qual"></a><a name="description-docker-app-manager-qual-phrase"></a>디바이스가 Amazon ECR에서 Docker 컨테이너 이미지를 다운로드할 수 있는지 확인합니다.  
기계 학습 종속성  
기계 학습 선택적 테스트 그룹은 IDT v4.9.3에서만 지원됩니다.
<a name="description-ml"></a>디바이스가 AWS제공 기계 학습(ML) 구성 요소를 사용하는 데 필요한 모든 기술 종속성을 충족하는지 확인합니다.  
기계 학습 추론 테스트  
기계 학습 선택적 테스트 그룹은 IDT v4.9.3에서만 지원됩니다.
<a name="description-ml-inference"></a><a name="description-ml-inference-phrase"></a>디바이스가 [딥 러닝 런타임](https://github.com/neo-ai/neo-ai-dlr) 및 [TensorFlow Lite](https://www.tensorflow.org/lite/guide/python) ML 프레임워크를 사용하여 ML 추론을 수행할 수 있는지 확인합니다.  
스트림 관리자 종속성  
스트림 관리자 선택적 테스트 그룹은 IDT v4.9.3에서만 지원됩니다.
<a name="description-sm"></a>디바이스가 [AWS IoT Greengrass 스트림 관리자](manage-data-streams.md)를 다운로드, 설치 및 실행할 수 있는지 확인합니다.  
HSI(하드웨어 보안 통합)  
이 테스트는 Linux 기반 디바이스에 대해서만 IDT v4.9.3 이상에서 사용할 수 있습니다. AWS IoT Greengrass 는 현재 Windows 디바이스에 대한 하드웨어 보안 통합을 지원하지 않습니다.
<a name="description-hsi"></a>디바이스가 하드웨어 보안 모듈(HSM)에 저장된 프라이빗 키와 인증서를 사용하여 AWS IoT 및 AWS IoT Greengrass 서비스에 대한 연결을 인증할 수 있는지 확인합니다. 또한이 테스트는 AWS제공 [PKCS\$111 공급자 구성 요소가](pkcs11-provider-component.md) 공급업체 제공 PKCS\$111 라이브러리를 사용하여 HSM과 인터페이스할 수 있는지 확인합니다. 자세한 내용은 [하드웨어 보안 통합](hardware-security.md) 단원을 참조하십시오.

# AWS IoT Greengrass 검증 제품군을 실행하기 위한 사전 조건
<a name="dev-tst-prereqs"></a>

이 섹션에서는 AWS IoT Device Tester 에 (IDT)를 사용하기 위한 사전 조건을 설명합니다 AWS IoT Greengrass.

## 용의 최신 버전 다운로드 AWS IoT Device Tester AWS IoT Greengrass
<a name="install-dev-tst-gg"></a>

[최신 버전](idt-programmatic-download.md)의 IDT를 다운로드하여 읽기/쓰기 권한이 있는 파일 시스템의 위치(*<device-tester-extract-location>*)에 소프트웨어의 압축을 풉니다.

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

## AWS IoT Greengrass 소프트웨어 다운로드
<a name="config-gg"></a>

IDT for AWS IoT Greengrass V2는 디바이스의 특정 버전과의 호환성을 테스트합니다 AWS IoT Greengrass. 다음 명령을 실행하여 AWS IoT Greengrass 코어 소프트웨어를 라는 파일에 다운로드합니다`aws.greengrass.nucleus.zip`. IDT 버전에 [지원되는 nucleus 구성 요소 버전](dev-test-versions.md)으로 *버전*을 바꿉니다.

------
#### [ Linux or Unix ]

```
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-version.zip > aws.greengrass.nucleus.zip
```

------
#### [ Windows Command Prompt (CMD) ]

```
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-version.zip > aws.greengrass.nucleus.zip
```

------
#### [ PowerShell ]

```
iwr -Uri https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-version.zip -OutFile aws.greengrass.nucleus.zip
```

------

다운로드한 `aws.greengrass.nucleus.zip` 파일을 `<device-tester-extract-location>/products/` 폴더에 배치합니다.

**참고**  
동일한 운영 체제 및 아키텍처에 대해 이 디렉터리에 여러 파일을 배치하지 마세요.

## 생성 및 구성 AWS 계정
<a name="config-aws-account-for-idt"></a>

 AWS IoT Device Tester for AWS IoT Greengrass V2를 사용하려면 먼저 다음 단계를 수행해야 합니다.

1. [를 설정합니다 AWS 계정.](#create-aws-account-for-idt) 가 이미 있는 경우 2단계로 AWS 계정건너뜁니다.

1. [IDT에 대한 권한을 구성합니다.](#configure-idt-permissions)

이러한 계정 권한을 통해 IDT는 사용자를 대신하여 AWS 서비스에 액세스하고 AWS IoT 사물 및 AWS IoT Greengrass 구성 요소와 같은 AWS 리소스를 생성할 수 있습니다.

<a name="idt-aws-credentials"></a>이러한 리소스를 생성하기 위해 IDT for AWS IoT Greengrass V2는 `config.json` 파일에 구성된 AWS 자격 증명을 사용하여 사용자를 대신하여 API를 호출합니다. 이러한 리소스는 테스트 중 다양한 시점에서 프로비저닝됩니다.

**참고**  
대다수 테스트는 [AWS 프리 티어](https://aws.amazon.com/free) 대상으로 적합하지만, AWS 계정에 가입할 때 신용카드를 등록해야 합니다. 자세한 내용은 [계정에 프리 티어가 적용되는데 결제 방법이 필요한 이유는 무엇입니까?](https://aws.amazon.com/premiumsupport/knowledge-center/free-tier-payment-method/)를 참조하세요.

### 1단계: 설정 AWS 계정
<a name="create-aws-account-for-idt"></a>

이 단계에는 AWS 계정을 생성하고 구성합니다. 이미 AWS 계정이 있으면 [2단계: IDT에 대한 권한 구성](#configure-idt-permissions) 섹션으로 건너뜁니다.

이 없는 경우 다음 단계를 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)을 수행하는 것입니다.

다음 옵션 중 하나를 선택하여 관리 사용자를 생성합니다.


****  

| 관리자를 관리하는 방법 한 가지 선택 | 목적 | By | 다른 방법 | 
| --- | --- | --- | --- | 
| IAM Identity Center에서 (권장) | 단기 보안 인증 정보를 사용하여 AWS에 액세스합니다.이는 보안 모범 사례와 일치합니다. 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)를 참조하세요. | AWS IAM Identity Center 사용 설명서의 [시작하기](https://docs.aws.amazon.com//singlesignon/latest/userguide/getting-started.html) 지침을 따릅니다. | AWS Command Line Interface 사용 설명서에서 [사용하도록 AWS CLI 를 구성 AWS IAM Identity Center](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-sso.html)하여 프로그래밍 방식 액세스를 구성합니다. | 
| IAM에서 (권장되지 않음) | 장기 보안 인증 정보를 사용하여 AWS에 액세스합니다. | IAM 사용 설명서의 [비상 액세스를 위한 IAM 사용자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started-emergency-iam-user.html)에 나와 있는 지침을 따르세요. | IAM 사용 설명서에 나온 [IAM 사용자의 액세스 키 관리](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_credentials_access-keys.html)를 수행하여 프로그래밍 방식의 액세스를 구성합니다. | 

### 2단계: IDT에 대한 권한 구성
<a name="configure-idt-permissions"></a>

이 단계에서는 IDT for AWS IoT Greengrass V2가 테스트를 실행하고 IDT 사용 데이터를 수집하는 데 사용하는 권한을 구성합니다. [AWS Management Console](#configure-idt-permissions-console) 또는 [AWS Command Line Interface (AWS CLI)](#configure-idt-permissions-cli)를 사용하여 IDT에 대한 IAM 정책 및 테스트 사용자를 생성한 다음에 정책을 사용자에게 연결할 수 있습니다. IDT에 대한 테스트 사용자를 이미 생성했으면 [IDT 테스트를 실행하도록 장치 구성](device-config-setup.md)으로 건너뜁니다.

#### IDT에 대한 권한을 구성하려면(콘솔)
<a name="configure-idt-permissions-console"></a>

1. [IAM 콘솔](https://console.aws.amazon.com/iam)에 로그인합니다.

1. 특정 권한으로 역할을 생성하는 권한을 부여하는 고객 관리형 정책을 만듭니다.

   1. 탐색 창에서 **정책**을 선택한 후 **정책 생성**을 선택합니다.

   1. PreInstalled를 사용하지 않는다면 **JSON** 탭에서 다음 정책으로 자리 표시자 내용을 바꿉니다. PreInstalled를 사용한다면 다음 단계로 진행합니다.

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/idt-*",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/idt-*",
              "arn:aws:iot:*:*:thinggroup/idt-*",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/idt-*",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```

   1. PreInstalled를 사용한다면 **JSON** 탭에서 다음 정책으로 자리 표시자 내용을 바꿉니다. 다음을 확인합니다.
      + 테스트 중 디바이스(DUT)에 Greengrass가 설치되는 동안 생성된 사물 이름과 사물 그룹으로 `iotResources` 문의 *thingName*과 *thingGroup*을 바꾸어 권한을 추가합니다.
      + DUT에 Greengrass가 설치되는 동안 생성된 역할로 `roleAliasResources` 문과 `passRoleForResources` 문의 *passRole*와 *roleAlias*를 바꿉니다.

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/passRole",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/thingName",
              "arn:aws:iot:*:*:thinggroup/thingGroup",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/roleAlias",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```
**참고**  
테스트 중인 디바이스의 [토큰 교환 역할로 사용자 지정 IAM 역할](set-config.md#custom-token-exchange-role-idt)을 사용하려면 사용자 지정 IAM 역할 리소스가 허용되도록 정책의 `roleAliasResources` 문과 `passRoleForResources` 문을 업데이트해야 합니다.

   1. **정책 검토**를 선택합니다.

   1. **이름**에서 **IDTGreengrassIAMPermissions**을 입력합니다. **Summary(요약)** 아래에서 정책에 의해 부여된 권한을 검토합니다.

   1. **정책 생성**을 선택합니다.

1. IAM 사용자를 만들고 AWS IoT Greengrass용 IDT에 필요한 권한을 연결합니다.

   1. IAM 사용자를 생성합니다. *IAM 사용 설명서*에서 [IAM 사용자 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)의 1\$15단계를 따르세요.

   1. IAM 사용자에게 권한을 연결합니다.

      1. **Set permissions(권한 설정)** 페이지에서 **Attach existing policies to user directly(사용자에게 직접 기존 정책 연결)**를 선택합니다.

      1. 이전 단계에서 만든 **IDTGreengrassIAMPermissions** 정책을 검색합니다. 확인란을 선택합니다.

   1. **다음: 태그**를 선택합니다.

   1. **Next: Review(다음: 검토)**를 선택하여 선택 사항의 요약을 봅니다.

   1. **사용자 생성**을 선택합니다.

   1. 사용자의 액세스 키(액세스 키 ID와 비밀 액세스 키)를 보려면 암호와 액세스 키 옆에 있는 **Show(표시)**를 선택합니다. 액세스 키를 저장하려면 **Download .csv(csv 다운로드)**를 선택한 후 안전한 위치에 파일을 저장합니다. 나중에 이 정보를 사용하여 AWS 자격 증명 파일을 구성합니다.

1. <a name="aws-account-config-next-steps"></a>다음 단계: [물리적 장치](device-config-setup.md)를 구성합니다.

#### IDT에 대한 권한을 구성하려면(AWS CLI)
<a name="configure-idt-permissions-cli"></a>

1. 아직 설치되지 않은 AWS CLI 경우 컴퓨터에를 설치하고 구성합니다. *AWS Command Line Interface 사용 설명서* [AWS CLI설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 단계를 따르세요.
**참고**  
 AWS CLI 는 명령줄 셸의 서비스와 상호 작용하는 데 사용할 수 있는 AWS 오픈 소스 도구입니다.

1. IDT 및 AWS IoT Greengrass 역할을 관리할 수 있는 권한을 부여하는 고객 관리형 정책을 만듭니다.

   1. PreInstalled를 사용하지 않는다면 텍스트 편집기를 열고 다음 정책 내용을 JSON 파일에 저장합니다. PreInstalled를 사용한다면 다음 단계로 진행합니다.

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/idt-*",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/idt-*",
              "arn:aws:iot:*:*:thinggroup/idt-*",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/idt-*",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```

   1. PreInstalled를 사용한다면 텍스트 편집기를 열고 다음 정책 내용을 JSON 파일에 저장합니다. 다음을 확인합니다.
      + 테스트 중 디바이스(DUT)에 Greengrass가 설치되는 동안 `iotResources` 문의 *thingName*과 *thingGroup*을 바꾸어 권한을 추가합니다.
      + DUT에 Greengrass가 설치되는 동안 생성된 역할로 `roleAliasResources` 문과 `passRoleForResources` 문의 *passRole*와 *roleAlias*를 바꿉니다.

      ```
      <a name="customer-managed-policy-cli"></a>{
          "Version":"2012-10-17",		 	 	 
          "Statement":[
          {
            "Sid":"passRoleForResources",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::*:role/passRole",
            "Condition":{
              "StringEquals":{
                "iam:PassedToService":[
                  "iot.amazonaws.com",
                  "lambda.amazonaws.com",
                  "greengrass.amazonaws.com"
                ]
              }
            }
          },
          {
            "Sid":"lambdaResources",
            "Effect":"Allow",
            "Action":[
              "lambda:CreateFunction",
              "lambda:PublishVersion",
              "lambda:DeleteFunction",
              "lambda:GetFunction"
            ],
            "Resource":[
              "arn:aws:lambda:*:*:function:idt-*"
            ]
          },
          {
            "Sid":"iotResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateThing",
              "iot:DeleteThing",
              "iot:DescribeThing",
              "iot:CreateThingGroup",
              "iot:DeleteThingGroup",
              "iot:DescribeThingGroup",
              "iot:AddThingToThingGroup",
              "iot:RemoveThingFromThingGroup",
              "iot:AttachThingPrincipal",
              "iot:DetachThingPrincipal",
              "iot:UpdateCertificate",
              "iot:DeleteCertificate",
              "iot:CreatePolicy",
              "iot:AttachPolicy",
              "iot:DetachPolicy",
              "iot:DeletePolicy",
              "iot:GetPolicy",
              "iot:Publish",
              "iot:TagResource",
              "iot:ListThingPrincipals",
              "iot:ListAttachedPolicies",
              "iot:ListTargetsForPolicy",
              "iot:ListThingGroupsForThing",
              "iot:ListThingsInThingGroup",
              "iot:CreateJob",
              "iot:DescribeJob",
              "iot:DescribeJobExecution",
              "iot:CancelJob"
            ],
            "Resource":[
              "arn:aws:iot:*:*:thing/thingName",
              "arn:aws:iot:*:*:thinggroup/thingGroup",
              "arn:aws:iot:*:*:policy/idt-*",
              "arn:aws:iot:*:*:cert/*",
              "arn:aws:iot:*:*:topic/idt-*",
              "arn:aws:iot:*:*:job/*"
            ]
          },
          {
            "Sid":"s3Resources",
            "Effect":"Allow",
            "Action":[
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:CreateBucket",
              "s3:ListBucket",
              "s3:ListBucketVersions",
              "s3:DeleteBucket",
              "s3:PutObjectTagging",
              "s3:PutBucketTagging"
            ],
            "Resource":"arn:aws:s3::*:idt-*"
          },
          {
            "Sid":"roleAliasResources",
            "Effect":"Allow",
            "Action":[
              "iot:CreateRoleAlias",
              "iot:DescribeRoleAlias",
              "iot:DeleteRoleAlias",
              "iot:TagResource",
              "iam:GetRole"
            ],
            "Resource":[
              "arn:aws:iot:*:*:rolealias/roleAlias",
              "arn:aws:iam::*:role/idt-*"
            ]
          },
          {
            "Sid":"idtExecuteAndCollectMetrics",
            "Effect":"Allow",
            "Action":[
              "iot-device-tester:SendMetrics",
              "iot-device-tester:SupportedVersion",
              "iot-device-tester:LatestIdt",
              "iot-device-tester:CheckVersion",
              "iot-device-tester:DownloadTestSuite"
            ],
            "Resource":"*"
          },
          {
            "Sid":"genericResources",
            "Effect":"Allow",
            "Action":[
              "greengrass:*",
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "iot:ListThings",
              "iot:DescribeEndpoint",
              "iot:CreateKeysAndCertificate"
            ],
            "Resource":"*"
          },
          {
            "Sid":"iamResourcesUpdate",
            "Effect":"Allow",
            "Action":[
              "iam:CreateRole",
              "iam:DeleteRole",
              "iam:CreatePolicy",
              "iam:DeletePolicy",
              "iam:AttachRolePolicy",
              "iam:DetachRolePolicy",
              "iam:TagRole",
              "iam:TagPolicy",
              "iam:GetPolicy",
              "iam:ListAttachedRolePolicies",
              "iam:ListEntitiesForPolicy"
            ],
            "Resource":[
              "arn:aws:iam::*:role/idt-*",
              "arn:aws:iam::*:policy/idt-*"
            ]
          }
        ]
      }
      ```
**참고**  
테스트 중인 디바이스의 [토큰 교환 역할로 사용자 지정 IAM 역할](set-config.md#custom-token-exchange-role-idt)을 사용하려면 사용자 지정 IAM 역할 리소스가 허용되도록 정책의 `roleAliasResources` 문과 `passRoleForResources` 문을 업데이트해야 합니다.

   1. 다음 명령을 실행하여 `IDTGreengrassIAMPermissions`라는 고객 관리형 정책을 생성합니다. 이전 단계에서 생성한 JSON 파일의 전체 경로로 `policy.json`을 바꿉니다.

      ```
      aws iam create-policy --policy-name IDTGreengrassIAMPermissions --policy-document file://policy.json
      ```

1. IAM 사용자를 만들고 AWS IoT Greengrass용 IDT에 필요한 권한을 연결합니다.

   1. IAM 사용자를 생성합니다. 이 예제 설정에서 사용자의 이름은 `IDTGreengrassUser`입니다.

      ```
      aws iam create-user --user-name IDTGreengrassUser
      ```

   1. 2단계에서 생성한 `IDTGreengrassIAMPermissions` 정책을 IAM 사용자에게 연결합니다. 명령의 *<account-id>*를의 ID로 바꿉니다 AWS 계정.

      ```
      aws iam attach-user-policy --user-name IDTGreengrassUser --policy-arn arn:aws:iam::<account-id>:policy/IDTGreengrassIAMPermissions
      ```

1. 사용자에 대한 비밀 액세스 키를 만듭니다.

   ```
   aws iam create-access-key --user-name IDTGreengrassUser
   ```

   출력을 안전한 위치에 저장합니다. 나중에이 정보를 사용하여 AWS 자격 증명 파일을 구성합니다.

1. <a name="aws-account-config-next-steps"></a>다음 단계: [물리적 장치](device-config-setup.md)를 구성합니다.

### AWS IoT Device Tester 권한
<a name="gg-idt-managed-policy"></a>

다음 정책은 AWS IoT Device Tester 권한을 설명합니다.

AWS IoT Device Tester 에서는 버전 확인 및 자동 업데이트 기능에 이러한 권한이 필요합니다.
+ `iot-device-tester:SupportedVersion`

  지원되는 제품, 테스트 제품군 및 IDT 버전 목록을 가져올 수 있는 AWS IoT Device Tester 권한을 부여합니다.
+ `iot-device-tester:LatestIdt`

  다운로드할 수 있는 최신 IDT 버전을 가져올 수 있는 AWS IoT Device Tester 권한을 부여합니다.
+ `iot-device-tester:CheckVersion`

  IDT, 테스트 제품군 및 제품의 버전 호환성을 확인할 수 있는 AWS IoT Device Tester 권한을 부여합니다.
+ `iot-device-tester:DownloadTestSuite`

  테스트 제품군 업데이트를 다운로드할 수 있는 AWS IoT Device Tester 권한을 부여합니다.

AWS IoT Device Tester 는 선택적 지표 보고에도 다음 권한을 사용합니다.
+ `iot-device-tester:SendMetrics`

   AWS IoT Device Tester 내부 사용에 대한 지표 AWS 를 수집할 수 있는 권한을 부여합니다. 이 권한을 생략하면 이러한 지표가 수집되지 않습니다.

# IDT 테스트를 실행하도록 장치 구성
<a name="device-config-setup"></a>

IDT에서 디바이스 자격 검증을 위한 테스트를 실행되도록 하려면 디바이스에 액세스하도록 호스트 컴퓨터를 구성하고 디바이스에 대한 사용자 권한을 구성해야 합니다.

## 호스트 컴퓨터의 Java 설치
<a name="install-java-for-idt"></a>

IDT v4.2.0부터에 대한 선택적 검증 테스트를 실행하려면 Java가 AWS IoT Greengrass 필요합니다.

Java 버전 8 이상을 사용할 수 있습니다. [Amazon Corretto](https://aws.amazon.com/corretto/) 또는 [OpenJDK](https://openjdk.java.net/) 장기 지원 버전을 사용하는 것이 좋습니다. 버전 8 이상이 필요합니다.

## 테스트 대상 장치에 액세스하도록 호스트 컴퓨터 구성
<a name="configure-host"></a>

IDT는 호스트 컴퓨터에서 실행되며, SSH를 사용하여 장치에 연결할 수 있어야 합니다. IDT가 테스트 대상 장치에 대한 SSH 액세스를 획득하도록 허용하는 옵션은 두 가지가 있습니다.

1. 여기에서 설명하는 지침에 따라 SSH 키 페어를 생성하고 해당 키가 암호를 지정하지 않고 테스트 대상 장치에 로그인할 수 있도록 권한을 부여합니다.

1. `device.json` 파일의 각 장치에 사용자 이름 및 암호를 제공합니다. 자세한 내용은 [device.json 구성](set-config.md#device-config) 단원을 참조하십시오.

임의의 SSL 구현을 사용하여 SSH 키를 생성할 수 있습니다. 다음 지침은 [SSH-KEYGEN](https://www.ssh.com/ssh/keygen/) 또는 [ PuTTYgen](https://www.ssh.com/ssh/putty/windows/puttygen)(Windows)을 사용하는 방법을 보여줍니다. 다른 SSL 구현을 사용 중인 경우 해당 구현에 대한 설명서를 참조하십시오.

IDT는 SSH 키를 사용하여 테스트 대상 장치에 인증합니다.

**SSH-KEYGEN을 사용하여 SSH 키를 생성하려면**

1. SSH 키를 생성합니다,

   공개 SSH **ssh-keygen** 명령을 사용하여 SSH 키 페어를 생성할 수 있습니다. 이미 호스트 컴퓨터에 SSH 키 페어가 있는 경우 IDT 전용 SSH 키 페어를 생성하는 것이 가장 좋습니다. 그러면 테스트를 완료한 후 호스트 컴퓨터가 더 이상 암호 없이 장치에 연결할 수 없습니다. 또한 원하는 사용자만 원격 장치에 액세스할 수 있도록 제한할 수 있습니다.
**참고**  
Windows에는 SSH 클라이언트가 설치되어 있지 않습니다. Windows에 SSH 클라이언트 설치에 대한 내용은 [SSH 클라이언트 소프트웨어](https://www.ssh.com/ssh/#sec-Download-client-software) 다운로드를 참조하십시오.

   **ssh-keygen** 명령은 키 페어 저장 이름과 경로를 입력하라는 메시지를 표시합니다. 기본적으로 키 페어 파일은 `id_rsa`(프라이빗 키) 및 `id_rsa.pub`(퍼블릭 키)로 이름 지정됩니다. macOS와 Linux에서 이러한 파일의 기본 위치는 `~/.ssh/`입니다. Windows에서 기본 위치는 `C:\Users\<user-name>\.ssh`입니다.

   메시지가 표시되면 SSH 키를 보호하기 위한 키 구문을 입력합니다. 자세한 내용은 [새 SSH 키 생성](https://www.ssh.com/ssh/keygen/)을 참조하십시오.

1. 테스트 대상 장치에 권한 있는 SSH 키를 추가합니다,

   IDT는 SSH 프라이빗 키를 사용하여 테스트 대상 장치에 로그인해야 합니다. 테스트 대상 장치에 로그인하도록 SSH 프라이빗 키를 승인하려면 호스트 컴퓨터의 **ssh-copy-id** 명령을 사용합니다. 이 명령은 테스트 대상 장치에서 `~/.ssh/authorized_keys` 파일에 퍼블릭 키를 추가합니다. 예제:

   **\$1 ssh-copy-id *<remote-ssh-user>*@*<remote-device-ip>***

   여기서 *remote-ssh-user*는 테스트 대상 장치에 로그인하는 데 사용하는 사용자 이름이고, *remote-device-ip*는 테스트를 실행할 테스트 대상 장치의 IP 주소입니다. 예제:

   **ssh-copy-id pi@192.168.1.5**

   메시지가 표시되면 **ssh-copy-id** 명령에서 지정한 사용자 이름에 대한 암호를 입력합니다.

   **ssh-copy-id**는 퍼블릭 키가 `id_rsa.pub`로 이름 지정되고 기본 위치에 저장된다고 가정합니다(macOS와 Linux에서는 `~/.ssh/`, Windows에서는 `C:\Users\<user-name>\.ssh`) 퍼블릭 키의 이름을 다르게 지정하거나 다른 위치에 저장한 경우, **ssh-copy-id**에 **-i** 옵션을 사용하여 SSH 퍼블릭 키의 정규화된 경로를 지정해야 합니다(예: **ssh-copy-id -i \$1/my/path/myKey.pub**). SSH 키 생성 및 퍼블릭 키 복사에 대한 자세한 내용은 [SSH-COPY-ID](https://www.ssh.com/ssh/copy-id)를 참조하십시오.

**PuTTYgen을 사용하여 SSH 키를 생성하려면(Windows만 해당)**

1. 테스트 대상 장치에 OpenSSH 서버 및 클라이언트가 설치되어 있는지 확인합니다. 자세한 내용은 [OpenSSH](https://www.openssh.com/)를 참조하십시오.

1. 테스트 대상 장치에 [PuTTYgen](https://www.puttygen.com/)을 설치합니다.

1. PuTTYgen을 엽니다.

1. **생성**을 선택하고 마우스를 상자 안으로 이동하여 프라이빗 키를 생성합니다.

1. **Conversions(변환)** 메뉴에서 **Export OpenSSH key(OpenSSH 키 내보내기)**를 선택하고 프라이빗 키를 `.pem` 파일 확장명으로 저장합니다.

1. 테스트 대상 장치에서 `/home/<user>/.ssh/authorized_keys` 파일에 퍼블릭 키를 추가합니다.

   1. PuTTYgen 창에서 퍼블릭 키 텍스트를 복사합니다.

   1. PuTTY를 사용하여 테스트 대상 장치에서 세션을 생성합니다.

      1. 명령 프롬프트 또는 Windows Powershell 창에서 다음 명령을 실행합니다.

          **C:/*<path-to-putty>*/putty.exe -ssh *<user>*@*<dut-ip-address>* ** 

      1. 메시지가 표시되면 장치의 암호를 입력합니다.

      1. vi 또는 다른 텍스트 편집기를 사용하여 테스트 대상 장치의 `/home/<user>/.ssh/authorized_keys` 파일에 퍼블릭 키를 추가합니다.

1. 각 테스트 대상 장치에 대해 사용자 이름, IP 주소, 방금 호스트 컴퓨터에 저장한 프라이빗 키 파일의 경로로 `device.json` 파일을 업데이트합니다. 자세한 내용은 [device.json 구성](set-config.md#device-config) 단원을 참조하십시오. 프라이빗 키에 전체 경로 및 파일 이름을 제공하고 슬래시('/')를 사용해야 합니다. 예를 들어 Windows 경로 `C:\DT\privatekey.pem`의 경우 `device.json` 파일에 `C:/DT/privatekey.pem`을 사용합니다.

## Windows 디바이스에 대한 사용자 자격 증명 구성
<a name="configure-windows-user-for-idt"></a>

Windows 기반 디바이스를 검증하려면 다음 사용자에 대해 테스트 중인 디바이스의 LocalSystem 계정에서 사용자 자격 증명을 구성해야 합니다.
+ 기본 Greengrass 사용자(`ggc_user`).
+ 테스트 중인 디바이스에 연결하는 데 사용하는 사용자입니다. [`device.json` 파일](set-config.md#device-config)에서 이 사용자를 구성합니다.

테스트 중인 디바이스의 LocalSystem 계정에서 각 사용자를 생성한 다음에 사용자의 사용자 이름과 암호를 LocalSystem 계정의 Credential Manager 인스턴스에 저장해야 합니다.<a name="set-up-windows-device-environment-procedure"></a>

**Windows 디바이스에서 사용자를 구성하는 방법**

1. 관리자 권한으로 Windows 명령 프롬프트(`cmd.exe`)를 엽니다.

1. Windows 디바이스의 LocalSystem 계정에서 사용자를 생성합니다. 생성하려는 각 사용자에 대해 다음 명령을 실행합니다. 기본 Greengrass 사용자의 경우 *user-name*을 `ggc_user`로 바꿉니다. *암호*를 안전한 암호로 바꿉니다.

   ```
   net user /add user-name password
   ```

1. Microsoft에서 [PsExec 유틸리티](https://docs.microsoft.com/en-us/sysinternals/downloads/psexec)를 다운로드하여 디바이스에 설치합니다.

1. PsExec 유틸리티를 사용하여 기본 사용자의 사용자 이름과 암호를 LocalSystem 계정의 Credential Manager 인스턴스에 저장합니다.

   Credential Manager에서 구성하려는 각 사용자에 대해 다음 명령을 실행합니다. 기본 Greengrass 사용자의 경우 *user-name*을 `ggc_user`로 바꿉니다. 이전에 설정한 사용자의 암호로 *암호*를 바꿉니다.

   ```
   psexec -s cmd /c cmdkey /generic:user-name /user:user-name /pass:password
   ```

   **PsExec License Agreement**가 열리면 **Accept**를 선택하여 라이선스에 동의하고 명령을 실행합니다.
**참고**  
Windows 디바이스에서는 LocalSystem 계정에서 Greengrass nucleus가 실행되며, PsExec 유틸리티를 사용하여 사용자 정보를 LocalSystem 계정에 저장해야 합니다. Credential Manager 애플리케이션을 사용하면 이 정보가 LocalSystem 계정 대신 현재 로그인한 사용자의 Windows 계정에 저장됩니다.

## 장치에서 사용자 권한 구성
<a name="root-access"></a>

IDT는 테스트 대상 장치에서 다양한 디렉터리와 파일에 대해 작업을 수행합니다. 이러한 작업 중 일부는 승격된 권한(**sudo** 사용)이 필요합니다. 이러한 작업을 자동화하려면 IDT for AWS IoT Greengrass V2가 암호를 입력하라는 메시지 없이 sudo로 명령을 실행할 수 있어야 합니다.

암호 입력 메시지 없이 sudo 액세스를 허용하려면 테스트 대상 장치에서 다음 단계를 수행합니다.

**참고**  
`username`은 IDT가 테스트 대상 장치에 액세스하는 데 사용하는 SSH 사용자를 나타냅니다.

**sudo 그룹에 사용자를 추가하려면**

1. 테스트 대상 장치에서 `sudo usermod -aG sudo <username>`을 실행합니다.

1. 변경 사항을 적용하려면 로그아웃했다가 다시 로그인하십시오.

1. 사용자 이름이 성공적으로 추가되었는지 확인하려면 **sudo echo test**를 실행합니다. 암호 입력 메시지가 표시되지 않으면 사용자가 제대로 구성된 것입니다.

1. `/etc/sudoers` 파일을 열고 파일 끝에 다음 줄을 추가합니다.

   `<ssh-username> ALL=(ALL) NOPASSWD: ALL`

## 사용자 지정 토큰 교환 역할 구성
<a name="configure-custom-tes-role-for-idt"></a>

테스트 중인 디바이스가 AWS 리소스와 상호 작용하기 위해 수임하는 토큰 교환 역할로 사용자 지정 IAM 역할을 사용하도록 선택할 수 있습니다. IAM 역할 생성에 대한 자세한 내용은 IAM 사용 설명서의 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html) 섹션을 참조하세요.**

IDT에 사용자 지정 IAM 역할 사용을 허용하려면 다음과 같은 요구 사항을 충족해야 합니다. 이 역할에 필요한 최소 정책 작업만 추가하는 것이 좋습니다.
+ [userdata.json](set-config.md#custom-token-exchange-role-idt) 구성 파일을 업데이트하여 `GreengrassV2TokenExchangeRole` 파라미터를 `true`로 설정해야 합니다.
+ 사용자 지정 IAM 역할은 다음 최소 신뢰 정책으로 구성되어야 합니다.

------
#### [ JSON ]

****  

  ```
  {
     "Version":"2012-10-17",		 	 	 
     "Statement":[
        {
           "Effect":"Allow",
           "Principal":{
              "Service":[
                 "credentials.iot.amazonaws.com",
                 "lambda.amazonaws.com", 
                 "sagemaker.amazonaws.com" 
              ]
           },
           "Action":"sts:AssumeRole"
        }
     ]
  }
  ```

------
+ 사용자 지정 IAM 역할은 다음 최소 권한 정책으로 구성되어야 합니다.

------
#### [ JSON ]

****  

  ```
  {
     "Version":"2012-10-17",		 	 	 
     "Statement":[
        {
           "Effect":"Allow",
           "Action":[
              "iot:DescribeCertificate",
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents",
              "logs:DescribeLogStreams",
              "iot:Connect",
              "iot:Publish",
              "iot:Subscribe",
              "iot:Receive",
              "iot:ListThingPrincipals", 
              "iot:GetThingShadow",
              "iot:UpdateThingShadow",
              "s3:GetBucketLocation",
              "s3:GetObject",
              "s3:PutObject",
              "s3:AbortMultipartUpload",
              "s3:ListMultipartUploadParts"
           ],
           "Resource":"*"
        }
     ]
  }
  ```

------
+ 사용자 지정 IAM 역할의 이름은 테스트 사용자의 IAM 권한에서 지정하는 IAM 역할 리소스와 일치해야 합니다. 기본적으로 [테스트 사용자 정책](dev-tst-prereqs.md#configure-idt-permissions)에서는 역할 이름에 `idt-` 접두사가 있는 IAM 역할에 대한 액세스가 허용됩니다. IAM 역할 이름에 이 접두사가 사용되지 않으면 다음 예제와 같이 테스트 사용자 정책의 `roleAliasResources` 문과 `passRoleForResources` 문에 `arn:aws:iam::*:role/custom-iam-role-name` 리소스를 추가합니다.

    
**Example `passRoleForResources` 명령문**  

  ```
  {
     "Sid":"passRoleForResources",
     "Effect":"Allow",
     "Action":"iam:PassRole",
     "Resource":"arn:aws:iam::*:role/custom-iam-role-name",
     "Condition":{
        "StringEquals":{
           "iam:PassedToService":[
              "iot.amazonaws.com",
              "lambda.amazonaws.com",
              "greengrass.amazonaws.com"
           ]
        }
     }
  }
  ```  
**Example `roleAliasResources` 명령문**  

  ```
  {
     "Sid":"roleAliasResources",
     "Effect":"Allow",
     "Action":[
        "iot:CreateRoleAlias",
        "iot:DescribeRoleAlias",
        "iot:DeleteRoleAlias",
        "iot:TagResource",
        "iam:GetRole"
     ],
     "Resource":[
        "arn:aws:iot:*:*:rolealias/idt-*",
        "arn:aws:iam::*:role/custom-iam-role-name"
     ]
  }
  ```

## 선택적 기능을 테스트하도록 장치 구성
<a name="optional-feature-config"></a>

이 섹션에는 선택적 Docker 및 기계 학습(ML) 특성에 대한 IDT 테스트 실행에 대한 디바이스 요구 사항이 설명되어 있습니다. ML 특성은 IDT v4.9.3에서만 지원됩니다. 이러한 특성을 테스트하려는 경우에만 디바이스에서 이러한 요구 사항이 충족되는지 확인해야 합니다. 그렇지 않은 경우 [AWS IoT Greengrass 검증 제품군을 실행하도록 IDT 설정 구성](set-config.md)를 계속 진행합니다.

**Topics**
+ [Docker 검증 요구 사항](#idt-config-docker-components)
+ [ML 검증 요구 사항](#idt-config-ml-components)
+ [HSM 검증 요구 사항](#idt-config-hsm-components)

### Docker 검증 요구 사항
<a name="idt-config-docker-components"></a>

IDT for AWS IoT Greengrass V2는 디바이스가 AWS제공 Docker [애플리케이션 관리자 구성 요소를 사용하여 사용자 지정 Docker](docker-application-manager-component.md) 컨테이너 구성 요소를 사용하여 실행할 수 있는 Docker 컨테이너 이미지를 다운로드할 수 있는지 검증하는 Docker 검증 테스트를 제공합니다. 사용자 지정 Docker 구성 요소 생성에 대한 내용은 [Docker 컨테이너 실행](run-docker-container.md) 섹션을 참조하세요.

Docker 검증 테스트를 실행하려면 테스트 중인 디바이스에서 Docker 애플리케이션 관리자 구성 요소가 배포되도록 다음과 같은 요구 사항이 충족되어야 합니다.
+ <a name="docker-engine-requirement"></a>Greengrass 코어 디바이스에 [Docker Engine](https://docs.docker.com/engine/) 1.9.1 이상이 설치되어 있어야 합니다. 버전 20.10은 AWS IoT Greengrass 코어 소프트웨어에서 작동하는 것으로 확인된 최신 버전입니다. Docker 컨테이너를 실행하는 구성 요소를 배포하기 전에 코어 디바이스에 직접 Docker를 설치해야 합니다.
+ <a name="docker-daemon-requirement"></a>이 구성 요소를 배포하기 전에 Docker 대몬이 코어 디바이스에서 시작되어 실행되고 있습니다.
+ <a name="docker-user-permissions-requirement"></a>Docker 컨테이너 구성 요소를 실행하는 시스템 사용자에게 루트 또는 관리자 권한이 있거나 루트 또는 관리자가 아닌 사용자로 실행하도록 Docker를 구성해야 합니다.
  + Linux 디바이스에서는 `docker` 그룹에 사용자를 추가하여 `sudo` 없이 `docker` 명령을 직접적으로 호출할 수 있습니다.
  + Windows 디바이스에서는 `docker-users` 그룹에 사용자를 추가하여 관리자 권한 없이 `docker` 명령을 직접적으로 호출할 수 있습니다.

------
#### [ Linux or Unix ]

  Docker 컨테이너 구성 요소를 실행하는 데 사용하는 `ggc_user` 또는 루트 사용자가 아닌 사용자를 `docker` 그룹에 추가하려면 다음 명령을 실행합니다.

  ```
  sudo usermod -aG docker ggc_user
  ```

  자세한 내용은 [루트 사용자가 아닌 사용자로 Docker 관리](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)를 참조하세요.

------
#### [ Windows Command Prompt (CMD) ]

  `ggc_user` 또는 Docker 컨테이너 구성 요소를 실행하는 데 사용하는 사용자를 `docker-users` 그룹에 추가하려면 관리자로 다음 명령을 실행합니다.

  ```
  net localgroup docker-users ggc_user /add
  ```

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

  `ggc_user` 또는 Docker 컨테이너 구성 요소를 실행하는 데 사용하는 사용자를 `docker-users` 그룹에 추가하려면 관리자로 다음 명령을 실행합니다.

  ```
  Add-LocalGroupMember -Group docker-users -Member ggc_user
  ```

------

### ML 검증 요구 사항
<a name="idt-config-ml-components"></a>

**참고**  
기계 학습 특성은 IDT v4.9.3에서만 지원됩니다.

IDT for AWS IoT Greengrass V2는 디바이스가 AWS제공 [기계 학습 구성 요소를](machine-learning-components.md) 사용하여 [딥 러닝 런타임](https://github.com/neo-ai/neo-ai-dlr) 또는 [TensorFlow Lite](https://www.tensorflow.org/lite/guide/python) ML 프레임워크를 사용하여 로컬에서 ML 추론을 수행할 수 있는지 검증하는 ML 검증 테스트를 제공합니다. Greengrass 디바이스의 ML 추론 실행에 대한 자세한 내용은 [기계 학습 추론 수행](perform-machine-learning-inference.md) 섹션을 참조하세요.

ML 검증 테스트를 실행하려면 테스트 중인 디바이스에서 기계 학습 구성 요소가 배포되도록 다음과 같은 요구 사항이 충족되어야 합니다.<a name="ml-component-requirements"></a>
+ Amazon Linux 2 또는 Ubuntu 18.04를 실행 중인 Greengrass 코어 디바이스의 경우 [GNU C 라이브러리](https://www.gnu.org/software/libc/)(glibc) 버전 2.27 이상이 디바이스에 설치되어 있어야 합니다.
+ Raspberry Pi와 같은 Armv7l 디바이스에는 디바이스에 OpenCV-Python에 대한 종속성이 설치되어 있어야 합니다. 다음 명령을 실행하여 종속성을 설치합니다.

  ```
  sudo apt-get install libopenjp2-7 libilmbase23 libopenexr-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk-3-0 libwebp-dev
  ```
+ Raspberry Pi OS Bullseye를 실행하는 Raspberry Pi 디바이스는 다음과 같은 요구 사항을 충족해야 합니다.
  + 디바이스에 NumPy 1.22.4 이상이 설치되어 있어야 합니다. Raspberry Pi OS Bullseye에는 이전 버전의 NumPy가 포함되어 있으므로 다음 명령을 실행하여 디바이스에서 NumPy를 업그레이드할 수 있습니다.

    ```
    pip3 install --upgrade numpy
    ```
  + 디바이스에서 레거시 카메라 스택이 활성화되어 있어야 합니다. Raspberry Pi OS Bullseye에는 기본적으로 활성화되어 있지만 호환되지 않는 새 카메라 스택이 포함되어 있으므로 레거시 카메라 스택을 활성화해야 합니다.<a name="raspberry-pi-bullseye-enable-legacy-camera-stack"></a>

**레거시 카메라 스택을 활성화하려면**

    1. 다음 명령을 실행하여 Raspberry Pi 구성 도구를 엽니다.

       ```
       sudo raspi-config
       ```

    1. **인터페이스 옵션**을 선택합니다.

    1. **레거시 카메라**를 선택하여 레거시 카메라 스택을 활성화합니다.

    1. Raspberry Pi를 재부팅합니다.

### HSM 검증 요구 사항
<a name="idt-config-hsm-components"></a>

AWS IoT Greengrass 는 디바이스의 [PKCS 하드웨어 보안 모듈(HSM)과 통합하기 위한 PKCS\$111 공급자 구성 요소를](pkcs11-provider-component.md) 제공합니다. HSM 설정은 디바이스 및 선택한 HSM 모듈에 따라 다릅니다. [IDT 구성 설정](set-config.md)에 문서화되어 있는 대로 예상 HSM 구성이 제공되는 한 이 선택적 특성 검증 테스트 실행에 필요한 정보가 IDT에 있습니다.

# AWS IoT Greengrass 검증 제품군을 실행하도록 IDT 설정 구성
<a name="set-config"></a>

테스트를 실행하기 전에 호스트 컴퓨터에서 AWS 자격 증명 및 디바이스에 대한 설정을 구성해야 합니다.

## config.json에서 AWS 자격 증명 구성
<a name="cfg-aws-gg"></a>

`<device_tester_extract_location>/configs/config.json` 파일에서 IAM 사용자 보안 인증을 구성해야 합니다. 에서 생성된 IDT for AWS IoT Greengrass V2 사용자의 자격 증명을 사용합니다[생성 및 구성 AWS 계정](dev-tst-prereqs.md#config-aws-account-for-idt). 두 가지 방법 중 하나로 자격 증명을 지정할 수 있습니다.
+ 자격 증명 파일에서
+ 환경 변수로

### AWS 자격 증명 파일을 사용하여 자격 증명 구성
<a name="config-cred-file"></a>

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`

다음 형식으로 자격 AWS 증명을 `credentials` 파일에 추가합니다.

```
[default]
aws_access_key_id = <your_access_key_id>
aws_secret_access_key = <your_secret_access_key>
```

`credentials` 파일의 AWS 자격 증명을 사용하도록 IDT for AWS IoT Greengrass V2를 구성하려면 다음과 같이 `config.json` 파일을 편집합니다.

```
{
  "awsRegion": "region",
  "auth": {
    "method": "file",
    "credentials": {
      "profile": "default"
    }
  }
}
```

**참고**  
`default` AWS 프로필을 사용하지 않는 경우 `config.json` 파일에서 프로필 이름을 변경해야 합니다. 자세한 내용은 [명명된 프로필](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)을 참조하십시오.

### 환경 변수를 사용하여 AWS 자격 증명 구성
<a name="config-env-vars"></a>

환경 변수는 운영 체제에서 유지 관리하고 시스템 명령에서 사용하는 변수입니다. 이들은 SSH 세션을 닫으면 저장되지 않습니다. IDT for AWS IoT Greengrass V2는 `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를 구성하려면 `config.json` 파일에서 `auth` 섹션을 편집합니다. 다음 예를 참고하세요

```
{
  "awsRegion": "region",
  "auth": {
    "method": "environment"
  }
}
```

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

**참고**  
IDT v4.9.3은 `ml`, `docker`, `streamManagement` 기능 테스트를 지원합니다. IDT v4.9.4 이상 버전은 `docker` 테스트를 지원합니다. 이러한 기능을 테스트하지 않으려면 해당 값을 `no`로 설정합니다.

자격 AWS 증명 외에도 IDT for AWS IoT Greengrass V2에는 테스트가 실행되는 디바이스에 대한 정보가 필요합니다. IP 주소, 로그인 정보, 운영 체제, CPU 아키텍처가 예제 정보가 될 수 있습니다.

` <device_tester_extract_location>/configs/device.json`에 있는 `device.json` 템플릿을 사용하여 이 정보를 제공해야 합니다.

------
#### [ IDT v4.9.3 ]

```
[
  {
    "id": "<pool-id>",
    "sku": "<sku>",
    "features": [
      {
        "name": "arch",
        "value": "x86_64 | armv6l | armv7l | aarch64"
      },
      {
        "name": "ml",
        "value": "dlr | tensorflowlite | dlr,tensorflowlite | no"
      },
      {
        "name": "docker",
        "value": "yes | no"
      },
      {
        "name": "streamManagement",
        "value": "yes | no"
      }, 
      {
        "name": "hsi", 
        "value": "hsm | no" 
      }
    ],
    "devices": [
      {
        "id": "<device-id>",
        "operatingSystem": "Linux | Windows",
        "connectivity": {
          "protocol": "ssh",
          "ip": "<ip-address>",
          "port": 22,
          "publicKeyPath": "<public-key-path>",
          "auth": {
            "method": "pki | password",
            "credentials": {
              "user": "<user-name>",
              "privKeyPath": "/path/to/private/key",
              "password": "<password>"
            }
          }
        }
      }
    ]
  }
]
```

**참고**  
`method`가 `pki`로 설정된 경우에만 `privKeyPath`를 지정합니다.  
`method`가 `password`로 설정된 경우에만 `password`를 지정합니다.

여기에 설명된 대로 값을 포함하는 모든 속성은 필수입니다.

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

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

`features`  
장치의 지원되는 기능이 포함된 배열입니다. 모든 기능이 필요합니다.    
`arch`  
테스트 실행이 검증하는 지원되는 운영 체제 아키텍처. 유효값은 다음과 같습니다.  
+ `x86_64`
+ `armv6l`
+ `armv7l`
+ `aarch64`  
`ml`  
<a name="description-ml"></a>디바이스가 AWS제공 기계 학습(ML) 구성 요소를 사용하는 데 필요한 모든 기술 종속성을 충족하는지 확인합니다.  
또한 이 기능을 활성화하면 <a name="description-ml-inference-phrase"></a>디바이스가 [딥 러닝 런타임](https://github.com/neo-ai/neo-ai-dlr) 및 [TensorFlow Lite](https://www.tensorflow.org/lite/guide/python) ML 프레임워크를 사용하여 ML 추론을 수행할 수 있는지 검증합니다.  
유효한 값은 `dlr` 및 `tensorflowlite` 또는 `no`의 모든 조합입니다.  
`docker`  
<a name="description-docker"></a>디바이스가 AWS제공 Docker 애플리케이션 관리자(`aws.greengrass.DockerApplicationManager`) 구성 요소를 사용하는 데 필요한 모든 기술 종속성을 충족하는지 확인합니다.  
또한 이 기능을 활성화하면 <a name="description-docker-app-manager-qual-phrase"></a>디바이스가 Amazon ECR에서 Docker 컨테이너 이미지를 다운로드할 수 있는지 검증합니다.  
유효한 값은 `yes` 또는 `no`의 모든 조합입니다.  
`streamManagement`  
<a name="description-sm"></a>디바이스가 [AWS IoT Greengrass 스트림 관리자](manage-data-streams.md)를 다운로드, 설치 및 실행할 수 있는지 확인합니다.  
유효한 값은 `yes` 또는 `no`의 모든 조합입니다.  
`hsi`  
<a name="description-hsi"></a>디바이스가 하드웨어 보안 모듈(HSM)에 저장된 프라이빗 키와 인증서를 사용하여 AWS IoT 및 AWS IoT Greengrass 서비스에 대한 연결을 인증할 수 있는지 확인합니다. 또한이 테스트는 AWS제공 [PKCS\$111 공급자 구성 요소가](pkcs11-provider-component.md) 공급업체 제공 PKCS\$111 라이브러리를 사용하여 HSM과 인터페이스할 수 있는지 확인합니다. 자세한 내용은 [하드웨어 보안 통합](hardware-security.md) 단원을 참조하십시오.  
유효한 값은 `hsm` 또는 `no`입니다.
`hsi` 테스트는 IDT v4.9.3 이상 버전에서만 사용할 수 있습니다.

`devices.id`  
테스트 대상 디바이스의 고유한 사용자 정의 식별자입니다.

`devices.operatingSystem`  
디바이스 운영 체제. 지원되는 값은 `Linux` 및 `Windows`입니다.

`connectivity.protocol`  
이러한 디바이스와 통신하는 데 사용되는 통신 프로토콜입니다. 현재 지원되는 유일한 값은 물리적 디바이스에 대한 `ssh` 값입니다.

`connectivity.ip`  
테스트 대상 디바이스의 IP 입니다.  
<a name="connectivity-protocol-ssh-only"></a>이 속성은 `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`을 사용해야 합니다. 동일한 IP 주소가 있는 항목이 여러 개 있는 경우 IDT에서 사용하는 키 유형에 대한 항목이 파일의 다른 항목보다 앞에 있어야 합니다.

`connectivity.auth`  
연결에 대한 인증 정보입니다.  
<a name="connectivity-protocol-ssh-only"></a>이 속성은 `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`  
테스트 대상 디바이스에 로그인하기 위한 사용자 이름입니다.

------
#### [ IDT v4.9.4 ]

```
[
  {
    "id": "<pool-id>",
    "sku": "<sku>",
    "features": [
      {
        "name": "arch",
        "value": "x86_64 | armv6l | armv7l | aarch64"
      },
      {
        "name": "docker",
        "value": "yes | no"
      }, 
      {
        "name": "hsi", 
        "value": "hsm | no" 
      }
    ],
    "devices": [
      {
        "id": "<device-id>",
        "operatingSystem": "Linux | Windows",
        "connectivity": {
          "protocol": "ssh",
          "ip": "<ip-address>",
          "port": 22,
          "publicKeyPath": "<public-key-path>",
          "auth": {
            "method": "pki | password",
            "credentials": {
              "user": "<user-name>",
              "privKeyPath": "/path/to/private/key",
              "password": "<password>"
            }
          }
        }
      }
    ]
  }
]
```

**참고**  
`method`가 `pki`로 설정된 경우에만 `privKeyPath`를 지정합니다.  
`method`가 `password`로 설정된 경우에만 `password`를 지정합니다.

여기에 설명된 대로 값을 포함하는 모든 속성은 필수입니다.

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

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

`features`  
장치의 지원되는 기능이 포함된 배열입니다. 모든 기능이 필요합니다.    
`arch`  
테스트 실행이 검증하는 지원되는 운영 체제 아키텍처. 유효값은 다음과 같습니다.  
+ `x86_64`
+ `armv6l`
+ `armv7l`
+ `aarch64`  
`docker`  
<a name="description-docker"></a>디바이스가 AWS제공 Docker 애플리케이션 관리자(`aws.greengrass.DockerApplicationManager`) 구성 요소를 사용하는 데 필요한 모든 기술 종속성을 충족하는지 확인합니다.  
또한 이 기능을 활성화하면 <a name="description-docker-app-manager-qual-phrase"></a>디바이스가 Amazon ECR에서 Docker 컨테이너 이미지를 다운로드할 수 있는지 검증합니다.  
유효한 값은 `yes` 또는 `no`의 모든 조합입니다.  
`hsi`  
<a name="description-hsi"></a>디바이스가 하드웨어 보안 모듈(HSM)에 저장된 프라이빗 키와 인증서를 사용하여 AWS IoT 및 AWS IoT Greengrass 서비스에 대한 연결을 인증할 수 있는지 확인합니다. 또한이 테스트는 AWS제공 [PKCS\$111 공급자 구성 요소가](pkcs11-provider-component.md) 공급업체 제공 PKCS\$111 라이브러리를 사용하여 HSM과 인터페이스할 수 있는지 확인합니다. 자세한 내용은 [하드웨어 보안 통합](hardware-security.md) 단원을 참조하십시오.  
유효한 값은 `hsm` 또는 `no`입니다.
`hsi` 테스트는 IDT v4.9.3 이상 버전에서만 사용할 수 있습니다.

`devices.id`  
테스트 대상 디바이스의 고유한 사용자 정의 식별자입니다.

`devices.operatingSystem`  
디바이스 운영 체제. 지원되는 값은 `Linux` 및 `Windows`입니다.

`connectivity.protocol`  
이러한 디바이스와 통신하는 데 사용되는 통신 프로토콜입니다. 현재 지원되는 유일한 값은 물리적 디바이스에 대한 `ssh` 값입니다.

`connectivity.ip`  
테스트 대상 디바이스의 IP 입니다.  
<a name="connectivity-protocol-ssh-only"></a>이 속성은 `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`을 사용해야 합니다. 동일한 IP 주소가 있는 항목이 여러 개 있는 경우 IDT에서 사용하는 키 유형에 대한 항목이 파일의 다른 항목보다 앞에 있어야 합니다.

`connectivity.auth`  
연결에 대한 인증 정보입니다.  
<a name="connectivity-protocol-ssh-only"></a>이 속성은 `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`  
테스트 대상 디바이스에 로그인하기 위한 사용자 이름입니다.

------

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

또한 IDT for AWS IoT Greengrass V2에는 테스트 아티팩트 및 AWS IoT Greengrass 소프트웨어의 위치에 대한 추가 정보가 필요합니다.

` <device_tester_extract_location>/configs/userdata.json`에 있는 `userdata.json` 템플릿을 사용하여 이 정보를 제공해야 합니다.

```
{
    "TempResourcesDirOnDevice": "/path/to/temp/folder",
    "InstallationDirRootOnDevice": "/path/to/installation/folder",
    "GreengrassNucleusZip": "/path/to/aws.greengrass.nucleus.zip",
    "PreInstalled": "yes/no",
    "GreengrassV2TokenExchangeRole": "custom-iam-role-name",
	"hsm": {
        "greengrassPkcsPluginJar": "/path/to/aws.greengrass.crypto.Pkcs11Provider-latest.jar",
        "pkcs11ProviderLibrary": "/path/to/pkcs11-vendor-library",
        "slotId": "slot-id",
        "slotLabel": "slot-label",
        "slotUserPin": "slot-pin",
        "keyLabel": "key-label",
        "preloadedCertificateArn": "certificate-arn"
        "rootCA": "path/to/root-ca"
    }
}
```

여기에 설명된 대로 값을 포함하는 모든 속성은 필수입니다.

`TempResourcesDirOnDevice`  
테스트 아티팩트를 저장할 테스트 대상 디바이스의 임시 폴더 전체 경로. 이 디렉터리에 쓰는 데 sudo 권한이 필요하지 않은지 확인합니다.  
IDT는 테스트 실행이 완료되면 이 폴더의 콘텐츠를 삭제합니다.

`InstallationDirRootOnDevice`  
 AWS IoT Greengrass를 설치할 디바이스의 폴더의 전체 경로. 사전 설치된 Greengrass의 경우 이는 Greengrass 설치 디렉터리의 경로입니다.  
이 폴더에 필요한 파일 권한을 설정해야 합니다. 설치 경로의 각 폴더에 대해 다음 명령을 실행합니다.  

```
sudo chmod 755 folder-name
```

`GreengrassNucleusZip`  
호스트 컴퓨터의 Greengrass nucleus ZIP(`greengrass-nucleus-latest.zip`) 파일의 전체 경로. 이 필드는 사전 설치된 Greengrass를 사용한 테스트에는 필요하지 않습니다.  
용 IDT용 Greengrass nucleus의 지원되는 버전에 대한 자세한 내용은 섹션을 AWS IoT Greengrass참조하세요[AWS IoT Greengrass V2의 최신 IDT 버전](dev-test-versions.md#idt-latest-version). 최신 Greengrass 소프트웨어를 다운로드하려면 [AWS IoT Greengrass 소프트웨어 다운로드를](https://docs.aws.amazon.com/greengrass/v2/developerguide/dev-tst-prereqs.html#config-gg) 참조하세요.

`PreInstalled`  
이 기능은 Linux 디바이스의 IDT v4.5.8 이상 버전에서만 사용할 수 있습니다.  
(선택 사항) 값이 *Yes*인 경우 IDT는 `InstallationDirRootOnDevice`에 언급된 경로를 Greengrass가 설치된 디렉터리라고 가정합니다.  
디바이스에 Greengrass를 설치하는 방법에 대한 자세한 내용은 [자동 리소스 프로비저닝을 사용하여 AWS IoT Greengrass 코어 소프트웨어 설치](quick-installation.md) 섹션을 참조하세요. [수동 프로비저닝을 사용하여를 설치하는](https://docs.aws.amazon.com/greengrass/v2/developerguide/manual-installation.html) 경우 AWS IoT 사물을 수동으로 생성할 때 “새 사물 또는 기존 사물 그룹에 [AWS IoT 사물](https://docs.aws.amazon.com/greengrass/v2/developerguide/manual-installation.html#create-iot-thing) 추가” 단계를 포함합니다. IDT는 설치 설정 중에 사물 그룹이 생성된다고 가정합니다. 이러한 값이 `effectiveConfig.yaml` 파일에 반영되어 있는지 확인합니다. IDT는 `<InstallationDirRootOnDevice>/config/effectiveConfig.yaml`에서 `effectiveConfig.yaml` 파일을 확인합니다.  
HSM을 사용하여 테스트를 실행하려면 `aws.greengrass.crypto.Pkcs11Provider` 필드가 `effectiveConfig.yaml`에서 업데이트되었는지 확인합니다.

  `GreengrassV2TokenExchangeRole`  
(선택 사항) 테스트 중인 디바이스가 AWS 리소스와 상호 작용하기 위해 수임하는 토큰 교환 역할로 사용할 사용자 지정 IAM 역할.  
IDT는 테스트 실행 중에 기본 토큰 교환 역할을 생성하는 대신 이 사용자 지정 IAM 역할을 사용합니다. 사용자 지정 역할을 사용하는 경우 [테스트 사용자에 대한 IAM 권한](dev-tst-prereqs.md#configure-idt-permissions)을 업데이트하여 사용자가 IAM 역할 및 정책을 생성하고 삭제할 수 있도록 허용하는 `iamResourcesUpdate` 문을 제외할 수 있습니다.
사용자 지정 IAM 역할을 토큰 교환 역할로 생성하는 방법에 대한 자세한 내용은 [사용자 지정 토큰 교환 역할 구성](device-config-setup.md#configure-custom-tes-role-for-idt) 섹션을 참조하세요.

`hsm`  
이 기능은 IDT v4.5.1 이상에서 사용할 수 있습니다.  
(선택 사항) AWS IoT Greengrass 하드웨어 보안 모듈(HSM)을 사용하여 테스트하기 위한 구성 정보. 그렇지 않으면 `hsm` 속성을 생략해야 합니다. 자세한 내용은 [하드웨어 보안 통합](hardware-security.md) 단원을 참조하십시오.  
<a name="connectivity-protocol-ssh-only"></a>이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
하드웨어 보안 모듈이 IDT와 다른 시스템 간에 공유되는 경우 HSM 구성은 민감한 데이터로 간주될 수 있습니다. 이러한 경우 구성 값을 AWS Parameter·Store SecureString 파라미터에 저장하고 테스트 실행 중에 가져오도록 IDT를 구성하여 일반 텍스트로 보호하지 않을 수 있습니다. 자세한 내용은 [AWS 파라미터 스토어에서 구성 가져오기](#fetch-config) 섹션을 참조하세요.  
`hsm.greengrassPkcsPluginJar`  
IDT 호스트 시스템에 다운로드하는 [PKCS\$111 공급자 구성 요소](pkcs11-provider-component.md)의 전체 경로. AWS IoT Greengrass 는 이 구성 요소를 설치하는 중 프로비저닝 플러그인으로 지정하기 위해 다운로드할 수 있는 JAR 파일로 제공합니다. 다음 URL([https://d2s8p88vqu9w66.cloudfront.net/releases/Pkcs11Provider/aws.greengrass.crypto.Pkcs11Provider-latest.jar](https://d2s8p88vqu9w66.cloudfront.net/releases/Pkcs11Provider/aws.greengrass.crypto.Pkcs11Provider-latest.jar))에서 최신 버전의 구성 요소 JAR 파일을 다운로드할 수 있습니다.  
`hsm.pkcs11ProviderLibrary`  
하드웨어 보안 모듈(HSM) 공급업체가 HSM과 상호 작용하기 위해 제공하는 PKCS\$111 라이브러리의 전체 경로.  
`hsm.slotId`  
키와 인증서를 로드하는 HSM 슬롯을 식별하는 데 사용되는 슬롯 ID.  
`hsm.slotLabel`  
키와 인증서를 로드하는 HSM 슬롯을 식별하는 데 사용되는 슬롯 레이블.  
`hsm.slotUserPin`  
IDT가 AWS IoT Greengrass 코어 소프트웨어를 HSM에 인증하는 데 사용하는 사용자 PIN입니다.  
보안 모범 사례로 프로덕션 디바이스에서 동일한 사용자 PIN을 사용하지 마세요.  
`hsm.keyLabel`  
하드웨어 모듈에서 키를 식별하는 데 사용되는 레이블입니다. 키와 인증서 모두 동일한 키 레이블을 사용해야 합니다.  
`hsm.preloadedCertificateArn`  
 AWS IoT 클라우드에 업로드한 디바이스 인증서의 Amazon 리소스 이름(ARN).  
이전에 HSM의 키를 사용하여이 인증서를 생성하고 HSM으로 가져온 다음 AWS IoT 클라우드에 업로드해야 합니다. 인증서 생성 및 가져오기에 대한 자세한 내용은 HSM에 대한 설명서를 참조하세요.  
인증서를 [config.json](#cfg-aws-gg)에 제공한 것과 동일한 계정 및 리전에 인증서를 업로드해야 합니다. 인증서를에 업로드하는 방법에 대한 자세한 내용은 *AWS IoT 개발자 안내서*의 [수동으로 클라이언트 인증서 등록](https://docs.aws.amazon.com/iot/latest/developerguide/manual-cert-registration.html)을 AWS IoT참조하세요.  
`hsm.rootCAPath`  
(선택 사항) 인증서를 서명한 루트 인증 기관(CA)에 대한 IDT 호스트 컴퓨터의 전체 경로. 이는 생성한 HSM의 인증서가 Amazon 루트 CA에 의해 서명하지 않은 경우에 필요합니다.

## AWS 파라미터 스토어에서 구성 가져오기
<a name="fetch-config"></a>

AWS IoT 디바이스 테스터(IDT)에는 [AWS Systems Manager 파라미터 스토어](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)에서 구성 값을 가져오는 선택적 기능이 포함되어 있습니다. AWS 파라미터 스토어는 안전하고 암호화된 구성 저장을 허용합니다. 구성된 경우 IDT는 파라미터를 `userdata.json` 파일 내부의 일반 텍스트로 저장하는 대신 파라미터 AWS 스토어에서 파라미터를 가져올 수 있습니다. 이는 암호, PIN, 기타 보안 암호와 같이 암호화된 상태로 저장해야 하는 민감한 데이터에 유용합니다.

1. 이 기능을 사용하려면 [IDT 사용자](https://docs.aws.amazon.com/greengrass/v2/developerguide/dev-tst-prereqs.html)를 생성하는 데 사용되는 권한을 업데이트하여 IDT가 사용하도록 구성된 파라미터에 대한 GetParameter 작업을 허용해야 합니다. 다음은 IDT 사용자에게 추가할 수 있는 권한 문의 예제입니다. 자세한 내용은 [AWS Systems Manager 사용 설명서](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html)를 참조하세요.

   ```
   {
          "Sid":"parameterStoreResources",
          "Effect": "Allow",
           "Action": [
               "ssm:GetParameter"
           ],
           "Resource": "arn:aws:ssm:*:*:parameter/IDT*"
   }
   ```

   위 권한은 와일드카드 문자(`IDT`)를 사용하여 이름이 `*`로 시작하는 모든 파라미터를 가져올 수 있도록 구성되었습니다. 사용 중인 파라미터의 이름에 따라 IDT가 구성되어 있는 파라미터를 가져올 수 있도록 필요에 따라 이를 사용자 지정해야 합니다.

1.  AWS Paramater Store 내에 구성 값을 저장해야 합니다. 이 작업은 AWS 콘솔 또는 AWS CLI에서 수행할 수 있습니다. AWS Parameter Store를 사용하면 암호화되거나 암호화되지 않은 스토리지를 선택할 수 있습니다. 보안 암호, PIN 등 민감한 값을 저장하려면 SecureString의 파라미터 유형인 암호화된 옵션을 사용해야 합니다. AWS CLI를 사용하여 파라미터를 업로드하려면 다음 명령을 사용할 수 있습니다.

   ```
   aws ssm put-parameter --name IDT-example-name --value IDT-example-value --type SecureString
   ```

   다음 명령을 사용하여 파라미터가 저장되었는지 확인할 수 있습니다. (선택 사항) `--with-decryption` 플래그를 사용하여 해독된 SecureString 파라미터를 가져옵니다.

   ```
   aws ssm get-parameter --name IDT-example-name
   ```

    AWS CLI를 사용하면 현재 CLI 사용자의 AWS 리전에 파라미터가 업로드되고 IDT는에 구성된 리전에서 파라미터를 가져옵니다`config.json`. AWS CLI에서 리전을 확인하려면 다음을 사용합니다.

   ```
   aws configure get region
   ```

1.  AWS 클라우드에 구성 값이 있으면 IDT 구성 내의 모든 값을 업데이트하여 AWS 클라우드에서 가져올 수 있습니다. 이렇게 하려면 양식의 IDT 구성에 자리 표시자를 사용하여 파라미터 스토어에서 해당 이름으로 AWS 파라미터를 `{{AWS.Parameter.parameter_name}}` 가져옵니다.

   예를 들어 2단계의 `IDT-example-name` 파라미터를 HSM 구성의 HSM keyLabel로 사용하려는 경우를 가정해 보겠습니다. 이렇게 하려면 다음과 같이 `userdata.json`을 업데이트하면 됩니다.

   ```
   "hsm": {
           "keyLabel": "{{AWS.Parameter.IDT-example-name}}",
           [...]
       }
   ```

   IDT는 2단계에서 `IDT-example-value`로 설정된 런타임에서 이 파라미터의 값을 가져옵니다. 이 구성은 설정과 유사`"keyLabel": "IDT-example-value"`하지만 대신 해당 값은 AWS 클라우드에 암호화된 상태로 저장됩니다.

# AWS IoT Greengrass 검증 제품군 실행
<a name="run-tests"></a>

[필수 구성을 설정](set-config.md)한 후 테스트를 시작할 수 있습니다. 전체 테스트 제품군의 실행 시간은 하드웨어에 따라 다릅니다. 참조를 위해, Raspberry Pi 3B에서 전체 테스트 제품군을 완료하는 데 약 30분이 걸립니다.

다음 `run-suite` 명령을 사용하여 테스트 제품군을 실행합니다.

```
devicetester_[linux | mac | win]_x86-64 run-suite  \\
    --suite-id suite-id  \\
    --group-id group-id  \\
    --pool-id your-device-pool \\
    --test-id test-id  \\
    --update-idt y|n  \\
    --userdata userdata.json
```

모든 옵션은 선택 사항입니다. 예를 들어 `device.json` 파일에 정의된 동일한 디바이스의 세트인 디바이스 풀이 하나만 있는 경우 `pool-id`를 생략할 수 있습니다. 또는 `tests` 폴더에서 최신 테스트 제품군 버전을 실행하려면 `suite-id`를 생략할 수 있습니다.

**참고**  
상위 테스트 제품군 버전이 온라인으로 제공되는 경우 IDT가 메시지를 표시합니다. 자세한 내용은 [테스트 제품군 버전](idt-greengrass-qualification.md#idt-test-suite-versions) 단원을 참조하십시오.

## 자격 제품군을 실행하는 예제 명령
<a name="idt-run-suite-examples"></a>

다음 명령줄 예제에서는 디바이스 풀에 대한 자격 테스트를 실행하는 방법을 설명합니다. `run-suite` 및 기타 IDT 명령에 대한 자세한 내용은 [IDT for AWS IoT Greengrass V2 명령](#bk-cli) 섹션을 참조하십시오.

다음 명령을 사용하여 지정된 테스트 제품군에 있는 모든 테스트 그룹을 실행합니다. `list-suites` 명령은 `tests` 폴더에 있는 테스트 제품군을 나열합니다.

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --suite-id GGV2Q_1.0.0 \
    --pool-id <pool-id> \
    --userdata userdata.json
```

다음 명령을 사용하여 테스트 제품군의 특정 테스트 그룹을 실행합니다. `list-groups` 명령은 테스트 제품군의 테스트 그룹을 나열합니다.

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --suite-id GGV2Q_1.0.0 \
    --group-id <group-id> \
    --pool-id <pool-id> \
    --userdata userdata.json
```

다음 명령을 사용하여 테스트 그룹의 특정 테스트 사례를 실행합니다.

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --group-id <group-id> \
    --test-id <test-id> \
    --userdata userdata.json
```

다음 명령을 사용하여 테스트 그룹의 여러 테스트 사례를 실행합니다.

```
devicetester_[linux | mac | win]_x86-64 run-suite \
    --group-id <group-id> \
    --test-id <test-id1>,<test-id2>
    --userdata userdata.json
```

다음 명령을 사용하여 테스트 그룹의 모든 테스트 사례를 나열합니다.

```
devicetester_[linux | mac | win]_x86-64 list-test-cases --group-id <group-id>
```

테스트 그룹 종속성을 올바른 순서로 실행하는 전체 자격 테스트 제품군을 실행하는 것이 좋습니다. 특정 테스트 그룹을 실행하기로 선택한 경우 관련 테스트 그룹을 실행하기 전에 먼저 종속성 검사기 테스트 그룹을 실행하여 모든 Greengrass 종속성이 설치되어 있는지 확인하는 것이 좋습니다. 예제:
+ 코어 자격 테스트 그룹을 실행하기 전에 `coredependencies`를 실행합니다.

## IDT for AWS IoT Greengrass V2 명령
<a name="bk-cli"></a>

IDT 명령은 `<device-tester-extract-location>/bin` 디렉터리에 있습니다. 테스트 제품군을 실행하려면 다음 형식으로 명령을 입력합니다.

`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`  
지원되는 제품,이 경우 AWS IoT Greengrass 버전 및 현재 IDT 버전에 대한 테스트 제품군 버전을 나열합니다.

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

`run-suite`  
장치의 풀에 대해 테스트 제품군을 실행합니다. 지원되는 몇 가지 옵션은 다음과 같습니다.  
+ `suite-id`. 실행할 테스트 제품군 버전입니다. 지정하지 않으면 IDT는 `tests` 폴더의 최신 버전을 사용합니다.
+ `group-id`. 실행할 테스트 그룹(쉼표로 구분된 목록). 지정되지 않은 경우 IDT는 `device.json`에서 구성된 설정에 따라 테스트 제품군에서 모든 적절한 테스트 그룹을 실행합니다. IDT는 구성된 설정에 따라 디바이스가 지원하지 않는 테스트 그룹이 `group-id` 목록에 지정되어 있더라도 테스트 그룹을 실행하지 않습니다.
+ `test-id`. 실행할 테스트 케이스(쉼표로 구분된 목록). 지정된 경우, `group-id`은(는) 단일 그룹을 지정해야 합니다.
+ `pool-id`. 테스트할 디바이스 풀. `device.json` 파일에 여러 장치 풀이 정의되어 있는 경우 하나의 풀을 지정해야 합니다.
+ `stop-on-first-failure`. 첫 번째 실패 시 IDT가 실행을 중지하도록 구성합니다. 지정된 테스트 그룹을 디버깅하려는 경우 `group-id`와 함께 이 옵션을 사용합니다. 전체 테스트 제품군을 실행하여 검증 보고서를 생성할 때는 이 옵션을 사용하지 마시기 바랍니다.
+ `update-idt`. IDT를 업데이트하라는 프롬프트에 대한 응답을 설정합니다. IDT에서 최신 버전이 있음을 감지하면 `Y` 응답이 테스트 실행을 중지합니다. `N` 응답은 테스트 실행을 계속합니다.
+ `userdata`. 테스트 아티팩트 경로에 대한 정보가 포함되어 있는 `userdata.json` 파일의 전체 경로입니다. 이 옵션은 `run-suite` 명령에 필요합니다. `userdata.json` 파일은 *devicetester\$1extract\$1location*/devicetester\$1ggv2\$1*[win\$1mac\$1linux]* 디렉터리에 있어야 합니다.
`run-suite` 옵션에 대한 자세한 내용은 다음 `help` 옵션을 사용하십시오.  

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

# 결과 및 로그 이해
<a name="results-logs"></a>

이 단원에서는 IDT 결과 보고서 및 로그를 보고 해석하는 방법을 설명합니다.

오류를 해결하려면 [IDT for AWS IoT Greengrass V2 문제 해결](idt-troubleshooting.md) 섹션을 참조하세요.

## 결과 보기
<a name="view-results"></a>

실행하는 동안 IDT는 콘솔, 로그 파일 및 테스트 보고서에 오류를 작성합니다. IDT는 자격 테스트 제품군을 완료한 후 두 개의 테스트 보고서를 생성합니다. 이러한 보고서는 `<device-tester-extract-location>/results/<execution-id>/`에 있습니다. 두 보고서 모두 적격성 테스트 제품군을 실행하여 얻은 결과를 캡처합니다.

`awsiotdevicetester_report.xml`은 AWS Partner Device Catalog에 장치를 등록하기 위해AWS에 제출하는 자격 테스트 보고서입니다. 보고서에는 다음 요소가 포함됩니다.
+ IDT 버전
+ 테스트한 AWS IoT Greengrass 버전
+ `device.json` 파일에 지정된 SKU 및 장치 풀 이름
+ `device.json` 파일에 지정된 장치 풀의 기능
+ 테스트 결과의 집계 요약
+ 로컬 리소스 액세스, 섀도, MQTT 등 디바이스 기능을 기반으로 테스트한 라이브러리별 테스트 결과 분석입니다.

`GGV2Q_Result.xml` 보고서는 [JUnit XML 형식](https://llg.cubic.org/docs/junit/)입니다. [Jenkins](https://jenkins.io/), [Bamboo](https://www.atlassian.com/software/bamboo) 등과 같은 지속적 통합 및 배포 플랫폼에 이 보고서를 통합할 수 있습니다. 보고서에는 다음 요소가 포함됩니다.
+ 테스트 결과의 집계 요약
+ 테스트한 AWS IoT Greengrass 기능별 테스트 결과의 분석

## AWS IoT Device Tester 결과 해석
<a name="interpreting-results-gg"></a>

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

첫 번째 XML 태그(`<testsuites>`)에는 테스트 실행의 요약이 포함되어 있습니다. 예:

```
<testsuites name="GGQ results" time="2299" tests="28" failures="0" errors="0" disabled="0">
````<testsuites>` 태그에 사용되는 속성

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

`time`  
자격 제품군을 실행하는 데 걸린 시간(초)입니다.

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

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

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

`disabled`  
이 속성을 무시합니다. 사용되지 않습니다.

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

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

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

`features`  
확인된 기능입니다. `required`로 표시된 기능은 자격에 대한 보드를 제출하는 데 필요합니다. 다음 코드 조각은 `awsiotdevicetester_report.xml` 파일에 이 정보가 나타나는 방식을 보여 줍니다.  

```
<name="aws-iot-greengrass-v2-core" value="supported" type="required"></feature>
```

필수 기능에 대한 테스트 실패 또는 오류가 없는 경우 장치는 AWS IoT Greengrass를 실행하기 위한 기술 요구 사항을 충족하며 AWS IoT 서비스와 상호 작용할 수 있습니다. AWS Partner Device Catalog에 장치를 나열하려는 경우 이 보고서를 자격 증거로 사용할 수 있습니다.

테스트 실패 또는 오류의 경우 `<testsuites>` XML 태그를 검토하여 실패한 테스트를 식별할 수 있습니다. `<testsuite>` 태그 내부의 `<testsuites>` 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 Combination (IPD + DCM) Test Context" name="Security Combination IP Change Tests sec4_test_1: Should rotate server cert when IPD disabled and following changes are made:Add CIS conn info and Add another CIS conn info" attempts="1"></testcase>>
````<testcase>` 태그에 사용되는 속성

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

`attempts`  
IDT가 테스트 사례를 실행한 횟수.

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

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

## 로그 보기
<a name="view-logs-gg"></a>

IDT는 `<devicetester-extract-location>/results/<execution-id>/logs`의 테스트 실행에서 로그를 생성합니다. 두 개의 로그 세트가 생성됩니다.

`test_manager.log`  
AWS IoT Device Tester의 Test Manager 구성 요소(예: 구성 관련 로그, 테스트 시퀀싱, 보고서 생성)에서 생성된 로그입니다.

`<test-case-id>.log (for example, lambdaDeploymentTest.log)`  
테스트 중인 디바이스의 로그를 포함하여 테스트 그룹 내 테스트 사례의 로그입니다. IDT v4.2.0부터는 각 테스트 사례에 대한 테스트 로그를 `<devicetester-extract-location>/results/<execution-id>/logs/<test-group-id>/` 디렉터리 내의 별도의 *<test-case-id>* 폴더에 그룹화합니다.

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

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

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

**사용자 지정 테스트 도구 모음을 개발하려면**  
+ 테스트하려는 Greengrass 장치에 대해 사용자 지정 테스트 로직이 포함된 테스트 도구 모음을 만드세요.
+ 테스트 러너에게 사용자 지정 테스트 도구 모음과 IDT를 제공하세요. 테스트 도구 모음의 특정 설정 구성에 대한 정보를 포함해야 합니다.

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

## 용의 최신 버전 다운로드 AWS IoT Device Tester AWS IoT Greengrass
<a name="install-dev-tst-gg"></a>

[최신 버전](idt-programmatic-download.md)의 IDT를 다운로드하여 읽기/쓰기 권한이 있는 파일 시스템의 위치(*<device-tester-extract-location>*)에 소프트웨어의 압축을 풉니다.

**참고**  
<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. 테스트 제품군의 테스트 로직이 포함된 [테스트 사례 실행 파일을 생성](create-test-executables.md)합니다.

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

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

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

Python으로 사용자 지정 테스트 도구 모음 생성을 시작하려면 [튜토리얼: 간단한 IDT 테스트 도구 모음 개발](create-custom-tests.md)을(를) 참조하십시오.

# 튜토리얼: 샘플 IDT 테스트 도구 모음 구축 및 실행
<a name="build-sample-suite"></a>

 AWS IoT Device Tester 다운로드에는 샘플 테스트 제품군의 소스 코드가 포함됩니다. 이 자습서를 완료하여 샘플 테스트 제품군을 빌드하고 실행하여 용 IDT를 사용하여 사용자 지정 테스트 제품군 AWS IoT Greengrass 을 실행하는 방법을 이해할 수 있습니다.

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

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

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

## 사전 조건
<a name="prereqs-tutorial-sample"></a><a name="prereqs-list"></a>

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

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

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

    ```
    python3 --version
    ```

    Windows에서 이 명령 사용시 오류가 반환되면 `python --version`을(를) 대신 사용하십시오. 반환된 버전 번호가 3.7 이상인 경우 Powershell 터미널에서 다음 명령을 실행하여 `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)를 참조하세요.
  + [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.org/documentation/remote-access/ssh/)를 설정해야 합니다.

## 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` 폴더의 파일을 검토하여 샘플 테스트 도구 모음이 구조화되는 방식을 이해하고 테스트 사례 실행 파일 및 테스트 구성 JSON 파일의 다양한 예제를 참조하세요.

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

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

## 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 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) 사항을 충족하는지 확인하세요.

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

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

# 튜토리얼: 간단한 IDT 테스트 도구 모음 개발
<a name="create-custom-tests"></a>

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

이 자습서에서는 AWS IoT Greengrass 용 IDT를 사용하여 단일 테스트 사례가 포함된 Python 테스트 제품군을 개발하는 방법을 보여줍니다. 이 자습서에서는 다음 단계를 완료합니다.

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

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

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

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

## 사전 조건
<a name="prereqs-tutorial-custom"></a><a name="prereqs-list"></a>

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

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

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

    ```
    python3 --version
    ```

    Windows에서 이 명령 사용시 오류가 반환되면 `python --version`을(를) 대신 사용하십시오. 반환된 버전 번호가 3.7 이상인 경우 Powershell 터미널에서 다음 명령을 실행하여 `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)를 참조하세요.
  + [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.org/documentation/remote-access/ssh/)를 설정해야 합니다.

## 테스트 도구 모음 디렉터리 생성
<a name="test-suite-dir"></a>

IDT는 각 테스트 도구 모음 내의 테스트 그룹에 테스트 사례를 논리적으로 분리합니다. 각 테스트 사례는 테스트 그룹 내에 있어야 합니다. 이 자습서에서는 `MyTestSuite_1.0.0`이라는 폴더를 생성하고 이 폴더 내에 다음 디렉터리 트리를 생성합니다.

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

## 구성 파일 생성
<a name="test-suite-json"></a>

테스트 제품군에는 다음과 같은 필수 [구성 파일](idt-json-config.md)이 포함되어야 합니다.<a name="required-json"></a>필수 구성 파일

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

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

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

1. `MyTestSuite_1.0.0/suite` 폴더에서 다음 폴더 구조로 `suite.json` 파일을 안에 생성합니다.

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

1. `MyTestSuite_1.0.0/myTestGroup` 폴더에서 다음 폴더 구조로 `group.json` 파일을 안에 생성합니다.

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

1. `MyTestSuite_1.0.0/myTestGroup/myTestCase` 폴더에서 다음 폴더 구조로 `test.json` 파일을 안에 생성합니다.

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

이제 `MyTestSuite_1.0.0` 폴더의 디렉터리 트리가 다음과 같이 표시되어야 합니다.

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

## IDT 클라이언트 SDK 다운로드
<a name="add-idt-sdk"></a>

[IDT 클라이언트 SDK](create-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-sample"></a>

IDT가 테스트를 실행할 수 있도록 디바이스 정보를 구성하십시오. `<device-tester-extract-location>/configs` 폴더에 있는 `device.json` 템플릿을 다음 정보로 업데이트해야 합니다.

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

`devices` 개체에 다음 정보를 제공하시기 바랍니다.

`id`  
테스트 대상 디바이스의 고유한 사용자 정의 식별자입니다.

`connectivity.ip`  
디바이스의 IP 주소입니다.

`connectivity.port`  
선택 사항. 디바이스에 SSH 연결에 사용할 포트 번호입니다.

`connectivity.auth`  
연결에 대한 인증 정보입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.    
`connectivity.auth.method`  
지정된 연결 프로토콜을 통해 디바이스에 액세스하는 데 사용되는 인증 방법입니다.  
지원되는 값은 다음과 같습니다.  
+ `pki`
+ `password`  
`connectivity.auth.credentials`  
인증에 사용되는 자격 증명입니다.    
`connectivity.auth.credentials.user`  
디바이스에 로그인하는 데 사용되는 사용자 이름.  
`connectivity.auth.credentials.privKeyPath`  
디바이스에 로그인하는 데 사용하는 프라이빗 키의 전체 경로입니다.  
이 값은 `connectivity.auth.method`가 `pki`로 설정된 경우에만 적용됩니다.  
`devices.connectivity.auth.credentials.password`  
디바이스에 로그인하기 위해 사용하는 암호입니다.  
이 값은 `connectivity.auth.method`가 `password`로 설정된 경우에만 적용됩니다.

**참고**  
`method`가 `pki`로 설정된 경우에만 `privKeyPath`를 지정합니다.  
`method`가 `password`로 설정된 경우에만 `password`를 지정합니다.

## 테스트 도구 모음 실행
<a name="run-test-suite"></a>

테스트 도구 모음을 만든 후에는 예상대로 작동하는지 확인해야 합니다. 이를 위해 기존 디바이스 풀로 테스트 도구 모음을 실행하려면 다음 단계를 완료하세요.

1. `MyTestSuite_1.0.0` 폴더를 `<device-tester-extract-location>/tests`에 복사하세요.

1. 다음 명령을 실행합니다.

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

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

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

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

## 문제 해결
<a name="tutorial-troubleshooting"></a>

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

**테스트 케이스가 성공적으로 실행되지 않습니다**

테스트가 성공적으로 실행되지 않을 경우 IDT는 오류 로그를 콘솔로 스트리밍하여 테스트 실행 문제를 해결하는 데 도움을 줍니다. 오류 로그를 확인하기 전에 다음 사항을 확인합니다.
+ IDT 클라이언트 SDK는 [이 단계](#add-idt-sdk)에서 설명한 대로 올바른 폴더에 있습니다.
+ 이 튜토리얼의 모든 [사전 요구 사항](#prereqs-tutorial-custom)을 충족합니다.

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

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

# IDT 테스트 도구 모음 구성 파일 만들기
<a name="idt-json-config"></a>

이 섹션에서는 사용자 지정 테스트 제품군을 작성할 때 포함하는 구성 파일을 생성하는 형식을 설명합니다.<a name="required-json"></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`‘or’`state_machine.json`  
IDT가 테스트 제품군을 실행할 때 테스트가 실행되는 방법을 정의합니다. SSe [test\$1orchestrator.yaml 구성](#test-orchestrator-config).  
IDT v4.5.1부터 `test_orchestrator.yaml` 파일을 사용하여 테스트 워크플로를 정의합니다. 이전 버전의 IDT에서는 `state_machine.json` 파일을 사용했습니다. 상태 시스템에 대한 자세한 내용은 [IDT 상태 머신 구성](idt-state-machine.md) 섹션을 참조하세요.

`userdata_schema.json`  
테스트 실행기가 설정 구성에 포함할 수 있는 [`userdata.json` 파일](set-custom-idt-config.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 테스트 케이스 실행 파일 생성](create-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 테스트 케이스 실행 파일 생성](create-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.html#draft-4)를 생성하십시오.

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

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

IDT v4.5.1부터 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`입니다.

**Example**  

## 테스트 오케스트레이터 컨텍스트
<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.1부터 이 상태 시스템은 더 이상 사용되지 않습니다. 새 테스트 오케스트레이터를 사용하는 것이 가장 좋습니다. 자세한 내용은 [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에서 선택한 테스트 그룹에서 모든 테스트 케이스를 실행합니다. 테스트 실행기에 대한 그룹 선택을 활성화하려면 `state_machine.json` 파일에 `RunTask` 및 `Choice` 상태를 모두 포함해야 합니다. 작동 방식에 대한 예제는 [상태 시스템 예시: 사용자가 선택한 테스트 그룹 실행](#allow-specific-groups)을 참조하십시오.

  테스트 실행기의 IDT CLI 명령 활성화에 대한 자세한 내용은 [IDT CLI 명령을 활성화합니다.](create-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="create-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 `‘and’`GetContextString`  
테스트 세트가 IDT 컨텍스트에서 값을 검색할 수 있도록 합니다. 자세한 내용은 [IDT 컨텍스트 사용](idt-context.md) 섹션을 참조하세요.

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

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

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

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

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

IDT CLI 명령에 대한 자세한 내용은 [사용자 지정 테스트 도구 모음 디버그 및 실행](run-debug-custom-tests.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
    },
    "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-custom-idt-config.md#config-json-custom)의 정보. `config` 필드에는 다음과 같은 추가 필드도 포함됩니다.    
`config.timeoutMultiplier`  
테스트 도구 모음에서 사용하는 모든 시간 제한 값의 승수입니다. 이 값은 IDT CLI에서 테스트 러너에 의해 지정됩니다. 기본값은 `1`입니다.

`device`  
테스트 실행을 위해 선택한 장치에 대한 정보. 이 정보는 선택한 장치의 [`device.json` 파일](set-custom-idt-config.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-custom-idt-config.md#userdata-config-custom)에서 제공한 정보.

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

JSON 파일 및 `GetContextValue` 및 `GetContextString` API로 실행 가능한 텍스트 파일에서 JSONPath 표기법을 사용하여 컨텍스트를 쿼리할 수 있습니다. IDT 컨텍스트에 액세스하기 위한 JSONPath 문자열의 구문은 다음과 같이 다양합니다.
+ `suite.json`와(과) `test.json`에서는 `{{query}}`을(를) 사용합니다. 즉, 루트 요소 `$.`을(를) 사용하여 표현식을 시작하지 마십시오.
+ `test_orchestrator.yaml`에서는 `{{query}}`을(를) 사용합니다.

  더 이상 사용되지 않는 상태 시스템을 사용하는 경우 `state_machine.json`에서 `{{$.query}}`를 사용합니다.
+ API 명령에서는 명령에 따라 `query` 또는 `{{$.query}}`을(를) 사용합니다. 자세한 내용을 알아보려면 SDK에서 인라인 설명서를 참조하세요.

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


| Operator  | Description  | 
| --- |--- |
| \$1 | The root element. Because the top-level context value for IDT is an object, you will typically use \$1. to start your queries. | 
| .childName | Accesses the child element with name childName from an object. If applied to an array, yields a new array with this operator applied to each element. The element name is case sensitive. For example, the query to access the awsRegion value in the config object is \$1.config.awsRegion. | 
| [start:end] | Filters elements from an array, retrieving items beginning from the 시작 index and going up to the end index, both inclusive. | 
| [index1, index2, ... , indexN] | Filters elements from an array, retrieving items from only the specified indices. | 
| [?(expr)] | Filters elements from an array using the expr expression. This expression must evaluate to a boolean value. | 

필터 표현식을 만들려면 다음 구문을 사용하십시오.

```
<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-custom-idt-config"></a>

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

테스트 작성자는 [테스트 도구 모음을 디버깅](run-debug-custom-tests.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>",              
                "connectivity": {
                    "protocol": "ssh | uart | docker",                   
                    // ssh
                    "ip": "<ip-address>",
                    "port": <port-number>,
                    "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 장치 카탈로그에 보드를 등록하려면 여기서 지정하는 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개 이상의 장치가 필요합니다.  <a name="device-array-fields"></a>  
`devices.id`  
테스트 대상 장치의 고유한 사용자 정의 식별자입니다.  
`connectivity.protocol`  
이러한 장치와 통신하는 데 사용되는 통신 프로토콜입니다. 풀의 각 장치는 동일한 프로토콜을 사용해야 합니다.  
현재 지원되는 값은 `uart` 물리적 장치의 경우 및, `docker` Docker 컨테이너의 경우 `ssh` 입니다.  
`connectivity.ip`  
테스트 대상 장치의 IP 입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
`connectivity.port`  
선택 사항입니다. SSH 연결하는 데 사용하는 포트 번호입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
`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`이 `ssh`로 설정된 경우에만 적용됩니다.  
`connectivity.containerUser`  
선택 사항입니다. 컨테이너 내부 사용자의 사용자 이름입니다. 기본값은 Dockerfile에 제공된 사용자입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.
테스트 러너가 테스트에 대해 잘못된 디바이스 연결을 구성했는지 확인하려면 테스트 오케스트레이터 컨텍스트에서 `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-version>",                
                "jobSlots": <job-slots>
            }
        ],     
        "devices": [
            {
                "id": "<device-id>",              
                "connectivity": {
                    "protocol": "ssh | uart | docker",                   
                    // ssh
                    "ip": "<ip-address>",
                    "port": <port-number>,
                    "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개 이상의 장치가 필요합니다.  <a name="device-array-fields"></a>  
`devices.id`  
테스트 대상 장치의 고유한 사용자 정의 식별자입니다.  
`connectivity.protocol`  
이러한 장치와 통신하는 데 사용되는 통신 프로토콜입니다. 풀의 각 장치는 동일한 프로토콜을 사용해야 합니다.  
현재 지원되는 값은 `uart` 물리적 장치의 경우 및, `docker` Docker 컨테이너의 경우 `ssh` 입니다.  
`connectivity.ip`  
테스트 대상 장치의 IP 입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
`connectivity.port`  
선택 사항입니다. SSH 연결하는 데 사용하는 포트 번호입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.  
`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`이 `ssh`로 설정된 경우에만 적용됩니다.  
`connectivity.containerUser`  
선택 사항입니다. 컨테이너 내부 사용자의 사용자 이름입니다. 기본값은 Dockerfile에 제공된 사용자입니다.  
기본값은 4입니다.  
이 속성은 `connectivity.protocol`이 `ssh`로 설정된 경우에만 적용됩니다.

## (선택 사항) 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-debug-custom-tests"></a>

[필요한 구성](set-custom-idt-config.md)이 설정되면 IDT에서 테스트 도구 모음을 실행할 수 있습니다. 전체 테스트 도구 모음의 런타임은 하드웨어와 테스트 도구 모음의 구성에 따라 달라집니다. 참조를 위해, Raspberry Pi 3B에서 전체 AWS IoT Greengrass 자격 테스트 도구 모음을 완료하는 데 약 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가 일반적으로 구성 JSON 파일에서 얻는 일부 정보를 제공해야 합니다. 다음 정보를 제공하는지 확인합니다.
+ 각 테스트의 환경 변수 및 인수 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 버전에 대해 지원되는 제품(이 경우, AWS IoT Greengrass 버전)과 현재 IDT 버전에 대한 AWS IoT Greengrass 자격 테스트 제품군 버전을 나열합니다.

`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에서 생성한 콘솔 메시지의 한 가지 예를 보여줍니다.

```
time="2000-01-02T03:04:05-07:00" level=info msg=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가 실행하는 테스트 케이스에 대한 추가 정보를 제공합니다. 다음 발췌문은 테스트 제품군에서 생성한 콘솔 메시지의 한 가지 예를 보여줍니다:

```
time="2000-01-02T03:04:05-07:00" level=info msg=Hello world! suiteId=MyTestSuite
groupId=myTestGroup testCaseId=myTestCase deviceId=my-device
executionId=9a52f362-1227-11eb-86c9-8c8590419f30
```

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

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

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

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

`deviceId`  
현재 테스트 케이스에서 사용 중인 테스트 대상 장치의 ID.

IDT에서 테스트 실행을 완료했을 때 콘솔에 테스트 요약을 인쇄하려면 테스트 오케스트레이터에 [`Report` 상태](idt-state-machine.md#state-report)를 포함해야 합니다. 테스트 요약에는 테스트 제품군, 실행된 각 그룹의 테스트 결과, 생성된 로그 및 보고서 파일의 위치에 대한 정보가 포함됩니다. 다음 예제에서는 테스트 요약 메시지를 보여줍니다.

```
========== 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 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 태그를 검토하여 실패한 테스트를 식별할 수 있습니다. `<testsuite>` 태그 내부의 `<testsuites>` 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는 다음과 같은 정보를 수집합니다.
+  AWS 계정 IDT를 실행하는 데 사용되는 ID
+  테스트를 실행하는 데 사용되는 IDT AWS CLI 명령
+ 실행되는 테스트 제품군
+ *<device-tester-extract-location>* 폴더의 테스트 제품군
+ 디바이스 풀에 구성된 디바이스 수
+ 테스트 케이스 이름 및 런타임
+ 테스트 결과 정보(예: 테스트 통과, 실패, 오류 발생 또는 건너뛰었는지 여부)
+ 제품 기능 테스트
+ IDT 종료 행동(예: 예상치 못한 종료 또는 조기 종료) 

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

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

## 자격 AWS 증명 구성
<a name="configure-aws-creds-for-metrics"></a>

가 아직 없는 경우 [생성](#idt-metrics-aws-account) AWS 계정해야 합니다. 이미가 있는 경우 IDT가 사용자를 대신하여에 사용량 지표를 [전송할 수 있도록 계정에 필요한 권한을 구성](#idt-metrics-permissions)하기만 AWS 계정하면 AWS 됩니다.

### 1단계: 생성 AWS 계정
<a name="idt-metrics-aws-account"></a>

이 단계에는 AWS 계정을 생성하고 구성합니다. 이미 AWS 계정이 있으면 [2단계: IDT에 대한 권한 구성](#idt-metrics-permissions) 섹션으로 건너뜁니다.

이 없는 경우 다음 단계를 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)을 수행하는 것입니다.

다음 옵션 중 하나를 선택하여 관리 사용자를 생성합니다.


****  

| 관리자를 관리하는 방법 한 가지 선택 | 목적 | By | 다른 방법 | 
| --- | --- | --- | --- | 
| IAM Identity Center에서 (권장) | 단기 보안 인증 정보를 사용하여 AWS에 액세스합니다.이는 보안 모범 사례와 일치합니다. 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)를 참조하세요. | AWS IAM Identity Center 사용 설명서의 [시작하기](https://docs.aws.amazon.com//singlesignon/latest/userguide/getting-started.html) 지침을 따릅니다. | AWS Command Line Interface 사용 설명서에서 [사용하도록 AWS CLI 를 구성 AWS IAM Identity Center](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-sso.html)하여 프로그래밍 방식 액세스를 구성합니다. | 
| IAM에서 (권장되지 않음) | 장기 보안 인증 정보를 사용하여 AWS에 액세스합니다. | IAM 사용 설명서의 [비상 액세스를 위한 IAM 사용자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started-emergency-iam-user.html)에 나와 있는 지침을 따르세요. | IAM 사용 설명서에 나온 [IAM 사용자의 액세스 키 관리](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_credentials_access-keys.html)를 수행하여 프로그래밍 방식의 액세스를 구성합니다. | 

### 2단계: IDT에 대한 권한 구성
<a name="idt-metrics-permissions"></a>

이 단계에서는 IDT가 테스트를 실행하고 IDT 사용 데이터를 수집하는 데 사용하는 권한을 구성합니다. AWS Management Console 또는 AWS Command Line Interface (AWS CLI)를 사용하여 IDT에 대한 IAM 정책과 사용자를 생성한 다음 사용자에게 정책을 연결할 수 있습니다.
+ [IDT에 대한 권한 구성(콘솔)](#idt-metrics-permissions-console)
+ [IDT에 대한 권한 구성(AWS CLI)](#idt-metrics-permissions-cli)<a name="idt-metrics-permissions-console"></a>

**IDT에 대한 권한을 구성하려면(콘솔)**

콘솔을 사용하여 AWS IoT Greengrass용 IDT에 대한 권한을 구성하려면 다음 단계를 수행하세요.

1. [IAM 콘솔](https://console.aws.amazon.com/iam)에 로그인합니다.

1. 특정 권한으로 역할을 생성하는 권한을 부여하는 고객 관리형 정책을 만듭니다.

   1. 탐색 창에서 **정책**을 선택한 후 **정책 생성**을 선택합니다.

   1. **JSON** 탭에서 자리 표시자 콘텐츠를 다음 정책으로 바꿉니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot-device-tester:SendMetrics"
                  ],
                  "Resource": "*"
              }
          ]
      }
      ```

------

   1. **정책 검토**를 선택합니다.

   1. **이름**에서 **IDTUsageMetricsIAMPermissions**을 입력합니다. **Summary(요약)** 아래에서 정책에 의해 부여된 권한을 검토합니다.

   1. **정책 생성**을 선택합니다.

1. IAM 사용자를 생성하고 사용자에 권한을 연결합니다.

   1. IAM 사용자를 생성합니다. [IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)에서 *IAM 사용자 생성(콘솔)*의 1\$15단계를 따르세요. 이미 IAM 사용자를 생성한 경우 다음 단계로 건너뛰세요.

   1. IAM 사용자에게 권한을 연결합니다.

      1. **Set permissions(권한 설정)** 페이지에서 **Attach existing policies to user directly(사용자에게 직접 기존 정책 연결)**를 선택합니다.

      1. 이전 단계에서 만든 **IDTUsageMetricsIAMPermissions** 정책을 검색합니다. 확인란을 선택합니다.

   1. **다음: 태그**를 선택합니다.

   1. **Next: Review(다음: 검토)**를 선택하여 선택 사항의 요약을 봅니다.

   1. **사용자 생성**을 선택합니다.

   1. 사용자의 액세스 키(액세스 키 ID와 비밀 액세스 키)를 보려면 암호와 액세스 키 옆에 있는 **Show(표시)**를 선택합니다. 액세스 키를 저장하려면 **Download .csv(csv 다운로드)**를 선택한 후 안전한 위치에 파일을 저장합니다. 나중에이 정보를 사용하여 AWS 자격 증명 파일을 구성합니다.

 <a name="idt-metrics-permissions-cli"></a>

**IDT에 대한 권한을 구성하려면(AWS CLI)**

다음 단계에 따라를 사용하여 AWS CLI 에 대한 IDT 권한을 구성합니다 AWS IoT Greengrass.

1. 아직 설치되지 않은 AWS CLI 경우 컴퓨터에를 설치하고 구성합니다. *AWS Command Line Interface 사용 설명서* [AWS CLI설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 단계를 따르세요.
**참고**  
 AWS CLI 는 명령줄 셸의 AWS 서비스와 상호 작용하는 데 사용할 수 있는 오픈 소스 도구입니다.

1. IDT 및 AWS IoT Greengrass 역할을 관리할 수 있는 권한을 부여하는 다음 고객 관리형 정책을 생성합니다.

------
#### [ Linux or Unix ]

   ```
   aws iam create-policy --policy-name IDTUsageMetricsIAMPermissions --policy-document '{
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot-device-tester:SendMetrics"
               ],
               "Resource": "*"
           }
       ]
   }'
   ```

------
#### [ Windows command prompt ]

   ```
   aws iam create-policy --policy-name IDTUsageMetricsIAMPermissions --policy-document
                                           '{\"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"iot-device-tester:SendMetrics\"], \"Resource": \"*\"}]}'
   ```

**참고**  
Linux, macOS 또는 Unix 터미널 명령과 다른 JSON 구문을 사용하기 때문에 이 단계에는 Windows 명령 프롬프트 예제가 포함되어 있습니다.

------
#### [ PowerShell ]

   ```
   aws iam create-policy --policy-name IDTUsageMetricsIAMPermissions --policy-document '{
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot-device-tester:SendMetrics"
               ],
               "Resource": "*"
           }
       ]
   }'
   ```

------

1. IAM 사용자를 만들고 AWS IoT Greengrass용 IDT에 필요한 권한을 연결합니다.

   1. IAM 사용자를 생성합니다.

      ```
      aws iam create-user --user-name user-name
      ```

   1. 생성한 `IDTUsageMetricsIAMPermissions` 정책을 새 IAM 사용자에 연결합니다. *user-name*을 IAM 사용자 이름으로 바꾸고 명령에서 *<account-id>*를 자신이 사용하는 AWS 계정계정의 ID로 바꾸세요.

      ```
      aws iam attach-user-policy --user-name user-name --policy-arn arn:aws:iam::<account-id>:policy/IDTGreengrassIAMPermissions
      ```

1. 사용자에 대한 비밀 액세스 키를 만듭니다.

   ```
   aws iam create-access-key --user-name user-name
   ```

   출력을 안전한 위치에 저장합니다. 나중에이 정보를 사용하여 AWS 자격 증명 파일을 구성합니다.

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

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

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

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

------
#### [ Linux or Unix ]

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

------
#### [ Windows Command Prompt (CMD) ]

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

------
#### [ PowerShell ]

      ```
      $env:AWS_ACCESS_KEY_ID="access-key"
      $env:AWS_SECRET_ACCESS_KEY="secret-access-key"
      ```

------

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

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

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

# IDT for AWS IoT Greengrass V2 문제 해결
<a name="idt-troubleshooting"></a>

IDT for AWS IoT Greengrass V2는 오류 유형에 따라 다양한 위치에 오류를 기록합니다. IDT는 콘솔, 로그 파일 및 테스트 보고서에 오류를 작성합니다.

## 오류를 찾을 수 있는 곳
<a name="where-to-look"></a>

상위 수준의 오류는 테스트를 실행하는 동안 콘솔에 표시되고, 실패한 테스트의 요약은 모든 테스트가 완료될 때 표시됩니다. `awsiotdevicetester_report.xml`에 테스트 실패의 원인이 되는 모든 오류에 대한 요약이 들어 있습니다. IDT는 각 테스트 실행에 대한 로그 파일을 테스트 실행에 대한 UUID가 포함된 디렉터리에 저장하고, 테스트 실행 도중 콘솔에 표시됩니다.

IDT 테스트 로그 디렉터리는 `<device-tester-extract-location>/results/<execution-id>/logs/`입니다. 이 디렉터리에는 테이블에 표시된 다음 파일이 포함되어 있습니다. 이는 디버깅에 유용합니다.


| 파일 | 설명 | 
| --- | --- | 
| test\$1manager.log |  테스트가 실행되는 동안 콘솔에 기록된 로그. 이 파일의 끝에 있는 결과 요약에는 실패한 테스트 목록이 포함되어 있습니다. 이 파일의 경고 및 오류 로그에서 실패에 대한 일부 정보를 확인할 수 있습니다.  | 
| test-group-id/test-case-id/test-name.log | 테스트 그룹의 특정 테스트에 대한 상세 로그. Greengrass 구성 요소를 배포하는 테스트의 경우 테스트 사례 로그 파일을 greengrass-test-run.log라고 합니다. | 
| test-group-id/test-case-id/greengrass.log |  AWS IoT Greengrass 코어 소프트웨어에 대한 세부 로그입니다. IDT는 디바이스에 AWS IoT Greengrass 코어 소프트웨어를 설치하는 테스트를 실행할 때 테스트 중인 디바이스에서이 파일을 복사합니다. 이 로그 파일의 메시지에 대한 자세한 내용은 [문제 해결 AWS IoT Greengrass V2](troubleshooting.md)의 내용을 참조하세요. | 
| test-group-id/test-case-id/component-name.log | 테스트 실행 중에 배포된 Greengrass 구성 요소에 대한 상세 로그. IDT는 특정 구성 요소를 배포하는 테스트를 실행할 때 테스트 중인 디바이스에서 구성 요소 로그 파일을 복사합니다. 각 구성 요소 로그 파일의 이름은 배포된 구성 요소의 이름에 해당합니다. 이 로그 파일의 메시지에 대한 자세한 내용은 [문제 해결 AWS IoT Greengrass V2](troubleshooting.md)의 내용을 참조하세요. | 

## IDT for AWS IoT Greengrass V2 오류 해결
<a name="idt-gg-resolve-errors"></a>

용 IDT를 실행하기 전에 AWS IoT Greengrass올바른 구성 파일을 준비하십시오. 구문 분석 및 구성 오류가 발생할 경우 첫 번째 단계는 환경에 적합한 구성 템플릿을 찾아서 사용하는 것입니다.

그래도 문제가 발생할 경우 다음 디버깅 프로세스를 참조하십시오.

**Topics**
+ [별칭 확인 오류](#alias-resolution-errors)
+ [충돌 오류](#conflict-error)
+ [테스트를 시작할 수 없음 오류](#could-not-start-test)
+ [Docker 검증 이미지에 오류가 있음](#docker-qualification-image-exists)
+ [자격 증명 읽기 실패](#failed-to-read-credential-windows)
+ [사전 설치된 Greengrass의 Guice 오류](#guice-errors)
+ [잘못된 서명 예외](#invalid-signature-exception-lambda)
+ [기계 학습 검증 오류](#machine-learning-qualification-failure)
+ [OTF(Open Test Framework) 배포 실패](#otf-deployment-failure)
+ [구문 분석 오류](#parse-error)
+ [권한 거부 오류](#permission-denied-pwd-sudo)
+ [검증 보고서 생성 오류](#qualification-report-policy-error)
+ [필수 파라미터 누락 오류](#required-param-missing)
+ [macOS에서의 보안 예외](#security-exception-macos)
+ [SSH 연결 오류](#ssh-connect-errors)
+ [스트림 관리자 검증 오류](#stream-manager-qualification-failure)
+ [제한 시간 오류](#test-timeout)
+ [버전 확인 오류](#version-compatibility-check-failure)

### 별칭 확인 오류
<a name="alias-resolution-errors"></a>

사용자 지정 테스트 제품군을 실행하면 콘솔 및 `test_manager.log`에서 다음 오류가 표시될 수 있습니다.

```
Couldn't resolve placeholders: couldn't do a json lookup: index out of range
```

이 오류는 IDT 테스트 오케스트레이터에 구성된 별칭이 올바르게 확인되지 않거나 확인된 값이 구성 파일에 없는 경우 발생할 수 있습니다. 이 오류를 해결하려면 `device.json` 및 `userdata.json `에 테스트 제품군에 필요한 올바른 정보가 포함되어 있어야 합니다. AWS IoT Greengrass 검증에 필요한 구성에 대한 자세한 내용은 섹션을 참조하세요[AWS IoT Greengrass 검증 제품군을 실행하도록 IDT 설정 구성](set-config.md).

### 충돌 오류
<a name="conflict-error"></a>

두 개 이상의 디바이스에서 AWS IoT Greengrass 검증 제품군을 동시에 실행하면 다음 오류가 표시될 수 있습니다.

```
ConflictException: Component [com.example.IDTHelloWorld : 1.0.0] for account [account-id] already exists with state: [DEPLOYABLE] { RespMetadata: { StatusCode: 409, RequestID: “id” }, Message_: “Component [com.example.IDTHelloWorld : 1.0.0] for account [account-id] already exists with state: [DEPLOYABLE]” }
```

 AWS IoT Greengrass 검증 제품군에 대한 동시 테스트 실행은 아직 지원되지 않습니다. 각 디바이스에 대해 순차적으로 검증 제품군을 실행하세요.

### 테스트를 시작할 수 없음 오류
<a name="could-not-start-test"></a>

테스트 시작을 시도할 때 발생한 실패를 가리키는 오류가 발생할 수 있습니다. 몇 가지 원인이 있을 수 있으므로 다음을 수행하십시오.
+ 실행 명령의 풀 이름이 실제로 존재하는지 확인합니다. IDT는 `device.json` 파일에서 풀 이름을 직접 참조합니다.
+ 풀에 있는 장치에 올바른 구성 파라미터가 있는지 확인합니다.

### Docker 검증 이미지에 오류가 있음
<a name="docker-qualification-image-exists"></a>

Docker 애플리케이션 관리자 검증 테스트는 Amazon ECR의 `amazon/amazon-ec2-metadata-mock` 컨테이너 이미지를 사용하여 테스트 중인 디바이스를 검증합니다.

이미지가 테스트 중인 디바이스의 Docker 컨테이너에 이미 있는 경우 다음 오류가 발생할 수 있습니다.

```
The Docker image amazon/amazon-ec2-metadata-mock:version already exists on the device.
```

이전에 이 이미지를 다운로드하고 디바이스에서 `amazon/amazon-ec2-metadata-mock` 컨테이너를 실행한 경우 검증 테스트를 실행하기 전에 테스트 중인 디바이스에서 이 이미지를 제거해야 합니다.

### 자격 증명 읽기 실패
<a name="failed-to-read-credential-windows"></a>

Windows 디바이스를 테스트할 때 테스트 중인 디바이스에 연결하는 데 사용하는 사용자가 해당 디바이스의 자격 증명 관리자에 설정되지 않은 경우 `greengrass.log` 파일에 `Failed to read credential` 오류가 발생할 수 있습니다.

이 오류를 해결하려면 테스트 중인 디바이스의 자격 증명 관리자에서 IDT 사용자의 사용자와 암호를 구성합니다.

자세한 내용은 [Windows 디바이스에 대한 사용자 자격 증명 구성](device-config-setup.md#configure-windows-user-for-idt) 단원을 참조하십시오.

### 사전 설치된 Greengrass의 Guice 오류
<a name="guice-errors"></a>

사전 설치된 Greengrass로 IDT를 실행하는 동안 `Guice` 또는 `ErrorInCustomProvider` 오류가 발생하면 `userdata.json` 파일에서 `InstalledDirRootOnDevice`가 Greengrass 설치 폴더로 설정되어 있는지 확인합니다. IDT는 `<InstallationDirRootOnDevice>/config/effectiveConfig.yaml`에서 `effectiveConfig.yaml` 파일을 확인합니다.

자세한 내용은 [Windows 디바이스에 대한 사용자 자격 증명 구성](device-config-setup.md#configure-windows-user-for-idt) 단원을 참조하십시오.

### 잘못된 서명 예외
<a name="invalid-signature-exception-lambda"></a>

Lambda 검증 테스트를 실행할 때 IDT 호스트 시스템에 네트워크 액세스 문제가 발생하는 경우 `invalidsignatureexception` 오류가 발생할 수 있습니다. 라우터를 재설정하고 테스트를 다시 실행하세요.

### 기계 학습 검증 오류
<a name="machine-learning-qualification-failure"></a>

기계 학습(ML) 검증 테스트를 실행할 때 디바이스가 AWS제공 ML 구성 요소를 배포하기 위한 [요구](dlr-component.md#dlr-component-requirements) 사항을 충족하지 않는 경우 검증 실패가 발생할 수 있습니다. 다음을 수행하여 ML 검증 오류 해결: 
+ 테스트 실행 중에 배포된 구성 요소의 구성 요소 로그에서 오류 세부 정보를 찾습니다. 구성 요소 로그는 `<device-tester-extract-location>/results/<execution-id>/logs/<test-group-id>` 디렉터리에 있습니다.
+ 실패한 테스트 사례의 `test.json` 파일에 `-Dgg.persist=installed.software` 인수를 추가합니다. `test.json` 파일은 `<device-tester-extract-location>/tests/GGV2Q_version directory. `에 있습니다.

### OTF(Open Test Framework) 배포 실패
<a name="otf-deployment-failure"></a>

OTF 테스트에서 배포를 완료하지 못하는 경우 `TempResourcesDirOnDevice` 및 `InstallationDirRootOnDevice`의 상위 폴더에 설정된 권한이 원인일 수 있습니다. 이 폴더의 권한을 올바르게 설정하려면 다음 명령을 실행합니다. `folder-name`을 상위 폴더의 이름으로 바꿉니다.

```
sudo chmod 755 folder-name
```

### 구문 분석 오류
<a name="parse-error"></a>

JSON 구성의 오타로 인해 구문 분석 오류가 발생할 수 있습니다. 대부분의 경우 문제는 JSON 파일에서 대괄호, 쉼표 또는 따옴표를 생략한 결과입니다. IDT는 JSON 확인을 수행하고 디버깅 정보를 인쇄합니다. IDT는 오류가 발생한 줄, 줄 번호, 구문 오류의 열 번호를 인쇄합니다. 이 정보만 있으면 오류를 수정할 수 있지만, 여전히 오류를 찾을 수 없는 경우 IDE나 텍스트 편집기(예: Atom 또는 Sublime)에서 또는 온라인 도구(예: JSONLint)를 통해 수동으로 확인을 수행할 수 있습니다.

### 권한 거부 오류
<a name="permission-denied-pwd-sudo"></a>

IDT는 테스트 대상 장치에서 다양한 디렉터리와 파일에 대해 작업을 수행합니다. 이러한 작업 일부에는 루트 액세스가 필요합니다. 이러한 작업을 자동화하기 위해서는 IDT가 암호 입력 없이 sudo를 사용하여 명령을 실행할 수 있어야 합니다.

암호 입력 없이 sudo 액세스를 허용하려면 다음 단계를 수행합니다.

**참고**  
`user` 및 `username`은 IDT가 테스트 대상 장치에 액세스하는 데 사용하는 SSH 사용자를 나타냅니다.

1. sudo 그룹에 SSH 사용자를 추가하려면 **sudo usermod -aG sudo *<ssh-username>***을 사용하십시오.

1. 변경 사항을 적용하려면 로그아웃했다가 로그인하십시오.

1. `/etc/sudoers` 파일을 열고 파일 끝에 다음 줄을 추가합니다. `<ssh-username> ALL=(ALL) NOPASSWD: ALL` 
**참고**  
모범 사례로, `/etc/sudoers`를 편집할 때는 **sudo visudo**를 사용하는 것이 좋습니다.

### 검증 보고서 생성 오류
<a name="qualification-report-policy-error"></a>

IDT는 AWS IoT Greengrass V2 검증 제품군(GGV2Q)의 네 가지 최신 `major.minor` 버전을 지원하여 AWS Partner 디바이스 카탈로그에 디바이스를 포함 AWS Partner Network 하기 위해 제출할 수 있는 검증 보고서를 생성합니다. 이전 버전의 검증 제품군은 검증 보고서를 생성하지 않습니다.

지원 정책에 대해 궁금한 점이 있으면 [AWS Support](https://aws.amazon.com/contact-us/)에 문의하세요.

### 필수 파라미터 누락 오류
<a name="required-param-missing"></a>

IDT에서 새 기능을 추가하면 구성 파일이 변경될 수 있습니다. 기존 구성 파일을 사용하면 구성이 손상될 수 있습니다. 이 문제가 발생할 경우 `/results/<execution-id>/logs` 아래의 `<test_case_id>.log` 파일에 누락된 모든 파라미터가 명시적으로 나열됩니다. 또한 IDT는 JSON 구성 파일 스키마를 검사하여 지원되는 최신 버전이 사용되었는지 확인합니다.

### macOS에서의 보안 예외
<a name="security-exception-macos"></a>

macOS 호스트 컴퓨터에서 IDT를 실행하면 IDT 실행이 차단됩니다. IDT를 실행하려면 IDT 런타임 기능의 일부인 실행 파일에 보안 예외를 부여합니다. 호스트 컴퓨터에 경고 메시지가 표시되면 해당하는 각 실행 파일에 대해 다음을 수행합니다.

**IDT 실행 파일에 보안 예외 부여**

1. macOS 컴퓨터의 Apple 메뉴에서 **시스템 기본 설정**을 엽니다.

1. **보안 및 개인 정보 보호**를 선택한 다음 **일반** 탭에서 잠금 아이콘을 선택하여 보안 설정을 변경합니다.

1. `devicetester_mac_x86-64`가 차단된 경우 `"devicetester_mac_x86-64" was blocked from use because it is not from an identified developer.` 메시지를 찾아 **모두 허용**을 선택합니다.

1. 관련된 모든 실행 파일을 테스트할 때까지 IDT 테스트를 재개합니다.

### SSH 연결 오류
<a name="ssh-connect-errors"></a>

IDT가 테스트 대상 디바이스에 연결할 수 없으면 연결 실패가 `/results/<execution-id>/logs/<test-case-id>.log`에 기록됩니다. 테스트 대상 디바이스에 대한 연결은 IDT가 수행하는 첫 번째 작업 중 하나이므로 SSH 메시지는 이 로그 파일의 맨 위에 표시됩니다.

대부분의 Windows 구성은 PuTTy 터미널 애플리케이션을 사용하여 Linux 호스트에 연결합니다. 이 애플리케이션에서는 표준 PEM 프라이빗 키 파일을 PPK라는 전용 Windows 형식으로 변환해야 합니다. `device.json` 파일에서 SSH를 구성하는 경우 PEM 파일을 사용하세요. PPK 파일을 사용하는 경우 IDT는 AWS IoT Greengrass 디바이스와의 SSH 연결을 생성할 수 없으며 테스트를 실행할 수 없습니다.

IDT v4.4.0부터 테스트 중인 디바이스에서 SFTP를 활성화하지 않은 경우 로그 파일에 다음 오류가 표시될 수 있습니다.

```
SSH connection failed with EOF
```

이 오류를 해결하려면 디바이스에서 SFTP를 활성화합니다.

### 스트림 관리자 검증 오류
<a name="stream-manager-qualification-failure"></a>

스트림 관리자 검증 테스트를 실행할 때 `com.aws.StreamManagerExport.log` 파일에 다음 오류가 표시될 수 있습니다.

```
Failed to upload data to S3
```

이 오류는 스트림 관리자가 IDT가 테스트 중인 디바이스로 내보내는 환경 AWS 자격 증명을 사용하는 대신 디바이스의 `~/root/.aws/credentials` 파일에 있는 자격 증명을 사용할 때 발생할 수 있습니다. 이 문제를 방지하려면 디바이스에서 `credentials` 파일을 삭제하고, 검증 테스트를 다시 실행합니다.

### 제한 시간 오류
<a name="test-timeout"></a>

각 테스트의 제한 시간 기본값에 적용되는 제한 시간 승수를 지정하여 각 테스트에 대한 제한 시간을 늘릴 수 있습니다. 이 플래그에 대해 구성된 값은 1.0보다 크거나 같아야 합니다.

제한 시간 승수를 사용하려면 테스트를 실행할 때 `--timeout-multiplier` 플래그를 사용합니다. 예제:

```
./devicetester_linux run-suite --suite-id GGV2Q_1.0.0 --pool-id DevicePool1 --timeout-multiplier 2.5
```

자세한 내용을 보려면 `run-suite --help`을(를) 실행하세요.

일부 제한 시간 오류는 구성 문제로 인해 IDT 테스트 사례를 완료할 수 없을 때 발생합니다. 제한 시간 승수를 늘려서 이러한 오류를 해결할 수는 없습니다. 테스트 실행의 로그를 사용하여 기본 구성 문제를 해결합니다.
+ MQTT 또는 Lambda 구성 요소 로그에 `Access denied` 오류가 있는 경우 Greengrass 설치 폴더에 올바른 파일 권한이 없을 수 있습니다. `userdata.json` 파일에 정의한 설치 경로의 각 폴더에 대해 다음 명령을 실행합니다.

  ```
  sudo chmod 755 folder-name
  ```
+ Greengrass 로그에 Greengrass CLI 배포가 완료되지 않은 것으로 표시되는 경우 다음을 수행합니다.
  + `bash`가 테스트 중인 디바이스에 설치되어 있는지 확인합니다.
  + `userdata.json` 파일에 `GreengrassCliVersion` 구성 파라미터가 포함된 경우 제거합니다. 이 파라미터는 IDT v4.1.0 이상 버전에서는 더 이상 사용되지 않습니다. 자세한 내용은 [userdata.json 구성](set-config.md#userdata-config) 단원을 참조하십시오.
+ “Lambda 게시 검사: 제한 시간” 오류 메시지와 함께 Lambda 배포 테스트가 실패하고 테스트 로그 파일(`idt-gg2-lambda-function-idt-<resource-id>.log`)에 `Error: Could not find or load main class com.amazonaws.greengrass.runtime.LambdaRuntime.` 오류가 표시되면 다음을 수행합니다.
  + `userdata.json` 파일에서 `InstallationDirRootOnDevice`에 사용된 폴더를 확인합니다.
  + 디바이스에 올바른 사용자 권한이 설정되어 있는지 확인합니다. 자세한 내용은 [디바이스에서 사용자 권한 구성](https://docs.aws.amazon.com/greengrass/v2/developerguide/device-config-setup.html#root-access)을 참조하세요.

### 버전 확인 오류
<a name="version-compatibility-check-failure"></a>

IDT 사용자의 AWS 사용자 자격 증명에 필요한 IAM 권한이 없는 경우 IDT에서 다음 오류가 발생합니다.

```
Failed to check version compatibility
```

필요한 IAM 권한이 없는 AWS 사용자입니다.

# AWS IoT Device Tester용 AWS IoT Greengrass에 대한 지원 정책
<a name="idt-support-policy"></a>

AWS IoT Greengrass용 AWS IoT Device Tester는 AWS IoT Greengrass 디바이스를 [AWS Partner 디바이스 카탈로그](https://devices.amazonaws.com/)에 포함하기 위해 검증하고 [자격을 부여](https://aws.amazon.com/partners/dqp/)하는 테스트 자동화 도구입니다. 최신 버전의 AWS IoT Greengrass 및 AWS IoT Device Tester를 사용하여 디바이스를 테스트하고 자격을 부여하는 것이 좋습니다.

AWS IoT Greengrass의 지원되는 각 버전에 대해 하나 이상의 AWS IoT Device Tester 버전을 사용할 수 있습니다. AWS IoT Greengrass의 지원되는 버전은 [Greengrass nucleus 버전](greengrass-nucleus-component.md#greengrass-nucleus-component-versions)을 참조하세요. AWS IoT Device Tester의 지원되는 버전은 [AWS IoT Device Tester for AWS IoT Greengrass V2 지원 버전](dev-test-versions.md) 섹션을 참조하세요.

AWS IoT Greengrass 및 AWS IoT Device Tester의 지원되는 버전 중 하나를 사용하여 디바이스를 테스트하고 자격을 부여할 수 있습니다. AWS IoT Device Tester의 지원되지 않는 버전을 계속 사용할 수 있지만, 이러한 버전에는 버그 수정 또는 업데이트가 제공되지 않습니다. 지원 정책에 대해 궁금한 점이 있으면 [AWS Support](https://aws.amazon.com/contact-us/)에 문의하세요.