Gtest parametrizzato per test HAL

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

Configurazione del test di base

Il test gtest deve ereditare la classe base testing::TestWithParam, di in cui il parametro è il nome di ogni istanza. Nella SetUp, è possibile creare un'istanza del servizio in base al di un'istanza, come mostrato nello snippet di codice riportato di seguito.

// 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 riportato di seguito.

TEST_P(UsbHidlTest, setCallback) {
...
}

Crea un'istanza della suite con INSTANTIATE_TEST_SUITE_P, come mostrato nell'esempio riportato di seguito.

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 corrisponde al test. PerInstance è un nome comune.

  2. Il nome della classe di test.

  3. Una raccolta di nomi di istanze, che può essere recuperata 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 Compila un nome di test basato sul nome dell'istanza e sul nome del metodo di test.

Esegui test con più input

gtest supporta le tuple per i test con parametri di valore. Quando Il test HAL richiede il test con più input (ad esempio, un test con più interfacce), puoi scrivere un gtest con tuple come parametro di test. L'intero disponibile in VtsHalGraphicsMapperV2_1TargetTest.

Rispetto a gtest con un singolo parametro di test, questo test deve utilizzare tuple come parametro di test, come mostrato nell'esempio riportato di seguito.

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, ti consigliamo di utilizzare un parametro struttura e funzioni gtest ToString personalizzate.

Per creare un'istanza della suite di test, anche la macro INSTANTIATE\_TEST\_CASE\_P viene dei dati, 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 la modalità il metodo integrato PrintInstanceTupleNameToString, che può per 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<>);