टेस्ट रनर लिखते समय, यह ध्यान रखना ज़रूरी है कि उसे बड़े पैमाने पर इस्तेमाल किया जा सके. खुद से पूछें कि "अगर मेरे टेस्ट रनर को 2,00,000 टेस्ट केस चलाने हैं", तो इसमें कितना समय लगेगा?
Trade Federation में, डेटा को अलग-अलग हिस्सों में बांटने की सुविधा उपलब्ध है. इसके लिए ज़रूरी है रनर के लिए ज़रूरी सभी टेस्ट को अलग-अलग हिस्सों में बांटकर साथ-साथ.
इस पेज पर, Tradefed के लिए अपने रनर को शर्ड करने का तरीका बताया गया है.
लागू करने के लिए इंटरफ़ेस
IShardableTest, सबसे अहम इंटरफ़ेस है. इसे लागू करने पर, टीएफ़ इसे शर्ड किया जा सकता है. इसमें दो तरीके होते हैं: split(int numShard)
और split()
.
अगर आपकी शार्डिंग, अनुरोध किए गए शार्ड की संख्या पर निर्भर करेगी, तो आपको split(int numShard)
लागू करना चाहिए. अगर ऐसा नहीं है, तो split()
को लागू करें.
जब शार्डिंग पैरामीटर --shard-count
के साथ TF की जांच करने वाला निर्देश चलाया जाता है और
--shard-index
, TF सभी IRemoteTest
को ढूंढता है
IShardableTest
को लागू किया जा रहा है. अगर कोई IRemoteTest
ऑब्जेक्ट मिलता है, तो यह split
को कॉल करेगा, ताकि वह एक नया IRemoteTest
ऑब्जेक्ट पा सके. इसके बाद, वह किसी खास स्HARD के लिए टेस्ट केस का सबसेट चलाएगा.
मुझे स्प्लिट लागू करने के बारे में क्या पता होना चाहिए?
- कोई व्यक्ति सिर्फ़ कुछ स्थितियों में ही दौड़ सकता है; ऐसी स्थिति में,
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
की एक-दूसरे पर निर्भरता या शेयर नहीं होनी चाहिए
संसाधन.
शार्ड विभाजन सारणिक होना चाहिए! यह भी ज़रूरी है कि एक ही शर्तों के हिसाब से, आपका 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, शार्ड किए गए वाक्यों को शामिल करने के लिए कोई टेस्ट नतीजा एग्रीगेशन नहीं करता है, इसलिए आप यह पक्का करना ज़रूरी है कि रिपोर्टिंग सेवा इसके साथ काम करती हो.