การทดสอบพารามิเตอร์สำหรับการทดสอบ HAL

สำหรับอินเทอร์เฟซ 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);

ข้อโต้แย้งคือ:

  1. InstantiationName ซึ่งอาจเป็นอะไรก็ได้ที่ตรงกับการทดสอบของคุณ PerInstance เป็นชื่อสามัญ

  2. ชื่อคลาสการทดสอบ

  3. คอลเลกชันของชื่ออินสแตนซ์ ซึ่งสามารถดึงข้อมูลจากเมธอดบิวท์อิน เช่น getAllHalInstanceNames

  4. วิธีการพิมพ์ชื่อวิธีทดสอบ 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<>);