اختبار GTest المُستخدِم للمَعلمات لاختبار HAL

بالنسبة إلى واجهة HAL، قد تكون هناك عمليات تنفيذ متعددة. لاختبار كلّ مثيل لعملية تنفيذ HAL، الطريقة العادية هي كتابة a 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<>);