Для интерфейса 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);
Аргументы:
InstantiationName
, которое может быть любым, соответствующим вашему тесту.PerInstance
— это общее имя.Имя тестового класса.
Коллекция имен экземпляров, которую можно получить с помощью встроенного метода, например
getAllHalInstanceNames
.Метод для печати имени метода тестирования.
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);
Аргументы:
InstantiationName
, которое может быть любым, соответствующим вашему тесту.PerInstance
— это общее имя.Имя тестового класса.
Коллекция имен экземпляров, которую можно получить с помощью встроенного метода, например
getAllHalInstanceNames
.Метод для печати имени метода тестирования.
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<>);