एचएएल टेस्टिंग के लिए पैरामीटर वाला 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<>);