Для интерфейса 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<>);