สำหรับอินเทอร์เฟซ 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())));
…
}
หากต้องการพารามิเตอร์ที่ซับซ้อนกว่านี้ ขอแนะนำให้ใช้โครงสร้างและฟังก์ชัน ToString
ของ gtest ที่กำหนดเอง
เมื่อต้องการสร้างอินสแตนซ์ของชุดการทดสอบ จะมีการใช้มาโคร 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<>);