GTest پارامتری برای تست HAL، GTest پارامتری برای تست HAL، GTest پارامتری برای تست HAL، GTest پارامتری برای تست HAL

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

استدلال‌ها عبارتند از:

  1. InstantiationName که می‌تواند هر چیزی باشد که با تست شما مطابقت داشته باشد. PerInstance یک نام رایج است.

  2. نام کلاس آزمایشی

  3. مجموعه‌ای از نام‌های نمونه، که می‌توانند از متد داخلی بازیابی شوند، برای مثال، getAllHalInstanceNames .

  4. متدی برای چاپ نام متد تست. 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 استفاده کنید که می‌تواند tupleهای رشته‌ها را مدیریت کند، همانطور که در مثال زیر نشان داده شده است:
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<>);