SDV 테스트 프레임워크 라이브러리

이 페이지에서는 SDV 테스트 프레임워크 라이브러리의 개요를 제공하고 테스트를 설정, 구성, 실행하는 방법을 안내합니다. 엔드 투 엔드 테스트에는 SDV 테스트 프레임워크를 사용합니다. 이 도구는 Mobly를 기반으로 하며 Python으로 테스트를 작성합니다.

테스트 접근 방식 선택

테스트를 작성하기 전에 확인 범위와 일치하는 테스트 실행기를 선택합니다.

테스트 범위 Soong 모듈 유형 실행 도구 사용하기 적합한 경우
서비스 번들 단위 테스트 rust_test, rust_test_host 또는 cc_test atest 호스트 또는 단일 Cuttlefish 가상 머신 (VM)에서 격리된 Rust 또는 C++ 비즈니스 로직, 데이터 변환 또는 도우미 크레이트를 확인합니다.
엔드 투 엔드 및 멀티 VM 시스템 테스트 python_test_host (SDV 테스트 프레임워크) atest 또는 CATBox 1~3개의 VM에서 서비스 번들 수명 주기 조정, VM 간 통신, SOME/IP 브리징 또는 하드웨어 타겟을 확인합니다.

환경 설정

이 페이지에서는 SDV용 워크스테이션을 이미 설정했다고 가정합니다. 프레임워크 테스트를 실행하려면 virtualenv를 설치합니다.

Python 종속 항목

Android에서 종속 항목을 관리하는 권장 방법은 빌드 구성을 사용하여 테스트, Python, 종속 항목을 실행 파일로 패키징하는 것입니다. SDV 테스트 저장소에서 이 접근 방식을 따라야 합니다.

SDV 테스트 프레임워크 라이브러리는 기본적으로 다음 종속 항목을 제공합니다.

  • mobly
  • absl-py 테스트에서 매개변수화를 사용하는 데 필요합니다.
  • pexpect 대화형 명령어 기능에 필요합니다.
  • ptyprocess 대화형 명령어 기능에 필요합니다.

테스트별 종속 항목이 필요한 경우 테스트의 Android.bp 파일에 포함합니다.

python_test_host {
    …
    libs: [
        "<DEPENDENCY1>",
        "<DEPENDENCY2>",
        …
    ],
    …
}

시스템 테스트 유형

SDV 테스트 프레임워크를 사용하여 시스템 테스트를 만듭니다. 프레임워크는 다음 유형을 구분합니다. 테스트를 올바르게 분류합니다.

  • 샘플 테스트: SDV 샘플 서비스를 실행하고 결과가 예상 출력과 일치하는지 확인합니다.
  • E2E 테스트: SDV 샘플 서비스를 사용하지 마세요.
  • 장기 실행 테스트: 실행 기간이 길도록 설계되었습니다.
  • 성능 테스트: perfetto 라이브러리를 사용합니다.
  • 하드웨어 테스트: Cuttlefish (CF)가 아닌 실제 기기에서만 실행되도록 설계되었습니다.

테스트 만들기

프레임워크를 사용하여 작성된 모든 테스트는 테스트 저장소에 있어야 합니다. 테스트의 정확한 위치는 유형에 따라 다릅니다. 디렉터리 경로, Python 테스트 클래스 템플릿, Android.bp 규칙, Mobly 코딩 가이드라인은 SDV 시스템 테스트 생성을 참고하세요.

테스트 구성

atest와 CATBox를 모두 사용하여 실행되도록 모든 테스트를 구성합니다.

atest 구성

프레임워크는 VM 테스트 1개, 2개, 3개에 대한 템플릿을 제공합니다. Android.bp 파일에 다음을 추가합니다.

  • VM 1개:

    python_test_host {
      ...
      test_config_template: ":sdv_one_device",
    }
    
  • VM 2개:

    python_test_host {
      ...
      test_config_template: ":sdv_two_devices",
    }
    
  • VM 3개:

    python_test_host {
      ...
      test_config_template: ":sdv_three_devices",
    }
    

대부분의 테스트에는 기본 템플릿으로 충분합니다. 특별한 이유가 없는 한 커스텀 구성을 만들지 마세요.

기본 제한 시간 업데이트

기본 제한 시간은 로컬에서 테스트를 실행하기에 충분해야 합니다.

제한 시간으로 인해 로컬에서 테스트가 실패하는 경우 테스트를 여러 테스트로 분할하는 것이 좋습니다. 테스트 사례가 많은 매우 긴 테스트는 실행에 병목 현상을 일으킬 수 있습니다.

기본값보다 높은 제한 시간을 설정해야 하는 경우 계속 읽어보세요.

기본 제한 시간 재정의

프레임워크는 atest 실행을 위한 템플릿 확장을 지원하지 않습니다. 따라서 연장된 제한 시간을 제공하는 제공된 템플릿을 사용하세요.

  • VM 1개 장기 테스트:

    python_test_host {
      ...
      test_config_template: ":sdv_one_device_long_test",
    }
    
  • VM 2개 장기 테스트:

    python_test_host {
      ...
      test_config_template: ":sdv_two_devices_long_test",
    }
    

이 템플릿을 사용하는 목적을 명확하게 나타내고 연장된 시간이 필요한 이유를 설명하는 주석을 추가합니다 (예: 테스트에서 특정 시간이 소요되는 아티팩트를 다운로드해야 하는 경우).

기기에 파일 푸시

다음 단계에서는 atest 구성의 기기에 파일을 푸시하는 방법을 설명합니다.

기기에 파일 푸시

프레임워크는 atest 실행을 위한 템플릿 확장을 지원하지 않습니다. 따라서 기본 템플릿을 완전히 대체하고 기기에 해당하는 target_preparer 옵션을 포함하는 AndroidTest.xml 파일을 만들어야 합니다.

  1. 템플릿의 콘텐츠를 복사합니다.

    • sdv-one-device.xml
    • sdv-two-devices.xml
    • sdv-three-devices.xml
  2. {MODULE}을 테스트의 모듈 이름으로 업데이트합니다.

  3. 각 기기에 com.android.tradefed.targetprep.PushFilePreparer님을 추가합니다.

<device name="device1">
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
    <option name="cleanup" value="true" />
    <option name="push-file" key="<FILE_NAME>" value="<REMOTE_FILE_PATH>" />
  </target_preparer>
</device>

CATBox 구성

테스트를 모음으로 실행하려면 CATBox 구성이 필요합니다.

  1. libraries/sdv/sdv_catbox/res/config/에 새 구성 파일을 만들고 다음 이름 지정 규칙을 따릅니다.

    • 샘플 테스트: sdv-sample-<NAME>-test.xml
    • E2E 테스트: sdv-e2e-<NAME>-test.xml
    • 장기 실행 테스트: sdv-long-running-<NAME>-test.xml
    • 성능 테스트: sdv-performance-<NAME>-test.xml
    • 하드웨어 테스트: sdv-hw-<NAME>-test.xml
  2. 테스트 유형에 따라 해당 정보를 추가합니다.

  • VM 테스트 구성 1개:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/one-device" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    
  • VM 2개 테스트 구성:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/two-devices" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    
  • VM 3개 테스트 구성:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/three-devices" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    

대부분의 테스트에는 기본 템플릿으로 충분합니다. 특별한 이유가 없는 한 커스텀 구성을 만들지 마세요.

기본 제한 시간 업데이트

기본 제한 시간이 테스트에 충분하지 않으면 재정의할 수 있습니다.

기본 제한 시간 재정의

기본 제한 시간을 재정의하려면 구성 파일 끝에 다음을 추가합니다. 긴 테스트의 최대 제한 시간은 10분이어야 합니다.

  <!-- Long Test - 10 minutes timeout: <REASON> -->
  <option name="mobly-host:mobly-test-timeout" value="600000" />

기기에 파일 푸시

다음 섹션에서는 CATBox를 구성할 때 기기에 파일을 푸시하는 방법을 설명합니다.

기기에 파일 푸시

해당 기기에 파일을 푸시하려면 plan 옵션 뒤에 다음 구성을 추가합니다.

<!-- Automatically pushes config file to device-->
<device name="device1">
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
    <option name="cleanup" value="true" />
    <option name="push-file"
      key="<FILE_NAME>"
      value="<REMOTE_FILE_PATH>"
    />
  </target_preparer>
</device>

각 기기에 파일이 필요한 경우 각 기기의 구성을 추가합니다(예: name=device1, name=device2).

테스트 실행

이 안내에서는 작동하는 SDV 환경 설정을 완료했다고 가정합니다.

환경 설정

프레임워크는 Cloud 가상 기기 (CVD) 인스턴스를 시작하지 않으므로 테스트를 실행하기 전에 시작해야 합니다.

  1. 환경을 설정하고 SDV 타겟을 실행합니다.

    . build/envsetup.sh
    lunch <TARGET>
    
  2. 첫 번째 CVD 인스턴스를 시작합니다.

    cvd create --config=sdv_core_instance1
    
  3. 두 번째 CVD 인스턴스를 시작합니다 (멀티 VM 테스트용).

    cvd create --config=sdv_core_instance2
    
  4. 세 번째 CVD 인스턴스를 시작합니다 (멀티 VM 테스트용).

    cvd create --config=sdv_core_instance3
    

atest 실행

atest <TestModuleName>

CATBox 실행

이 명령어는 저장소의 루트 디렉터리에 있다고 가정합니다.

  1. CATBox 빌드: m catbox
  2. (선택사항) CATBox에서 사용 가능한 모든 SDV 테스트 계획을 확인합니다.
out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed l p | grep sdv-

테스트 실행:

  • VM 테스트 하나 실행:

    NOTIFY_AS_NATIVE=0.0.0.0:6520 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520
    
  • VM 2개 테스트 실행:

    NOTIFY_AS_NATIVE=0.0.0.0:6520,0.0.0.0:6521 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520 --{device2}serial 0.0.0.0:6521
    
  • VM 3개 테스트 실행:

    NOTIFY_AS_NATIVE=0.0.0.0:6520,0.0.0.0:6521,0.0.0.0:6522 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520 --{device2}serial 0.0.0.0:6521 --{device3}serial 0.0.0.0:6522