W przypadku interfejsu HAL może być kilka implementacji. Aby przetestować każdą instancję implementacji HAL, standardowym sposobem 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
SetUp
, usługę można utworzyć na podstawie
instancji jak 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);
...
}
W przypadku każdej metody testowania użyj makra TEST_P
, jak pokazano w tym przykładzie:
TEST_P(UsbHidlTest, setCallback) {
...
}
Utwórz instancję pakietu za pomocą
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:
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 wyświetlania nazwy metody testowej.
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 krotki w przypadku testów z parametrem wartości. 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
. Kompletny
znajdziesz w VtsHalGraphicsMapperV2_1TargetTest
.
W porównaniu z testem GTest z jednym parametrem testowym ten test musi korzystać z
tuple
jako parametr testowy, 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 złożonych parametrów, zalecamy użycie struktury i funkcji niestandardowych GTest ToString
.
Aby utworzyć instancję pakietu testowego, makro INSTANTIATE\_TEST\_CASE\_P
Istnieją dwie różnice:
- Trzeci argument to zbiór tupla (w odróżnieniu od zbioru ciągów tekstowych w przypadku podstawowym).
- Metoda kompilacji nazwy testu musi obsługiwać atrybut
tuple
. Możesz użyć wbudowanej metodyPrintInstanceTupleNameToString
, która obsługuje tuple 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<>);