بالنسبة إلى واجهة 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
هو اسم مضمّن يمكنك استخدامه ل 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())));
…
}
إذا كانت هناك حاجة إلى معلَمات أكثر تعقيدًا، ننصحك باستخدام بنية ودوال 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<>);