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