بالنسبة إلى واجهة 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);
الوسيطات هي:
InstantiationName
، والذي يمكن أن يكون أي شيء تتطابق مع اختبارك.PerInstance
هو اسم شائع.تمثّل هذه السمة اسم فئة الاختبار.
مجموعة من أسماء المثيلات، والتي يمكن استردادها من الطريقة المضمنة، على سبيل المثال،
getAllHalInstanceNames
طريقة طباعة اسم طريقة الاختبار "
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<>);