Sparametryzowany gtest do testowania HAL

W przypadku interfejsu HAL może istnieć wiele implementacji. Aby przetestować każdą instancję pod kątem implementacji HAL, standardowym sposobem jest napisanie parametru gtest .

Podstawowa konfiguracja testu

Gtest musi dziedziczyć klasę bazową testing::TestWithParam , której parametrem jest nazwa każdej instancji. W metodzie SetUp można utworzyć instancję usługi na podstawie nazwy instancji, jak pokazano 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);
...
 }

Dla każdej metody testowej użyj makra TEST_P , jak pokazano w poniższym przykładzie.

TEST_P(UsbHidlTest, setCallback) {
...
}

Utwórz instancję pakietu za pomocą makra INSTANTIATE_TEST_SUITE_P , jak pokazano w poniższym przykładzie.

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

Argumenty są następujące:

  1. InstantiationName , która może być dowolna, która pasuje do Twojego testu. PerInstance to nazwa zwyczajowa.

  2. Nazwa klasy testowej.

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

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

Testuj z wieloma wejściami

gtest obsługuje krotki dla testów sparametryzowanych wartością. Gdy test HAL wymaga testowania z wieloma danymi wejściowymi (na przykład testu z wieloma interfejsami), możesz napisać gtest z tuple jako parametrem testowym. Kompletny kod można znaleźć w VtsHalGraphicsMapperV2_1TargetTest .

W porównaniu do gtest z pojedynczym parametrem testowym, ten test musi używać tuple jako parametru testowego, 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 potrzebne są bardziej skomplikowane parametry, zaleca się użycie struktury i niestandardowych funkcji gtest ToString .

Aby utworzyć instancję zestawu testów, używane jest również makro INSTANTIATE\_TEST\_CASE\_P , z dwiema różnicami:

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