Gtest parametrizzato per il test HAL

Per un'interfaccia HAL potrebbero esserci più implementazioni. Per testare ogni istanza per un'implementazione HAL, il modo standard è scrivere un gtest con parametri di valore .

Configurazione di base del test

Il gtest deve ereditare la classe base testing::TestWithParam , di cui il parametro è il nome di ciascuna istanza. Nel metodo SetUp è possibile creare un'istanza del servizio in base al nome dell'istanza, come mostrato nel seguente frammento di codice.

// 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);
...
 }

Per ciascun metodo di prova, utilizzare la macro TEST_P come mostrato nell'esempio seguente.

TEST_P(UsbHidlTest, setCallback) {
...
}

Istanziare la suite con la macro INSTANTIATE_TEST_SUITE_P , come mostrato nell'esempio seguente.

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

Gli argomenti sono:

  1. InstantiationName , che può essere qualsiasi cosa che corrisponda al tuo test. PerInstance è un nome comune.

  2. Il nome della classe di test.

  3. Una raccolta di nomi di istanze, che possono essere recuperati dal metodo integrato, ad esempio getAllHalInstanceNames .

  4. Il metodo per stampare il nome del metodo di prova. PrintInstanceNameToString è un nome integrato che è possibile utilizzare per compilare un nome di test in base al nome dell'istanza e al nome del metodo di test.

Prova con più input

gtest supporta tuple per test con parametri di valore. Quando un test HAL richiede test con più input (ad esempio, un test con più interfacce), puoi scrivere un gtest con tuple come parametro di test. Il codice completo può essere trovato in VtsHalGraphicsMapperV2_1TargetTest .

Rispetto al gtest con un singolo parametro di test, questo test deve utilizzare tuple come parametro di test, come mostrato nell'esempio seguente.

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())));
…
}

Se sono necessari parametri più complicati, è consigliabile utilizzare una struttura e funzioni gtest ToString personalizzate.

Per istanziare la test suite viene utilizzata anche la macro INSTANTIATE\_TEST\_CASE\_P , con due differenze:

  • Il terzo argomento è una raccolta di tuple (rispetto a una raccolta di stringhe nel caso base).
  • Il metodo per compilare un nome di test deve supportare tuple . È possibile utilizzare il metodo integrato PrintInstanceTupleNameToString , che può gestire tuple di stringhe, come mostrato nell'esempio seguente.
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<>);