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