Tradefed 테스트 실행기 작성

이 페이지에서는 Tradefed에서 새로운 테스트 실행기를 작성하는 방법에 대해 설명합니다.

배경

Tradefed 아키텍처에서의 테스트 실행기 위치가 궁금한 경우 테스트 실행기 구조를 참고하세요.

이는 새로운 테스트 실행기 작성을 위한 전제조건은 아니며, 테스트 실행기를 격리된 상태에서 작성할 수도 있습니다.

최소 요건: 인터페이스 구현

Tradefed 테스트 실행기로 승인되기 위한 최소 요건은 IRemoteTest 인터페이스, 즉 run(TestInformation testInfo, ITestInvocationListener listener) 메서드를 구현하는 것입니다.

이 메서드는 Java Runnable처럼 테스트 실행기를 사용할 때 하네스에 의해 호출됩니다.

메서드의 모든 부분은 테스트 실행기 실행의 일부로 간주됩니다.

테스트 실행기에서 결과 보고

기본 인터페이스의 run 메서드는 ITestInvocationListener 유형의 리스너 객체에 액세스 권한을 부여합니다. 이 객체는 테스트 실행기의 구조화된 결과를 하네스에 보고하기 위해 필요한 요소입니다.

테스트 실행기는 구조화된 결과를 보고함으로써 다음과 같은 속성을 보유합니다.

  • 실행된 모든 테스트, 소요 시간, 테스트별 합격/불합격 결과 또는 기타 상태에 관한 온전한 목록을 보고합니다.
  • 적용되는 경우 테스트와 관련된 측정항목(예: 설치 시간 측정항목)을 보고합니다.
  • 대부분의 인프라 도구에 맞습니다(예: 표시 결과 및 측정항목).
  • 실행에 관한 좀 더 세부적인 추적 기록이 있으므로 일반적으로 디버그하기가 쉽습니다.

하지만 구조화된 결과 보고는 선택사항입니다. 테스트 실행기는 실제 실행의 세부정보 없이 단순히 전체 실행의 상태를 PASSED 또는 FAILED로 평가할 수도 있습니다.

다음과 같은 이벤트를 리스너에서 호출하여 현재의 실행 진행률을 하네스에 알릴 수 있습니다.

  • testRunStarted: 상호 관련된 테스트 사례 그룹이 시작되었음을 알립니다.
    • testStarted: 테스트 사례가 시작되었음을 알립니다.
    • testFailed/testIgnored: 진행 중인 테스트 사례의 상태 변경을 알립니다. 상태가 변경되지 않은 테스트 사례는 합격으로 간주됩니다.
    • testEnded: 테스트 사례가 종료되었음을 알립니다.
  • testRunFailed: 테스트 사례 실행 그룹의 전반적인 상태가 불합격임을 알립니다. 테스트 실행은 실행에 예상되었던 결과에 따라 테스트 사례 결과와 상관없이 합격 또는 불합격일 수 있습니다. 예를 들어 여러 테스트 사례를 실행 중인 바이너리는 모든 합격 테스트 사례를 보고할 수 있지만 파일 유출을 비롯한 어떤 이유로든 오류 종료 코드를 포함할 수 있습니다.
  • testRunEnded: 테스트 사례 그룹이 종료되었음을 알립니다.

올바른 콜백 순서를 유지하고 확인하는 일은 테스트 실행기 구현자의 책임입니다. 예를 들어 finally 절을 사용하여 예외가 발생한 경우 testRunEnded가 호출되도록 합니다.

테스트 사례 콜백(testStarted, testEnded 등)은 선택사항입니다. 테스트 실행은 테스트 사례 없이도 발생할 수 있습니다.

이 이벤트 구조는 일반적인 JUnit 구조에서 착안되었습니다. 이는 대부분의 개발자가 알고 있는 기본적인 내용과 밀접성을 유지하기 위함입니다.

테스트 실행기에서 로그 보고

자체 Tradefed 테스트 클래스나 실행기를 작성한다면 IRemoteTest를 구현하고 run() 메서드를 통해 ITestInvocationListener를 가져옵니다. 이 리스너는 다음과 같이 파일을 기록하는 데 사용할 수 있습니다.

    listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);

기기로 테스트

위의 최소 인터페이스는 격리된 매우 간단한 테스트를 실행할 수 있게 해주며 Java 단위 테스트와 같은 특정 리소스도 필요하지 않습니다.

기기 테스트의 다음 단계로 넘어가고 싶은 테스트 작성자에게는 다음과 같은 인터페이스가 필요합니다.

  • IDeviceTest는 테스트 중인 기기를 나타내는 ITestDevice 객체의 수신을 허용하고 객체와 상호작용하는 API를 제공합니다.
  • IBuildReceiver는 테스트가 빌드 제공업체 단계에서 생성된 IBuildInfo 객체를 가져오도록 허용합니다. 이 단계에는 테스트 설정과 관련된 모든 정보와 아티팩트가 포함되어 있습니다.

일반적으로 테스트 실행기는 이러한 인터페이스에 관심을 가집니다. 이는 추가 파일처럼 실행과 관련된 아티팩트를 가져오고 실행 도중에 타겟팅될 테스트에 속한 기기를 가져오기 위함입니다.

여러 기기로 테스트

Tradefed는 여러 기기에서 테스트를 동시에 실행할 수 있도록 지원합니다. 이는 휴대전화 및 시계 페어링과 같은 외부 상호작용이 요구되는 구성요소를 테스트하는 경우에 유용합니다.

여러 기기를 사용할 수 있는 테스트 실행기를 작성하려면 IMultiDeviceTest를 구현해야 합니다. 이를 통해 기기 표현 및 관련 빌드 정보의 전체 목록이 포함된 IBuildInfo에 관한 ITestDevice 맵을 수신할 수 있습니다.

인터페이스의 setter는 항상 run 메서드 전에 호출되므로 run이 호출되면 구조를 사용할 수 있다고 가정해도 됩니다.

설정 인식 테스트

일부 테스트 실행기 구현에는 올바른 작동을 위해 전체 설정 관련 정보가 필요할 수 있습니다. 예를 들어 호출 관련 메타데이터나 이전에 실행된 target_preparer 등입니다.

이를 위해 테스트 실행기는 IConfiguration 객체에 액세스할 수 있는데 실행기는 이 객체의 일부이자 여기에서 실행됩니다. 자세한 내용은 구성 객체 설명을 참고하세요.

테스트 실행기 구현의 경우 IConfigurationReceiver를 구현하여 IConfiguration 객체를 수신해야 합니다.

유연한 테스트 실행기

테스트 실행기는 테스트에 관한 세부적인 제어가 가능한 경우 테스트 실행을 위한 유연한 방식을 제공할 수 있습니다. 예를 들어 JUnit 테스트 실행기는 각 단위 테스트를 개별적으로 실행할 수 있습니다.

그러면 더 큰 하네스 및 인프라에서 이러한 세부적인 제어를 활용할 수 있으며, 사용자는 필터링을 통해 테스트 실행기를 부분적으로 실행할 수 있습니다.

필터링 지원은 ITestFilterReceiver 인터페이스에 설명되어 있습니다. 이 인터페이스를 통해 실행하거나 실행하지 않아야 하는 테스트의 includeexclude 필터 집합을 수신할 수 있습니다.

일반적으로는 포함 필터 중 하나 이상과 일치하고 제외 필터와 하나도 일치하지 않으면 테스트가 실행됩니다. 포함 필터가 주어지지 않은 경우 제외 필터와 일치하지 않는 이상 모든 테스트가 실행되어야 합니다.