GTest con parametri per i test HAL

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

Configurazione del test di base

GTest deve ereditare la classe di base testing::TestWithParam, di cui il parametro è il nome di ogni istanza. Nel metodo SetUp, il servizio può essere istanziato in base al nome dell'istanza, come mostrato nello snippet di codice seguente.

// 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 ogni metodo di test, utilizza la macro TEST_P come mostrato nell'esempio seguente:

TEST_P(UsbHidlTest, setCallback) {
...
}

Crea un'istanza della 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 valore corrispondente al tuo test. PerInstance è un nome comune.

  2. Il nome della classe di test.

  3. Una raccolta di nomi di istanze, che è possibile recuperare dal metodo integrato, ad esempio getAllHalInstanceNames.

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

Esegui il test con più input

GTest supporta le tuple per i 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 è disponibile in VtsHalGraphicsMapperV2_1TargetTest.

Rispetto al test G 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ù complessi, è consigliabile utilizzare una struttura e funzioni GTest ToString personalizzate.

Per creare un'istanza della suite di test, viene utilizzata anche la macro INSTANTIATE\_TEST\_CASE\_P, con due differenze:

  • Il terzo argomento è una raccolta di tuple (anziché una raccolta di stringhe nel caso di base).
  • Il metodo per compilare un nome di test deve supportare tuple. Puoi 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<>);