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