शार्डिंग की जांच करें

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

टेस्ट रनर के लिए, ज़रूरी शर्तें पूरी होनी चाहिए, ताकि वह टास्क को अलग-अलग हिस्सों में बांट सके.

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

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

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

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

शार्डिंग फ़ॉर्म में मुख्य अंतर, उनके परीक्षण करने के तरीके में है. ज़्यादा जानकारी के लिए, यहां दिए गए सेक्शन देखें.

स्थानीय शार्डिंग

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

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

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

विकल्प

--shard-count XX

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

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

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

डिस्ट्रिब्यूटेड शार्डिंग, परीक्षणों की सूची बनाने पर होती है और हर शार्ड की सामग्री केवल वर्तमान में अनुरोध किए गए शार्ड को ही निष्पादित करती है. इसलिए, डिस्ट्रिब्यूट किए गए सभी शार्ड, सबसे पहले एक ही सूची बनाते हैं. इसके बाद, एक-दूसरे से अलग-अलग सबसेट को एक साथ चलाते हैं. इससे सभी टेस्ट एक साथ चल पाते हैं.

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

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

विकल्प

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

टोकन का बंटवारा

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

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

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

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

टोकन का value, Tradefed के TokenProperty से मैच होता है और TokenProviderHelper में मौजूद हैंडलर से जुड़ा होता है.

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

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

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

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

लागू करना

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

--enable-token-sharding