GTest แบบมีพารามิเตอร์สําหรับการทดสอบ 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())));

}

หากต้องการพารามิเตอร์ที่ซับซ้อนมากขึ้น ขอแนะนำให้ใช้โครงสร้างและฟังก์ชัน 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<>);