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

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

ট্রেড ফেডারেশনে পাওয়া উত্তরগুলির মধ্যে একটি হল ভাগ করা। এর জন্য রানারের প্রয়োজনীয় সমস্ত পরীক্ষাগুলিকে কয়েকটি খণ্ডে ভাগ করতে হবে যা সমান্তরাল করা যেতে পারে।

এই পৃষ্ঠাটি বর্ণনা করে কিভাবে ট্রেডফেডের জন্য আপনার রানারকে শার্ডেবল করবেন।

বাস্তবায়নের জন্য ইন্টারফেস

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

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

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

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

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

বিস্তারিত উদাহরণ বাস্তবায়ন

এখানে IShardableTest বাস্তবায়নের একটি উদাহরণ কোড স্নিপেট দেওয়া হল যা আপনি উল্লেখ করতে পারেন। সম্পূর্ণ কোডটি (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/android16-qpr1-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 শার্ডেড ইনভোকেশনের জন্য কোনও পরীক্ষার ফলাফল একত্রিত করে না, তাই আপনাকে নিশ্চিত করতে হবে যে আপনার রিপোর্টিং পরিষেবা এটি সমর্থন করে।