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<>);