HAL পরীক্ষার জন্য প্যারামিটারাইজড 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<>);
,

একটি 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<>);