HAL 테스트용 매개변수화된 GTest

HAL 인터페이스에는 여러 개의 구현이 있을 수 있습니다. 각 인스턴스에서 HAL 구현을 테스트하려면 값이 매개변수화된 GTest를 작성하는 것이 표준 방법입니다.

기본 테스트 설정

GTest는 다음 기본 클래스 testing::TestWithParam를 상속해야 합니다. 매개변수는 각 인스턴스의 이름입니다. 다음 코드 스니펫에서 보는 바와 같이 서비스는 SetUp 메서드에서 인스턴스 이름에 따라 인스턴스화될 수 있습니다.

// The main test class for the USB hidl HAL
class UsbHidlTest : public testing::TestWithParam<std::string> {

 virtual void SetUp() override {
   usb = IUsb::getService(GetParam());
   ASSERT_NE(usb, nullptr);
...
 }

각 테스트 메서드에 다음 예와 같이 TEST_P 매크로를 사용합니다.

TEST_P(UsbHidlTest, setCallback) {
...
}

다음을 사용하여 도구 모음 인스턴스화 INSTANTIATE_TEST_SUITE_P 매크로를 사용해야 합니다.

INSTANTIATE_TEST_SUITE_P(
       PerInstance, UsbHidlTest,
       testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
       android::hardware::PrintInstanceNameToString);

인수는 다음과 같습니다.

  1. InstantiationName: 테스트와 일치하는 모든 항목이 될 수 있습니다. PerInstance는 일반적인 이름입니다.

  2. 테스트 클래스 이름입니다.

  3. 인스턴스 이름의 컬렉션으로, 기본 제공 메서드에서 가져올 수 있습니다. 예를 들면 getAllHalInstanceNames

  4. 테스트 메서드 이름을 인쇄하는 메서드입니다. PrintInstanceNameToString은 다음 작업에 사용할 수 있는 기본 이름입니다. 인스턴스 이름과 테스트 메서드 이름을 기반으로 테스트 이름을 컴파일합니다.

여러 입력을 사용하여 테스트

GTest는 값이 매개변수화된 테스트를 위한 튜플을 지원합니다. HAL 테스트에 여러 입력을 사용하는 테스트(예: 여러 인터페이스를 사용하는 테스트)가 필요하면 tuple을 테스트 매개변수로 사용하여 GTest를 작성할 수 있습니다. 전체 코드는 VtsHalGraphicsMapperV2_1TargetTest에서 확인할 수 있습니다.

단일 테스트 매개변수와 GTest를 비교해 보면, 이 테스트는 다음 예와 같이 tuple을 테스트 매개변수로 사용해야 합니다.

class GraphicsMapperHidlTest
   : public ::testing::TestWithParam<std::tuple<std::string, std::string>> {
 protected:
   void SetUp() override {
       ASSERT_NO_FATAL_FAILURE(mGralloc = std::make_unique<Gralloc>(std::get<0>(GetParam()),
                                                                    std::get<1>(GetParam())));

}

더 복잡한 매개변수가 필요한 경우에는 구조체 및 맞춤 GTest ToString 함수를 사용하는 것이 좋습니다.

테스트 모음을 인스턴스화하기 위해 INSTANTIATE\_TEST\_CASE\_P 매크로도 사용하며, 두 가지 차이점이 있습니다.

  • 세 번째 인수는 튜플의 컬렉션입니다(기본 사례의 문자열 컬렉션과 대조적).
  • 테스트 이름을 컴파일하는 메서드는 tuple을 지원해야 합니다. 이때 기본 제공 메서드인 PrintInstanceTupleNameToString가 다음 예와 같이 문자열 튜플을 처리합니다.
INSTANTIATE_TEST_CASE_P(
       PerInstance, GraphicsMapperHidlTest,
       testing::Combine(
               testing::ValuesIn(
                       android::hardware::getAllHalInstanceNames(IAllocator::descriptor)),
           testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMapper::descriptor))),
       android::hardware::PrintInstanceTupleNameToString<>);