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);
इसके तर्क हैं:
InstantiationName
, जो आपके टेस्ट से मैच करने वाली कोई भी चीज़ हो सकती है.PerInstance
एक सामान्य नाम है.टेस्ट क्लास का नाम.
इंस्टेंस के नाम का कलेक्शन, जो पहले से मौजूद तरीके से वापस लिया जाना चाहिए, उदाहरण के लिए,
getAllHalInstanceNames
.टेस्ट के तरीके का नाम प्रिंट करने का तरीका.
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<>);