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