Параметризованный GTest для тестирования HAL

Для интерфейса HAL может быть несколько реализаций. Чтобы протестировать каждый экземпляр на предмет реализации HAL, стандартным способом является написание GTest с параметрами значений .

Базовая тестовая установка

GTest должен наследовать базовый класс testing::TestWithParam , параметром которого является имя каждого экземпляра. В методе SetUp можно создать экземпляр службы на основе имени экземпляра, как показано в следующем фрагменте кода.

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

Для каждого метода тестирования используйте макрос TEST_P как показано в следующем примере:

TEST_P(UsbHidlTest, setCallback) {
...
}

Создайте экземпляр набора с помощью макроса INSTANTIATE_TEST_SUITE_P , как показано в следующем примере:

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

Аргументы:

  1. InstantiationName , которое может быть любым, соответствующим вашему тесту. PerInstance — это общее имя.

  2. Имя тестового класса.

  3. Коллекция имен экземпляров, которую можно получить с помощью встроенного метода, например getAllHalInstanceNames .

  4. Метод для печати имени метода тестирования. PrintInstanceNameToString — это встроенное имя, которое можно использовать для компиляции имени теста на основе имени экземпляра и имени метода теста.

Тестирование с несколькими входами

GTest поддерживает кортежи для тестов, параметризованных значениями. Если тест HAL требует тестирования с несколькими входными данными (например, тест с несколькими интерфейсами), вы можете написать GTest с tuple в качестве параметра теста. Полный код можно найти в VtsHalGraphicsMapperV2_1TargetTest .

По сравнению с GTest с одним тестовым параметром, этот тест должен использовать tuple в качестве тестового параметра, как показано в следующем примере:

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

}

Если необходимы более сложные параметры, рекомендуется использовать структуру и собственные функции GTest ToString .

Для создания экземпляра набора тестов также используется макрос INSTANTIATE\_TEST\_CASE\_P с двумя отличиями:

  • Третий аргумент — это набор кортежей (вместо набора строк в базовом случае).
  • Метод компиляции имени теста должен поддерживать tuple . Вы можете использовать встроенный метод PrintInstanceTupleNameToString , который может обрабатывать кортежи строк, как показано в следующем примере:
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<>);
,

Для интерфейса HAL может быть несколько реализаций. Чтобы протестировать каждый экземпляр на предмет реализации HAL, стандартным способом является написание GTest с параметрами значений .

Базовая тестовая установка

GTest должен наследовать базовый класс testing::TestWithParam , параметром которого является имя каждого экземпляра. В методе SetUp можно создать экземпляр службы на основе имени экземпляра, как показано в следующем фрагменте кода.

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

Для каждого метода тестирования используйте макрос TEST_P как показано в следующем примере:

TEST_P(UsbHidlTest, setCallback) {
...
}

Создайте экземпляр набора с помощью макроса INSTANTIATE_TEST_SUITE_P , как показано в следующем примере:

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

Аргументы:

  1. InstantiationName , которое может быть любым, соответствующим вашему тесту. PerInstance — это общее имя.

  2. Имя тестового класса.

  3. Коллекция имен экземпляров, которую можно получить с помощью встроенного метода, например getAllHalInstanceNames .

  4. Метод для печати имени метода тестирования. PrintInstanceNameToString — это встроенное имя, которое можно использовать для компиляции имени теста на основе имени экземпляра и имени метода теста.

Тестирование с несколькими входами

GTest поддерживает кортежи для тестов, параметризованных значениями. Если тест HAL требует тестирования с несколькими входными данными (например, тест с несколькими интерфейсами), вы можете написать GTest с tuple в качестве параметра теста. Полный код можно найти в VtsHalGraphicsMapperV2_1TargetTest .

По сравнению с GTest с одним тестовым параметром, этот тест должен использовать tuple в качестве тестового параметра, как показано в следующем примере:

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

}

Если необходимы более сложные параметры, рекомендуется использовать структуру и собственные функции GTest ToString .

Для создания экземпляра набора тестов также используется макрос INSTANTIATE\_TEST\_CASE\_P с двумя отличиями:

  • Третий аргумент — это набор кортежей (вместо набора строк в базовом случае).
  • Метод компиляции имени теста должен поддерживать tuple . Вы можете использовать встроенный метод PrintInstanceTupleNameToString , который может обрабатывать кортежи строк, как показано в следующем примере:
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<>);