اختبار 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<>);