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 รองรับ 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<>);