W przypadku interfejsu HAL może istnieć wiele implementacji. Aby przetestować każdą instancję pod kątem implementacji HAL, standardowym sposobem jest napisanie parametru gtest .
Podstawowa konfiguracja testu
Gtest musi dziedziczyć klasę bazową testing::TestWithParam
, której parametrem jest nazwa każdej instancji. W metodzie SetUp
można utworzyć instancję usługi na podstawie nazwy instancji, jak pokazano w poniższym fragmencie kodu.
// 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);
...
}
Dla każdej metody testowej użyj makra TEST_P
, jak pokazano w poniższym przykładzie.
TEST_P(UsbHidlTest, setCallback) {
...
}
Utwórz instancję pakietu za pomocą makra INSTANTIATE_TEST_SUITE_P
, jak pokazano w poniższym przykładzie.
INSTANTIATE_TEST_SUITE_P(
PerInstance, UsbHidlTest,
testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
android::hardware::PrintInstanceNameToString);
Argumenty są następujące:
InstantiationName
, która może być dowolna, która pasuje do Twojego testu.PerInstance
to nazwa zwyczajowa.Nazwa klasy testowej.
Kolekcja nazw instancji, które można pobrać z metody wbudowanej, na przykład
getAllHalInstanceNames
.Metoda drukowania nazwy metody testowej.
PrintInstanceNameToString
to wbudowana nazwa, której można użyć do skompilowania nazwy testu na podstawie nazwy instancji i nazwy metody testowej.
Testuj z wieloma wejściami
gtest obsługuje krotki dla testów sparametryzowanych wartością. Gdy test HAL wymaga testowania z wieloma danymi wejściowymi (na przykład testu z wieloma interfejsami), możesz napisać gtest z tuple
jako parametrem testowym. Kompletny kod można znaleźć w VtsHalGraphicsMapperV2_1TargetTest
.
W porównaniu do gtest z pojedynczym parametrem testowym, ten test musi używać tuple
jako parametru testowego, jak pokazano w przykładzie poniżej.
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())));
…
}
Jeśli potrzebne są bardziej skomplikowane parametry, zaleca się użycie struktury i niestandardowych funkcji gtest ToString
.
Aby utworzyć instancję zestawu testów, używane jest również makro INSTANTIATE\_TEST\_CASE\_P
, z dwiema różnicami:
- Trzeci argument to zbiór krotek (w przeciwieństwie do zbioru ciągów znaków w podstawowym przypadku).
- Metoda kompilowania nazwy testu musi obsługiwać
tuple
. Możesz użyć wbudowanej metodyPrintInstanceTupleNameToString
, która może obsługiwać krotki ciągów, jak pokazano w poniższym przykładzie.
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<>);