Test GTest z parametrami na potrzeby testowania HAL

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:

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