สำหรับอินเทอร์เฟซ 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 รองรับ tuples สำหรับการทดสอบที่กำหนดพารามิเตอร์เป็นพารามิเตอร์ เมื่อการทดสอบ 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<>);