শার্ড করা IRemoteTest টেস্ট রানার লেখা

টেস্ট রানার লেখার সময়, স্কেলেবিলিটির কথা মাথায় রাখা গুরুত্বপূর্ণ। নিজেকে জিজ্ঞাসা করুন, "আমার টেস্ট রানারকে যদি ২০০,০০০ টেস্ট কেস চালাতে হয়" তাহলে কতক্ষণ সময় লাগবে?

ট্রেড ফেডারেশনে উপলভ্য উত্তরগুলির মধ্যে একটি হল শার্ডিং। এর জন্য রানারকে প্রয়োজনীয় সব টেস্টকে একাধিক চঙ্কে ভাগ করতে হয়, যেগুলিকে প্যারালাইজ করা যায়।

এই পৃষ্ঠায় বর্ণনা করা হয়েছে যে কীভাবে Tradefed-এর জন্য আপনার রানারকে শেয়ারযোগ্য করে তুলতে হয়।

প্রয়োগ করার ইন্টারফেস

TF-এর দ্বারা শেয়ারযোগ্য হিসেবে বিবেচিত হওয়ার জন্য প্রয়োগ করতে হবে এমন সবচেয়ে গুরুত্বপূর্ণ ইন্টারফেস হল IShardableTest, যার মধ্যে দুটি পদ্ধতি আছে: split(int numShard) ও split()।

আপনার শার্ডিং যদি অনুরোধ করা শার্ডের সংখ্যার উপর নির্ভর করে, তাহলে আপনাকে split(int numShard) প্রয়োগ করতে হবে। অন্যথায়, split() প্রয়োগ করুন।

শর্ডিং প্যারামিটার --shard-count এবং --shard-index সহ TF টেস্ট কমান্ড এক্সিকিউট করা হলে, IShardableTest ইমপ্লিমেন্ট করা খুঁজে দেখতে TF সব IRemoteTest-এর মধ্যে দিয়ে ইটারেট করে। পাওয়া গেলে, এটি split-কে কল করবে যাতে নির্দিষ্ট শার্ডের জন্য টেস্ট কেসের সাবসেট রান করতে নতুন IRemoteTest অবজেক্ট পাওয়া যায়।

স্প্লিট প্রয়োগ করা সম্পর্কে আমার কী জানা উচিত?

  • কিছু শর্ত পূরণ হলেই রানারকে শার্ড করা যেতে পারে; সেই ক্ষেত্রে, শার্ড না করলে null রিটার্ন করুন।
  • যতটা সম্ভব স্প্লিট করার চেষ্টা করুন: আপনার রানারকে এক্সিকিউশনের এমন ইউনিটে স্প্লিট করুন যা সেটির জন্য উপযুক্ত। এটি আপনার রানারের উপর নির্ভর করে। যেমন: HostTest ক্লাস লেভেলে শার্ড করা হয়, প্রতিটি টেস্ট ক্লাস আলাদা আলাদা শার্ডে রাখা হয়।
  • এটি যুক্তিসঙ্গত হলে, শার্ডিং কিছুটা নিয়ন্ত্রণ করার জন্য কিছু বিকল্প যোগ করুন। যেমন: AndroidJUnitTest-এ ajur-max-shard আছে যা অনুরোধ করা সংখ্যার কথা বিবেচনা না করেই, সর্বাধিক কতগুলি শার্ডে এটি বিভক্ত হতে পারে তা নির্দিষ্ট করে।

প্রয়োগের বিস্তারিত উদাহরণ

IShardableTest প্রয়োগ করা কোড স্নিপেটের একটি উদাহরণ এখানে দেওয়া হল, আপনি রেফারেন্স হিসেবে এটি ব্যবহার করতে পারেন। সম্পূর্ণ কোডটি এখানে উপলভ্য (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/android17-release/test_framework/com/android/tradefed/testtype/InstalledInstrumentationsTest.java)

/**
 * Runs all instrumentation found on current device.
 */
@OptionClass(alias = "installed-instrumentation")
public class InstalledInstrumentationsTest
        implements IDeviceTest, IResumableTest, IShardableTest {
    ...

    /** {@inheritDoc} */
    @Override
    public Collection<IRemoteTest> split(int shardCountHint) {
        if (shardCountHint > 1) {
            Collection<IRemoteTest> shards = new ArrayList<>(shardCountHint);
            for (int index = 0; index < shardCountHint; index++) {
                shards.add(getTestShard(shardCountHint, index));
            }
            return shards;
        }
        // Nothing to shard
        return null;
    }

    private IRemoteTest getTestShard(int shardCount, int shardIndex) {
        InstalledInstrumentationsTest shard = new InstalledInstrumentationsTest();
        try {
            OptionCopier.copyOptions(this, shard);
        } catch (ConfigurationException e) {
            CLog.e("failed to copy instrumentation options: %s", e.getMessage());
        }
        shard.mShardIndex = shardIndex;
        shard.mTotalShards = shardCount;
        return shard;
    }
    ...
}

এই উদাহরণটি কেবল নিজের একটি নতুন ইনস্ট্যান্স তৈরি করে এবং এতে শার্ড প্যারামিটার সেট করে। তবে, স্প্লিট করার লজিক এক টেস্ট থেকে অন্য টেস্টে সম্পূর্ণ আলাদা হতে পারে; এবং যতক্ষণ পর্যন্ত এটি ডিটারমিনিস্টিক হয় এবং সামগ্রিকভাবে সম্পূর্ণ সাবসেট তৈরি করে, ততক্ষণ পর্যন্ত এটি ঠিক আছে।

স্বাধীনতা

শার্ডগুলিকে স্বতন্ত্র হতে হবে! আপনার রানারে split প্রয়োগ করার ফলে তৈরি হওয়া দুটি শার্ড একে অপরের উপর নির্ভরশীল হওয়া বা রিসোর্স শেয়ার করা উচিত নয়।

শার্ড স্প্লিটিংকে ডিটারমিনিস্টিক হতে হবে! এটিও বাধ্যতামূলক, একই কন্ডিশন দেওয়া থাকলে, আপনার split মেথডকে সবসময় একই ক্রমে শার্ডের একই তালিকা রিটার্ন করতে হবে।

মনে রাখবেন: যেহেতু প্রতিটি শার্ড আলাদা আলাদা TF ইনস্ট্যান্সে রান করতে পারে, তাই এটি নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ যে split লজিক এমন সাবসেট তৈরি করে যা পারস্পরিকভাবে এক্সক্লুসিভ এবং সামগ্রিকভাবে ডিটারমিনিস্টিক পদ্ধতিতে সম্পূর্ণ।

লোকালভাবে কোনও টেস্ট শার্ড করা

লোকাল TF-এ টেস্ট শার্ড করতে, আপনি কমান্ড লাইনে --shard-count বিকল্প যোগ করতে পারেন।

tf >run host --class com.android.tradefed.UnitTests --shard-count 3

তারপর TF প্রতিটি শার্ডের জন্য অটোমেটিক কমান্ড তৈরি করবে এবং সেগুলি রান করবে।

tf >l i
Command Id  Exec Time  Device          State
3           0m:03      [null-device-2]  running stub on build 0 (shard 1 of 3)
3           0m:03      [null-device-1]  running stub on build 0 (shard 0 of 3)
3           0m:03      [null-device-3]  running stub on build 0 (shard 2 of 3)

পরীক্ষার ফলাফল একত্রিত করা

যেহেতু TF, শেয়ার করা ইনভোকেশনের জন্য কোনও টেস্ট ফলাফল এগ্রিগেশন করে না, তাই আপনার রিপোর্টিং পরিষেবা এটি সমর্থন করে কিনা তা আপনাকে নিশ্চিত করতে হবে।