W przypadku interfejsu HAL może być wiele implementacji. Aby przetestować każdą instancję implementacji HAL, standardową metodą jest napisanie testu GTest z parametrami wartości.
Podstawowa konfiguracja testu
GTest musi dziedziczyć po klasie podstawowej testing::TestWithParam
, której parametrem jest nazwa każdej instancji. W metodzie SetUp
usługa może zostać uruchomiona na podstawie nazwy instancji, jak pokazano w tym 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);
...
}
W przypadku każdej metody testu użyj makra TEST_P
, jak pokazano w tym przykładzie:
TEST_P(UsbHidlTest, setCallback) {
...
}
Utwórz instancję pakietu za pomocą makra INSTANTIATE_TEST_SUITE_P
, jak w tym przykładzie:
INSTANTIATE_TEST_SUITE_P(
PerInstance, UsbHidlTest,
testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
android::hardware::PrintInstanceNameToString);
Argumenty to:
InstantiationName
, co może być dowolnym elementem pasującym do testu.PerInstance
to typowa nazwa.Nazwa klasy testu.
Kolekcja nazw instancji, którą można pobrać z wbudowanej metody, na przykład
getAllHalInstanceNames
.Metoda drukowania nazwy metody testu.
PrintInstanceNameToString
to wbudowana nazwa, której możesz użyć do skompilowania nazwy testu na podstawie nazwy instancji i metody testu.
Testowanie z użyciem wielu danych wejściowych
GTest obsługuje tuple w przypadku testów z parametrami wartościowymi. Jeśli test HAL wymaga testowania z użyciem wielu danych wejściowych (np. test z wieloma interfejsami), możesz napisać test GTest z parametrem testu tuple
. Pełny kod znajdziesz w VtsHalGraphicsMapperV2_1TargetTest
.
W porównaniu z parametrem GTest z jednym parametrem testowym ten test musi używać parametru tuple
, jak w tym przykładzie:
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 potrzebujesz bardziej skomplikowanych parametrów, zalecamy użycie struktury i niestandardowych funkcji GTest ToString
.
Do utworzenia instancji pakietu testowego używane jest również makro INSTANTIATE\_TEST\_CASE\_P
, które ma dwie różnice:
- Trzeci argument to zbiór krotek (w podstawowym przypadku zamiast zbioru ciągów).
- Metoda kompilacji nazwy testu musi obsługiwać atrybut
tuple
. Możesz użyć wbudowanej metodyPrintInstanceTupleNameToString
, która obsługuje krotki ciągów znaków, jak w tym 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<>);