Test GTest z parametrami na potrzeby testowania HAL

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:

  1. InstantiationName, co może być dowolnym elementem pasującym do testu. PerInstance to typowa nazwa.

  2. Nazwa klasy testu.

  3. Kolekcja nazw instancji, którą można pobrać z wbudowanej metody, na przykład getAllHalInstanceNames.

  4. 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 metody PrintInstanceTupleNameToString, 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<>);