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