برای یک رابط 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<>);