शार्ड IRemoteTest परीक्षण रनर लिखें

टेस्ट रनर लिखते समय, स्केलेबिलिटी के बारे में ज़रूर सोचना चाहिए. पूछें "अगर मेरे टेस्ट रनर को दो लाख टेस्ट केस रन करने पड़े" इसमें कितना समय लगेगा?

शार्डिंग, ट्रेड फ़ेडरेशन में उपलब्ध जवाबों में से एक है. इसके लिए ज़रूरी है रनर के लिए ज़रूरी सभी टेस्ट को अलग-अलग हिस्सों में बांटकर साथ-साथ.

इस पेज में बताया गया है कि आप अपने रनर को ट्रेडफ़ेड के लिए शार्डेबल कैसे बना सकते हैं.

लागू करने के लिए इंटरफ़ेस

लागू करने वाला सबसे ज़रूरी इंटरफ़ेस, जिसे छोटा करके TF है IShardableTest, जिसमें दो तरीके होते हैं: split(int numShard) और split().

अगर शार्डिंग का अनुरोध किए गए शार्ड की संख्या पर निर्भर करता है, तो split(int numShard) को लागू करना चाहिए. अगर ऐसा नहीं है, तो split() को लागू करें.

जब शार्डिंग पैरामीटर --shard-count के साथ TF की जांच करने वाला निर्देश चलाया जाता है और --shard-index, TF सभी IRemoteTest को ढूंढता है IShardableTest को लागू किया जा रहा है. अगर मिल जाता है, तो यह split को इस नंबर पर कॉल करेगा किसी खास प्रॉपर्टी के टेस्ट केस का सबसेट चलाने के लिए, एक नया IRemoteTest ऑब्जेक्ट पाएं शार्ड.

मुझे स्प्लिट लागू करने के बारे में क्या पता होना चाहिए?

  • कोई व्यक्ति सिर्फ़ कुछ स्थितियों में ही दौड़ सकता है; ऐसी स्थिति में, null वापस करें जब आपने शार्ड नहीं किया था.
  • जितना हो सके उतना अलग-अलग करने की कोशिश करें: अपने रनर को लागू किया जा सकता है. यह आपके रनर पर निर्भर करता है. इसके लिए उदाहरण: होस्टटेस्ट को क्लास लेवल पर शार्ड किया जाता है, तो हर टेस्ट क्लास को एक अलग शार्ड में रखा जाता है.
  • अगर ठीक लगे, तो शार्डिंग को थोड़ा कंट्रोल करने के लिए कुछ विकल्प जोड़ें. जैसे: 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 की एक-दूसरे पर निर्भरता या शेयर नहीं होनी चाहिए संसाधन.

शार्ड विभाजन सारणिक होना चाहिए! यह भी ज़रूरी है, क्योंकि समान शर्तें, आपकी 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, शार्ड किए गए वाक्यों को शामिल करने के लिए कोई टेस्ट नतीजा एग्रीगेशन नहीं करता है, इसलिए आप यह पक्का करना ज़रूरी है कि रिपोर्टिंग सेवा इसके साथ काम करती हो.