टेस्ट रनर लिखते समय, स्केलेबिलिटी के बारे में सोचना महत्वपूर्ण है। अपने आप से पूछें, "अगर मेरे टेस्ट रनर को 200K टेस्ट केस चलाने पड़े" तो इसमें कितना समय लगेगा?
शेयरिंग ट्रेड फेडरेशन में उपलब्ध उत्तरों में से एक है। इसके लिए सभी परीक्षणों को विभाजित करने की आवश्यकता होती है जो धावक को कई हिस्सों में चाहिए जिन्हें समानांतर किया जा सकता है।
यह पेज बताता है कि ट्रेडफेड के लिए अपने रनर को शार्पेबल कैसे बनाया जाए।
लागू करने के लिए इंटरफ़ेस
TF द्वारा शार्पेबल माने जाने के लिए लागू करने के लिए सबसे महत्वपूर्ण इंटरफ़ेस IShardableTest है, जिसमें दो विधियाँ शामिल हैं: split(int numShard)
और split()
।
यदि आपकी शार्किंग अनुरोधित शार्क की संख्या पर निर्भर होने वाली है, तो आपको split(int numShard)
लागू करना चाहिए। अन्यथा, split()
लागू करें।
जब TF टेस्ट कमांड को शार्डिंग पैरामीटर --shard-count
और --shard-index
के साथ निष्पादित किया जाता है, तो TF IShardableTest
को लागू करने वाले लोगों की तलाश के लिए सभी IRemoteTest
के माध्यम से पुनरावृति करता है। यदि पाया जाता है, तो यह एक विशिष्ट शार्क के लिए परीक्षण मामलों के सबसेट को चलाने के लिए एक नया IRemoteTest
ऑब्जेक्ट प्राप्त करने के लिए split
को कॉल करेगा।
विभाजन कार्यान्वयन के बारे में मुझे क्या पता होना चाहिए?
- आप धावक केवल कुछ शर्तों पर शार्प कर सकते हैं; उस स्थिति में जब आपने शार्प नहीं किया तो
null
लौटें। - जितना हो सके विभाजित करने का प्रयास करें: अपने धावक को निष्पादन की इकाई में विभाजित करें जो इसके लिए समझ में आता है। यह वास्तव में आपके धावक पर निर्भर करता है। उदाहरण के लिए: होस्टटेस्ट को क्लास स्तर पर शार्प किया जाता है, प्रत्येक टेस्ट क्लास को एक अलग शार्क में रखा जाता है।
- यदि यह समझ में आता है, तो थोड़ा सा शार्डिंग को नियंत्रित करने के लिए कुछ विकल्प जोड़ें। उदाहरण के लिए: AndroidJUnitTest में अनुरोध की गई संख्या की परवाह किए बिना, विभाजित होने वाली अधिकतम संख्या को निर्दिष्ट करने के लिए एक
ajur-max-shard
है।
विस्तृत उदाहरण कार्यान्वयन
यहां एक उदाहरण कोड स्निपेट है जो IShardableTest
को लागू करता है जिसे आप संदर्भित कर सकते हैं। पूरा कोड (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/master/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
विधि को हमेशा उसी क्रम में शार्क की समान सूची वापस करनी चाहिए।
नोट: चूंकि प्रत्येक शार्ड अलग-अलग टीएफ इंस्टेंस पर चल सकता है, इसलिए यह सुनिश्चित करना महत्वपूर्ण है कि 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 शार्प इनवोकेशन के लिए कोई परीक्षा परिणाम एकत्रीकरण नहीं करता है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी रिपोर्टिंग सेवा इसका समर्थन करती है।