एचएएल परीक्षण के लिए पैरामीटरयुक्त gtest

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