튜토리얼: 간단한 IDT 테스트 도구 모음 개발 - AWS IoT Greengrass

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

튜토리얼: 간단한 IDT 테스트 도구 모음 개발

테스트 제품군은 다음을 결합합니다.

  • 테스트 로직이 포함된 테스트 실행 파일

  • 테스트 제품군을 설명하는 구성 파일

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

사전 조건

이 튜토리얼을 완료하려면 다음이 필요합니다.

  • 호스트 컴퓨터 요구 사항
    • AWS IoT Device Tester의 최신 버전

    • Python 3.7 이상

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

      python3 --version

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

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

      버전 정보가 반환되지 않았거나 버전 번호가 3.7 미만이면 Python 다운로드의 지침에 따라 Python 3.7 이상을 설치합니다. 자세한 내용은 Python 설명서를 참조하세요.

    • urllib3

      urllib3이 제대로 설치되었는지 확인하려면 다음 명령을 실행합니다.

      python3 -c 'import urllib3'

      urllib3가 설치되지 않은 경우에는 다음 명령을 실행하여 설치합니다.

      python3 -m pip install urllib3
  • 디바이스 요구 사항
    • Linux 운영 체제를 사용하고 호스트 컴퓨터와 동일한 네트워크에 네트워크로 연결된 디바이스.

      Raspberry Pi OS와 함께 Raspberry Pi를 사용하는 것이 좋습니다. Raspberry Pi에 원격으로 연결하려면 Pi에서 SSH를 설정해야 합니다.

테스트 제품군 디렉터리 생성

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

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

구성 파일 생성

테스트 제품군에는 다음과 같은 필수 구성 파일이 포함되어야 합니다.

필수 구성 파일
suite.json

테스트 제품군 정보가 포함되어 있습니다. suite.json 구성 섹션을 참조하세요.

group.json

테스트 그룹에 대한 정보가 포함되어 있습니다. 테스트 제품군의 각 테스트 그룹에 대한 group.json 파일을 생성해야 합니다. group.json 구성 섹션을 참조하세요.

test.json

테스트 사례에 대한 정보가 들어 있습니다. 테스트 제품군의 각 테스트 사례에 대한 test.json 파일을 생성해야 합니다. 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 }
  2. MyTestSuite_1.0.0/myTestGroup 폴더에서 다음 폴더 구조로 group.json 파일을 생성합니다.

    { "id": "MyTestGroup", "title": "My Test Group", "details": "This is my test group.", "optional": false }
  3. 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 다운로드

IDT 클라이언트 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'

테스트 사례 실행 파일 생성

테스트 사례 실행 파일에는 실행하려는 테스트 로직이 포함되어 있습니다. 테스트 제품군에는 여러 테스트 사례 실행 파일이 포함될 수 있습니다. 이 자습서에서는 테스트 사례 실행 파일을 하나만 생성합니다.

  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()
  2. 클라이언트 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()
    2. 테스트 결과를 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용 디바이스 정보 구성

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.protocolssh로 설정된 경우에만 적용됩니다.

connectivity.auth.method

지정된 연결 프로토콜을 통해 디바이스에 액세스하는 데 사용되는 인증 방법입니다.

지원되는 값은 다음과 같습니다.

  • pki

  • password

connectivity.auth.credentials

인증에 사용되는 자격 증명입니다.

connectivity.auth.credentials.user

디바이스에 로그인하는 데 사용되는 사용자 이름입니다.

connectivity.auth.credentials.privKeyPath

디바이스에 로그인하는 데 사용되는 프라이빗 키의 전체 경로입니다.

이 값은 connectivity.auth.methodpki로 설정된 경우에만 적용됩니다.

devices.connectivity.auth.credentials.password

디바이스에 로그인하기 위해 사용되는 암호입니다.

이 값은 connectivity.auth.methodpassword로 설정된 경우에만 적용됩니다.

참고

methodpki로 설정된 경우에만 privKeyPath를 지정합니다.

methodpassword로 설정된 경우에만 password를 지정합니다.

테스트 제품군 실행

테스트 제품군을 생성한 후에는 예상대로 작동하는지 확인해야 합니다. 이를 위해 기존 디바이스 풀로 테스트 제품군을 실행하려면 다음 단계를 완료합니다.

  1. MyTestSuite_1.0.0 폴더를 <device-tester-extract-location>/tests에 복사합니다.

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

    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

문제 해결

다음 정보를 사용하면 자습서 완료와 관련된 문제를 해결하는 데 도움이 됩니다.

테스트 사례가 성공적으로 실행되지 않습니다.

테스트가 성공적으로 실행되지 않을 경우 IDT는 오류 로그를 콘솔로 스트리밍하여 테스트 실행 문제를 해결하는 데 도움을 줍니다. 오류 로그를 확인하기 전에 다음 사항을 확인합니다.

  • IDT 클라이언트 SDK는 이 단계에서 설명한 대로 올바른 폴더에 있습니다.

  • 이 자습서의 모든 사전 조건을 충족합니다.

테스트 대상 디바이스에 연결할 수 없습니다.

다음을 확인합니다.

  • device.json 파일에는 올바른 IP 주소, 포트 및 인증 정보가 들어 있습니다.

  • 호스트 컴퓨터에서 SSH를 통해 디바이스에 연결할 수 있습니다.