যখন টেস্ট কর্পাস বড় হয় বা এক্সিকিউশন টাইম দীর্ঘ হয়ে যায়, তখন আমরা টেস্টগুলোকে একাধিক ডিভাইসে ভাগ করার সুযোগ দিই: শার্ডিং ।
টেস্ট রানারের শার্ডিং সমর্থন করার জন্য কিছু পূর্বশর্ত রয়েছে।
বেশিরভাগ প্রধান টেস্ট রানার ইতিমধ্যেই শার্ডিং সমর্থন করে, তাই কোনো অতিরিক্ত কাজের প্রয়োজন নেই। এগুলি ইতিমধ্যেই শার্ডিং সমর্থন করে: ইন্সট্রুমেন্টেশন টেস্ট, হোস্ট-সাইড ড্রাইভেন টেস্ট, জিটেস্ট।
ট্রেডফেডে আমরা দুই ধরনের শার্ডিং সমর্থন করি: লোকাল এবং ডিস্ট্রিবিউটেড। এদের মধ্যে কিছু সাদৃশ্য রয়েছে, তাই এই পৃষ্ঠায় প্রথমে সাধারণ বৈশিষ্ট্যগুলো এবং তারপর প্রতিটির নির্দিষ্ট বিবরণ বর্ণনা করা হয়েছে।
সাধারণ বৈশিষ্ট্য
উভয় প্রকার শার্ডিং-ই টেস্ট রানারদের কাছ থেকে একই বৈশিষ্ট্য প্রত্যাশা করে: শার্ডগুলোকে স্বাধীন এবং ডিটারমিনিস্টিক হতে হবে। উভয় শার্ডিংয়ের প্রথম ধাপ হলো টেস্টগুলোর সম্পূর্ণ ক্রমিক তালিকা তৈরি করা এবং তারপর সেগুলোকে বিভিন্ন গ্রুপ/শার্ডে বিভক্ত করা।
শার্ডিং ফর্মগুলোর প্রধান পার্থক্য হলো তাদের টেস্ট সম্পাদনের পদ্ধতিতে। নিচের বিভাগগুলোতে আরও বিস্তারিত আলোচনা করা হয়েছে।
স্থানীয় শার্ডিং
লোকাল শার্ডিং মানে হলো, শার্ডেড ইনভোকেশন সম্পাদনে জড়িত সমস্ত ডিভাইস একই ফিজিক্যাল হোস্টের সাথে সংযুক্ত থাকে।
মৃত্যুদণ্ড
লোকাল শার্ডিং একই হোস্টে সংযুক্ত সমস্ত ডিভাইসের সুবিধা গ্রহণ করে। এটি সম্পাদনের জন্য প্রয়োজনীয় টেস্টগুলোর একটি পুল তৈরি করে এবং প্রতিটি ডিভাইস যখন ফ্রি থাকে (অর্থাৎ, আগের টেস্টটি শেষ হয়ে গেলে) তখন অন্য টেস্টের জন্য পোলিং করে। এর ফলে ডিভাইসের সর্বোত্তম ব্যবহার নিশ্চিত হয়। আমরা একে ডাইনামিক শার্ডিং- ও বলি।
বিকল্প
--shard-count XX
বিতরণকৃত শার্ডিং
ডিস্ট্রিবিউটেড শার্ডিং মানে হলো, শার্ডেড ইনভোকেশন সম্পাদনে জড়িত সমস্ত ডিভাইস যেকোনো স্থানে থাকতে পারে এবং বিভিন্ন ফিজিক্যাল হোস্টের সাথে সংযুক্ত থাকতে পারে।
মৃত্যুদণ্ড
টেস্টের তালিকা তৈরির সময় ডিস্ট্রিবিউটেড শার্ডিং ঘটে, এবং প্রতিটি শার্ডের বিষয়বস্তু শুধুমাত্র বর্তমানে অনুরোধ করা শার্ডটিকেই এক্সিকিউট করে। তাই সমস্ত ডিস্ট্রিবিউটেড শার্ড প্রথমে একই তালিকা তৈরি করে এবং তারপর সেটির একটি পারস্পরিকভাবে স্বতন্ত্র উপসেট এক্সিকিউট করে, যার ফলে সমস্ত টেস্টই সম্পাদিত হয়।
এই রূপটির প্রধান বৈশিষ্ট্য হলো এর খণ্ডগুলো একে অপরের সম্পর্কে সম্পূর্ণ অজ্ঞ থাকে এবং স্বাধীনভাবে বিকল হতে পারে।
এর প্রধান অসুবিধা হলো যে শার্ডের দৈর্ঘ্য সবসময় সুষম থাকে না, কারণ আমরা প্রতিটি শার্ডের প্রতিটি টেস্টের রানটাইম আগে থেকে অনুমান করতে পারি না। এই বিন্যাসটি এমনভাবে করা হয় যাতে প্রতিটি শার্ডে টেস্ট কেসের সংখ্যা প্রায় সমান থাকে।
বিকল্প
--shard-count XX --shard-index XX
টোকেন শার্ডিং
টোকেন শার্ডিং শুধুমাত্র লোকাল শার্ডিং-এর সাথেই ব্যবহার করা যায়। নন-লোকাল শার্ডিং ব্যবহারের ক্ষেত্রে এই ফ্ল্যাগটি অকার্যকর থাকে। কখনও কখনও শার্ডিং-এ জড়িত ডিভাইসগুলোর মধ্যে কোনো একটিতে এমন বিশেষ রিসোর্স থাকে যা অন্যগুলোতে থাকে না, যেমন একটি সিম কার্ড। কিছু টেস্ট শুধুমাত্র তখনই কাজ করতে পারে যখন সেই বিশেষ রিসোর্সটি উপলব্ধ থাকে এবং অন্যথায় ব্যর্থ হতে পারে।
এই ধরনের ব্যবহারের ক্ষেত্রে টোকেন শার্ডিং হলো আমাদের সমাধান। টেস্ট মডিউলগুলো তাদের AndroidTest.xml ফাইলে কোন বিশেষ রিসোর্সটি প্রয়োজন তা ঘোষণা করতে পারে, এবং ট্রেডফেড সেই রিসোর্সটি আছে এমন একটি ডিভাইসে টেস্টগুলো পাঠিয়ে দেয়।
এক্সএমএল কনফিগারেশন
<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
টোকেনটির value ট্রেডফেডের TokenProperty এর সাথে মেলে এবং এটি TokenProviderHelper এর একটি হ্যান্ডলারের সাথে যুক্ত থাকে।
এর ফলে এমন ডিভাইসগুলোতে টেস্ট মডিউল চালানো যায়, যেগুলো পরীক্ষাগুলো সঠিকভাবে সম্পাদন করতে পারে।
যদি কোনো ডিভাইস পরীক্ষাটি চালাতে না পারে তাহলে কী হবে?
যদি উপলব্ধ কোনো ডিভাইসে টেস্ট মডিউলের সাথে মেলে এমন রিসোর্স না থাকে, তাহলে টেস্ট মডিউলটি ব্যর্থ হয় এবং বাদ দেওয়া হয়, কারণ এটি সঠিকভাবে কার্যকর হতে পারে না।
উদাহরণস্বরূপ, যদি কোনো টেস্ট মডিউল চালু হওয়ার জন্য সিম কার্ডের অনুরোধ করে কিন্তু কোনো ডিভাইসেই সিম কার্ড না থাকে, তাহলে টেস্ট মডিউলটি ব্যর্থ হয়।
বাস্তবায়ন
এই ফিচার ফ্ল্যাগটি মূল ট্রেডফেড কমান্ড লাইনে পাঠান:
--enable-token-sharding