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<>);