एचएएल टेस्टिंग के लिए पैरामीटर वाला GTest

एचएएल इंटरफ़ेस के लिए, कई तरीके से लागू किया जा सकता है. 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 टेस्ट के लिए कई इनपुट (उदाहरण के लिए, कई इंटरफ़ेस वाला टेस्ट) की ज़रूरत होती है, तो टेस्ट पैरामीटर के तौर पर tuple के साथ GTest लिखा जा सकता है. पूरा कोड 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 का भी इस्तेमाल किया जाता है. हालांकि, इसमें दो अंतर होते हैं:

  • तीसरा आर्ग्युमेंट ट्यूपल का कलेक्शन होता है, जबकि बुनियादी मामले में स्ट्रिंग का कलेक्शन होता है.
  • टेस्ट का नाम कंपाइल करने के तरीके में 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<>);