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