gtest parametrizado para pruebas HAL

Para una interfaz HAL, puede haber varias implementaciones. Para probar cada instancia para una implementación HAL, la forma estándar es escribir un gtest con parámetros de valor .

Configuración de prueba básica

El gtest debe heredar la clase base testing::TestWithParam , cuyo parámetro es el nombre de cada instancia. En el método SetUp , se puede crear una instancia del servicio según el nombre de la instancia, como se muestra en el siguiente fragmento de código.

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

Para cada método de prueba, utilice la macro TEST_P como se muestra en el siguiente ejemplo.

TEST_P(UsbHidlTest, setCallback) {
...
}

Cree una instancia de la suite con la macro INSTANTIATE_TEST_SUITE_P , como se muestra en el siguiente ejemplo.

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

Los argumentos son:

  1. InstantiationName , que puede ser cualquier cosa que coincida con su prueba. PerInstance es un nombre común.

  2. El nombre de la clase de prueba.

  3. Una colección de nombres de instancias, que se pueden recuperar desde el método integrado, por ejemplo, getAllHalInstanceNames .

  4. El método para imprimir el nombre del método de prueba. PrintInstanceNameToString es un nombre integrado que puede utilizar para compilar un nombre de prueba basado en el nombre de la instancia y el nombre del método de prueba.

Prueba con múltiples entradas

gtest admite tuplas para pruebas con parámetros de valor. Cuando una prueba HAL requiere pruebas con múltiples entradas (por ejemplo, una prueba con múltiples interfaces), puede escribir una prueba gtest con tuple como parámetro de prueba. El código completo se puede encontrar en VtsHalGraphicsMapperV2_1TargetTest .

En comparación con gtest con un solo parámetro de prueba, esta prueba necesita usar tuple como parámetro de prueba, como se muestra en el siguiente ejemplo.

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

Si se necesitan parámetros más complicados, se recomienda utilizar una estructura y funciones ToString personalizadas de gtest.

Para crear una instancia del conjunto de pruebas, también se utiliza la macro INSTANTIATE\_TEST\_CASE\_P , con dos diferencias:

  • El tercer argumento es una colección de tuplas (a diferencia de una colección de cadenas en el caso básico).
  • El método para compilar un nombre de prueba debe admitir tuple . Puede utilizar el método incorporado PrintInstanceTupleNameToString , que puede manejar tuplas de cadenas, como se muestra en el siguiente ejemplo.
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<>);