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

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

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

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

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

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

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

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

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

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

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

এখানে IShardableTest প্রয়োগ করার একটি উদাহরণ কোড স্নিপেট রয়েছে যা আপনি উল্লেখ করতে পারেন। সম্পূর্ণ কোডটি এখানে উপলব্ধ (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/main/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 প্রয়োগের দ্বারা তৈরি দুটি শার্ডের একে অপরের উপর নির্ভরশীলতা বা সম্পদ শেয়ার করা উচিত নয়।

Shards বিভাজন নির্ধারক হতে হবে! এটিও বাধ্যতামূলক, একই শর্তের প্রেক্ষিতে, আপনার split পদ্ধতিটি সর্বদা একই ক্রমে শার্ডগুলির সঠিক একই তালিকা ফেরত দেবে।

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

স্থানীয়ভাবে একটি পরীক্ষা Shard

একটি স্থানীয় 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 শার্ডড ইনভোকেশনের জন্য কোনো পরীক্ষার ফলাফল একত্রিত করে না, তাই আপনাকে নিশ্চিত করতে হবে যে আপনার রিপোর্টিং পরিষেবা এটি সমর্থন করে।