اختبار 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 هو اسم مضمّن يمكنك استخدامه ل compiling اسم اختبار استنادًا إلى اسم المثيل واسم طريقة الاختبار.

الاختبار باستخدام مدخلات متعددة

يتيح 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<>);