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

}

إذا كانت هناك حاجة إلى معلَمات أكثر تعقيدًا، يُنصح باستخدام بنية ودوال ToString مخصّصة في GTest.

لبدء مجموعة الاختبار، يتم استخدام الماكرو 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<>);