টেস্ট শার্ডিং

টেস্ট কর্পাস বড় হলে বা এক্সিকিউশন টাইম বেশি হলে, আমরা একাধিক ডিভাইসে টেস্ট স্প্লিট করার সুবিধা দিই: শার্ডিং।

শর্ডিংয়ের জন্য টেস্ট রানারের পূর্বশর্ত আছে।

বেশিরভাগ মূল টেস্ট রানার আগেই শার্ডিংয়ের সাথে কাজ করে, তাই অতিরিক্ত কিছু করার প্রয়োজন নেই। এগুলি আগে থেকেই শার্ডিং সাপোর্ট করে: ইনস্ট্রুমেন্টেশন টেস্ট, হোস্ট-সাইড চালিত টেস্ট, GTest।

Tradefed-এ আমরা দুই ধরনের শার্ডিং সাপোর্ট করি: লোকাল ও ডিস্ট্রিবিউট করা। দু'টির মধ্যে কিছু মিল আছে, তাই এই পৃষ্ঠায় সাধারণ বৈশিষ্ট্যগুলি বর্ণনা করা হয়েছে এবং তারপরে প্রতিটি সম্পর্কে নির্দিষ্ট তথ্য দেওয়া হয়েছে।

সাধারণ প্রপার্টি

শার্ডিংয়ের দুটি ফর্মই টেস্ট রানারদের থেকে একই প্রপার্টি ধরে নেয়: শার্ডগুলিকে স্বতন্ত্র ও নির্ধারিত হতে হবে। দুটি শার্ডিংয়ের প্রথম ধাপ হল টেস্টের সম্পূর্ণ সাজানো তালিকা তৈরি করা এবং তারপরে সেগুলিকে আলাদা আলাদা গ্রুপ/শার্ডে ভাগ করা।

শার্ডিং ফর্মের মধ্যে প্রধান পার্থক্য হল, সেগুলি যেভাবে পরীক্ষা চালায়। নিচের বিভাগে আরও বিবরণ দেওয়া আছে।

লোকাল শার্ডিং

লোকাল শার্ডিং মানে শার্ডেড ইনভোকেশন কার্যকর করার সাথে যুক্ত সব ডিভাইস একই ফিজিক্যাল হোস্টের সাথে কানেক্ট করা আছে।

এক্সিকিউশন

লোকাল শার্ডিং, একই হোস্টের সাথে কানেক্ট করা সব ডিভাইসের সুবিধা নেয়। এর জন্য, এক্সিকিউট করতে হবে এমন টেস্টের একটি পুল তৈরি করা হয় এবং প্রতিটি ডিভাইস ফ্রি থাকাকালীন (অর্থাৎ, আগের টেস্ট সম্পূর্ণ হয়ে গেলে) টেস্ট পোল করে। এর ফলে ডিভাইস অপ্টিমাইজ করা যায়। এছাড়াও, আমরা এটিকে ডায়নামিক শার্ডিং বলি।

বিকল্প

--shard-count XX

ডিস্ট্রিবিউটেড শার্ডিং

ডিস্ট্রিবিউট করা শার্ডিং বলতে বোঝায় যে শার্ড করা ইনভোকেশন এক্সিকিউট করার সাথে যুক্ত সব ডিভাইস যেকোনও জায়গায় থাকতে পারে এবং আলাদা আলাদা ফিজিক্যাল হোস্টের সাথে কানেক্ট করা থাকতে পারে।

এক্সিকিউশন

টেস্টের তালিকা তৈরি করার সময় ডিস্ট্রিবিউটেড শার্ডিং হয় এবং প্রতিটি শার্ডের কন্টেন্ট শুধুমাত্র বর্তমানে অনুরোধ করা শার্ড এক্সিকিউট করে। তাই, সব ডিস্ট্রিবিউট করা শার্ড প্রথমে একই তালিকা তৈরি করে এবং তারপরে এর পারস্পরিক এক্সক্লুসিভ সাবসেট এক্সিকিউট করে, যার ফলে সমস্ত পরীক্ষা এক্সিকিউট করা হয়।

এই ফর্মের মূল প্রপার্টি হল, শার্ডগুলি একে অপরের ব্যাপারে সম্পূর্ণভাবে অজ্ঞাত এবং স্বাধীনভাবে ব্যর্থ হতে পারে।

প্রধান সমস্যা হল, শার্ডের দৈর্ঘ্য ব্যালেন্স করা যায় না, কারণ আমরা প্রতিটি শার্ডে প্রতিটি টেস্টের রানটাইম আগে থেকে অনুমান করতে পারি না। প্রতিটি শার্ডে প্রায় একই সংখ্যক টেস্ট কেস রাখার জন্য ডিস্ট্রিবিউশন করা হয়।

বিকল্প

--shard-count XX --shard-index XX

টোকেন শার্ডিং

টোকেন শার্ডিং শুধুমাত্র লোকাল শার্ডিংয়ের সাথে ব্যবহার করা যেতে পারে। নন-লোকাল শার্ডিং ব্যবহারের ক্ষেত্রে ফ্ল্যাগটি অকার্যকর। কখনও কখনও শার্ডিংয়ে যুক্ত ডিভাইসগুলির মধ্যে একটিতে বিশেষ রিসোর্স থাকে যা অন্যগুলিতে থাকে না, যেমন সিম কার্ড। কিছু টেস্ট শুধুমাত্র তখনই কাজ করতে পারে যখন সেই বিশেষ রিসোর্স উপলভ্য থাকে এবং অন্যথায় ব্যর্থ হবে।

এই ধরনের ব্যবহারের ক্ষেত্রে টোকেন শার্ডিং হল আমাদের সমাধান। টেস্ট মডিউলগুলি তাদের AndroidTest.xml-এ কোন বিশেষ রিসোর্স প্রয়োজন তা ঘোষণা করতে পারে এবং Tradefed সেই রিসোর্স আছে এমন ডিভাইসে টেস্টগুলিকে রাউট করে।

XML কনফিগারেশন

<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />

টোকেনের value Tradefed-এর TokenProperty-এর সাথে ম্যাচ করে এবং TokenProviderHelper-এর হ্যান্ডলারের সাথে যুক্ত।

এর ফলে, টেস্ট মডিউলগুলি এমন ডিভাইসে চালানো যায় যা সঠিকভাবে পরীক্ষাগুলি চালাতে পারে।

কোনও ডিভাইসে পরীক্ষা চালানো না গেলে কী হবে?

পরীক্ষা মডিউলের সাথে ম্যাচ করা রিসোর্স উপলভ্য না থাকলে, পরীক্ষা মডিউলটি সঠিকভাবে এক্সিকিউট করা যায় না বলে সেটি ব্যর্থ ও স্কিপ করা হয়।

যেমন, কোনও টেস্ট মডিউল চালানোর জন্য সিম কার্ডের অনুরোধ করলে কিন্তু কোনও ডিভাইসে সিম কার্ড না থাকলে, টেস্ট মডিউলটি কাজ করে না।

প্রয়োগ

মূল Tradefed কমান্ড লাইনে এই ফিচার ফ্ল্যাগ পাস করুন:

--enable-token-sharding