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