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);
인수는 다음과 같습니다.
InstantiationName
: 테스트와 일치하는 모든 항목이 될 수 있습니다.PerInstance
는 일반적인 이름입니다.테스트 클래스 이름입니다.
인스턴스 이름의 컬렉션으로, 기본으로 제공되는 메서드(예:
getAllHalInstanceNames
)에서 가져올 수 있습니다.테스트 메서드 이름을 인쇄하는 메서드입니다.
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<>);