टेस्ट शार्डिंग

जब टेस्ट कॉर्पस बड़ा होता है या टेस्ट को पूरा होने में ज़्यादा समय लगता है, तो हम टेस्ट को कई डिवाइसों पर बांटने का विकल्प देते हैं: शार्डिंग.

शार्डिंग के लिए, टेस्ट रनर को ज़रूरी शर्तें पूरी करनी होती हैं.

ज़्यादातर मुख्य टेस्ट रनर में पहले से ही शार्डिंग की सुविधा काम करती है. इसलिए, कोई अतिरिक्त काम करने की ज़रूरत नहीं है. ये पहले से ही शार्डिंग के साथ काम करते हैं: इंस्ट्रुमेंटेशन टेस्ट, होस्ट-साइड ड्रिवन टेस्ट, GTest.

Tradefed में दो तरह की शार्डिंग की सुविधा उपलब्ध है: लोकल और डिस्ट्रिब्यूटेड. इनमें कुछ समानताएं हैं. इसलिए, इस पेज पर सामान्य प्रॉपर्टी के बारे में बताया गया है. इसके बाद, हर प्रॉपर्टी के बारे में खास जानकारी दी गई है.

सामान्य प्रॉपर्टी

शार्डिंग के दोनों फ़ॉर्म, टेस्ट रनर से एक जैसी प्रॉपर्टी मानते हैं: शार्ड इंडिपेंडेंट और डिटरमिनिस्टिक होने चाहिए. दोनों तरह की शार्डिंग का पहला चरण यह है कि टेस्ट की पूरी सूची बनाई जाए और फिर उन्हें अलग-अलग ग्रुप/शार्ड में बांटा जाए.

शार्डिंग के अलग-अलग फ़ॉर्म में मुख्य अंतर यह है कि वे टेस्ट को अलग-अलग तरीके से एक्ज़ीक्यूट करते हैं. इस बारे में ज़्यादा जानकारी यहां दी गई है.

लोकल शार्डिंग

लोकल शार्डिंग का मतलब है कि शार्ड किए गए इनवॉकेशन को लागू करने में शामिल सभी डिवाइस, एक ही फ़िज़िकल होस्ट से कनेक्ट किए गए हैं.

प्लान लागू करना

लोकल शार्डिंग की सुविधा, एक ही होस्ट से कनेक्ट किए गए सभी डिवाइसों का फ़ायदा उठाती है. इसके लिए, यह टेस्ट का एक ऐसा पूल बनाती है जिसे एक्ज़ीक्यूट करना होता है. साथ ही, हर डिवाइस के पास टेस्ट को पोल करने का विकल्प होता है, जब वह खाली हो (यानी कि पिछला टेस्ट पूरा हो गया हो). इससे डिवाइस का इस्तेमाल ऑप्टिमाइज़ होता है. इसे डाइनैमिक शार्डिंग भी कहा जाता है.

विकल्प

--shard-count XX

डिस्ट्रिब्यूटेड शार्डिंग

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

प्लान लागू करना

टेस्ट की सूची बनाते समय, डिस्ट्रिब्यूटेड शार्डिंग होती है. साथ ही, हर शार्ड का कॉन्टेंट सिर्फ़ उस शार्ड को एक्ज़ीक्यूट करता है जिसके लिए फ़िलहाल अनुरोध किया गया है. इसलिए, डिस्ट्रिब्यूट किए गए सभी शार्ड, शुरुआत में एक ही सूची बनाते हैं. इसके बाद, वे सूची के ऐसे सबसेट को लागू करते हैं जो एक-दूसरे से अलग होते हैं. इससे सभी टेस्ट लागू हो जाते हैं.

इस फ़ॉर्म की मुख्य प्रॉपर्टी यह है कि शार्ड एक-दूसरे के बारे में पूरी तरह से अनजान होते हैं और स्वतंत्र रूप से काम नहीं कर सकते.

इस तरीके की मुख्य समस्या यह है कि हर शार्ड की लंबाई बराबर नहीं होती. इसकी वजह यह है कि हम हर शार्ड में हर टेस्ट के रनटाइम का अनुमान पहले से नहीं लगा सकते. टेस्ट केस को इस तरह से डिस्ट्रिब्यूट किया जाता है कि हर शार्ड में टेस्ट केस की संख्या लगभग एक जैसी हो.

विकल्प

--shard-count XX --shard-index XX

टोकन शार्डिंग

टोकन शार्डिंग का इस्तेमाल, सिर्फ़ लोकल शार्डिंग के साथ किया जा सकता है. यह फ़्लैग, नॉन-लोकल शार्डिंग के इस्तेमाल के उदाहरणों में काम नहीं करता. कभी-कभी, शार्डिंग में शामिल किसी एक डिवाइस में ऐसे खास संसाधन होते हैं जो दूसरे डिवाइसों में नहीं होते. जैसे, सिम कार्ड. कुछ जांचें सिर्फ़ तब काम कर सकती हैं, जब वह खास संसाधन उपलब्ध हो. ऐसा न होने पर, वे काम नहीं करेंगी.

इस तरह के मामलों के लिए, हम टोकन शार्डिंग का इस्तेमाल करते हैं. टेस्ट मॉड्यूल यह एलान कर सकते हैं कि उन्हें अपने AndroidTest.xml में किस खास संसाधन की ज़रूरत है. साथ ही, Tradefed, टेस्ट को उस डिवाइस पर भेजता है जिसमें वह संसाधन मौजूद है.

एक्सएमएल कॉन्फ़िगरेशन

<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />

टोकन का value, Tradefed के TokenProperty से मेल खाता है. साथ ही, यह TokenProviderHelper में मौजूद किसी हैंडलर से जुड़ा होता है.

इससे टेस्ट मॉड्यूल को उन डिवाइसों पर चलाया जा सकता है जो टेस्ट को सही तरीके से एक्ज़ीक्यूट कर सकते हैं.

अगर कोई भी डिवाइस टेस्ट नहीं चला सकता, तो क्या होगा?

अगर कोई भी ऐसा डिवाइस उपलब्ध नहीं है जिसमें टेस्ट मॉड्यूल से मेल खाने वाला संसाधन मौजूद हो, तो टेस्ट मॉड्यूल को फ़ेल मान लिया जाता है और उसे छोड़ दिया जाता है. ऐसा इसलिए होता है, क्योंकि वह ठीक से काम नहीं कर पाता.

उदाहरण के लिए, अगर किसी टेस्ट मॉड्यूल को चलाने के लिए सिम कार्ड की ज़रूरत है, लेकिन किसी भी डिवाइस में सिम कार्ड नहीं है, तो टेस्ट मॉड्यूल काम नहीं करेगा.

लागू करना

इस सुविधा के फ़्लैग को Tradefed की मुख्य कमांड लाइन में पास करें:

--enable-token-sharding