Test GTest z parametrami na potrzeby testowania HAL

Interfejs HAL może mieć wiele implementacji. Aby przetestować każdą instancję implementacji HAL, standardowym sposobem jest napisanie testu GTest z parametrami wartości.

Podstawowa konfiguracja testu

Test GTest musi dziedziczyć klasę bazową testing::TestWithParam, której parametrem jest nazwa każdej instancji. W metodzie SetUp usługę można utworzyć 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 testowania 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 pokazano w tym przykładzie:

INSTANTIATE_TEST_SUITE_P(
       PerInstance, UsbHidlTest,
       testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
       android::hardware::PrintInstanceNameToString);

Argumenty to:

  1. InstantiationName, czyli dowolny element pasujący do testu. PerInstance to popularna nazwa.

  2. Nazwa klasy testu.

  3. Kolekcja nazw instancji, które można pobrać za pomocą wbudowanej metody, np. getAllHalInstanceNames.

  4. Metoda drukowania nazwy metody testu. PrintInstanceNameToString to wbudowana nazwa, której możesz użyć do utworzenia nazwy testu na podstawie nazwy instancji i nazwy metody testu.

Testowanie z użyciem wielu danych wejściowych

GTest obsługuje krotki w przypadku testów z parametrami 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. Pełny kod znajdziesz w VtsHalGraphicsMapperV2_1TargetTest.

W porównaniu z GTestem z 1 parametrem testu ten test musi używać parametru testu tuple, 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 potrzebujesz bardziej skomplikowanych parametrów, zalecamy użycie struktury i niestandardowych funkcji GTest ToString.

Do utworzenia instancji pakietu testów używa się też makra INSTANTIATE\_TEST\_CASE\_P, ale z 2 różnicami:

  • Trzeci argument to kolekcja krotek (w przeciwieństwie do kolekcji ciągów znaków w przypadku podstawowym).
  • Metoda kompilacji nazwy testu musi obsługiwać tuple. Możesz użyć wbudowanej metody PrintInstanceTupleNameToString, która obsługuje krotki ciągów znaków, jak pokazano 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<>);