‫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<>);