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

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 टेस्ट के लिए कई इनपुट (उदाहरण के लिए, कई इंटरफ़ेस वाला टेस्ट) की ज़रूरत होती है, तो टेस्ट पैरामीटर के तौर पर 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<>);