สำหรับอินเทอร์เฟซ 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
ด้วย โดยมีข้อแตกต่าง 2 อย่างดังนี้
- อาร์กิวเมนต์ที่ 3 คือคอลเล็กชันของทูเพิล (เทียบกับคอลเล็กชัน ของสตริงในกรณีพื้นฐาน)
- วิธีการรวบรวมชื่อการทดสอบต้องรองรับ
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<>);