इस पेज पर, Tradefed में टेस्ट लिखते समय, टेस्ट के नतीजों के साथ मेट्रिक को रिपोर्ट करने का तरीका बताया गया है.
Tradefed पाइपलाइन के ज़रिए लॉग करने का फ़ायदा यह है कि आपको फ़ंक्शनल नतीजों के साथ-साथ मेट्रिक भी मिलती हैं. टेस्ट में मेट्रिक को आसानी से लॉग किया जा सकता है. इससे टेस्ट लिखने वाले लोगों के लिए, ज़्यादा इंस्ट्रूमेंटेशन जोड़ना आसान हो जाता है.
DeviceTestCase - JUnit3 स्टाइल
अगर आपका टेस्ट, JUnit3 स्टाइल के टेस्ट में DeviceTestCase को बढ़ाता है, तो किसी भी टेस्ट केस में जाकर, मेट्रिक की रिपोर्ट करने के लिए addTestMetric(String key, String value)
कोड को कॉल किया जा सकता है. इस फ़ंक्शन को कई बार इस्तेमाल किया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि कुंजी यूनीक हो.
उदाहरण:
public static class TestMetricTestCase extends DeviceTestCase {
public void testPass() {
addTestMetric("key1", "metric1");
}
public void testPass2() {
addTestMetric("key2", "metric2");
}
}
अगर आपको किसी फ़ाइल को result_reporters
में उपलब्ध कराने के लिए लॉग करना है, तो किसी भी टेस्ट केस में जाकर, addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream)
को कॉल करें. इससे, लॉग की जाने वाली फ़ाइल की शिकायत की जा सकती है.
उदाहरण:
public static class TestLogTestCase extends DeviceTestCase {
public void testPass() {
try (InputStreamSource source = getDevice().getScreenshot()) {
addTestLog("screenshot", LogDataType.PNG, source);
}
}
}
TestCase - नियमित JUnit3 टेस्ट
अगर आपको Tradefed में, सामान्य JUnit3 TestCase क्लास से मेट्रिक रिपोर्ट करनी है, तो उसे MetricTestCase
में बदलना होगा. यह एक और तरीके के साथ, वही क्लास है: addTestMetric(String key, String value)
DeviceJUnit4ClassRunner - JUnit4 स्टाइल
अगर आपका JUnit4 स्टाइल टेस्ट, DeviceJUnit4ClassRunner के साथ चल रहा है, तो Tradefed की मदद से रिपोर्ट की जाने वाली मेट्रिक को टेस्ट केस (@Test के अंदर) में भी लॉग किया जा सकता है. अपनी मेट्रिक की रिपोर्ट करने के लिए, आपको TestMetrics
नियमों का इस्तेमाल करना होगा.
उदाहरण:
@RunWith(DeviceJUnit4ClassRunner.class)
public static class Junit4TestClass {
@Rule
public TestMetrics metrics = new TestMetrics();
@Test
public void testPass5() {
// test log through the rule.
metrics.addTestMetric("key", "value");
}
@Test
public void testPass6() {
metrics.addTestMetric("key2", "value2");
}
}
फ़ाइलों की शिकायत करने के लिए, TestLogData
नियम का इस्तेमाल करें.
उदाहरण:
@RunWith(DeviceJUnit4ClassRunner.class)
public static class Junit4TestClass {
@Rule
public TestLogData logs = new TestLogData();
@Test
public void testPass5() {
// test log through the rule.
try (InputStreamSource source = getDevice().getScreenshot()) {
logs.addTestLog("screenshot", LogDataType.PNG, source);
}
}
}
IRemoteTest - सिर्फ़ Tradefed टेस्ट
अगर आपको अपनी Tradefed टेस्ट क्लास या रननर लिखनी है, तो आपको IRemoteTest लागू करना होगा और run()
तरीके से ITestInvocationListener
मिलेगा. इस लिसनर का इस्तेमाल, मेट्रिक को लॉग करने के लिए इस तरह किया जा सकता है:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Tradefed मेट्रिक कलेक्टर
Tradefed, टेस्ट के साथ-साथ मेट्रिक इकट्ठा करने के लिए, एक खास metrics_collector
ऑब्जेक्ट उपलब्ध कराता है.
होस्ट के लिए
BaseDeviceMetricCollector को लागू करके, होस्ट-साइड से कोई भी मेट्रिक इकट्ठा की जा सकती है और टेस्ट को शुरू करने के हिस्से के तौर पर उनकी रिपोर्ट की जा सकती है. अलग-अलग कामों के लिए, पहले से ही कई सामान्य कलेक्टर उपलब्ध हैं. हालांकि, हम नए योगदानों का हमेशा स्वागत करते हैं.
Tradefed को कॉल करने के लिए इस्तेमाल किए जाने वाले कलेक्टर की जानकारी देने के लिए, आपको अपने Tradefed एक्सएमएल कॉन्फ़िगरेशन में ऑब्जेक्ट जोड़ना होगा:
उदाहरण:
<metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
<option name="categories" value="freq"/>
</metrics_collector>
फ़िलहाल मौजूद कुछ कलेक्टर: * TemperatureCollector, जो टेस्ट रन के दौरान समय-समय पर तापमान इकट्ठा करता है. * AtraceCollector, जो हर टेस्ट केस के लिए 'atrace' का इस्तेमाल करके डेटा इकट्ठा करता है.
डिवाइस पर
डिवाइस-साइड टेस्ट (इंस्ट्रूमेंटेशन, UIAutomator टेस्ट वगैरह) चलाते समय, होस्ट-साइड पर एक साथ डेटा इकट्ठा करने वाला कलेक्टर होना शायद सही न हो. उदाहरण के लिए, असिंक्रोनस तरीके से लिया गया स्क्रीनशॉट, ज़रूरी स्क्रीन को कैप्चर नहीं कर पाएगा और काम का नहीं होगा.
इन इस्तेमाल के उदाहरणों को पूरा करने के लिए, हमारे कलेक्टर का डिवाइस-साइड वर्शन मौजूद है और इसका इस्तेमाल किसी भी 'AndroidJUnitRunner' इंस्ट्रूमेंटेशन में किया जा सकता है. BaseMetricListener को लागू करके, उन मेट्रिक की अपने-आप रिपोर्ट की जा सकती है जो Tradefed रिपोर्टिंग पाइपलाइन के साथ पूरी तरह से काम करने वाले तरीके से इकट्ठा की जाती हैं.
अगर Tradefed से 'AndroidJUnitTest' रनर का इस्तेमाल किया जा रहा है, तो अपने टेस्ट के साथ कलेक्टर को चलाने के लिए, कमांड-लाइन का यह विकल्प दें:
--device-listeners android.device.collectors.ScreenshotListener
चेतावनी: कलेक्टर क्लास को रनटाइम पर रिज़ॉल्व करने के लिए, आपके इंस्ट्रूमेंटेशन APK को उन्हें स्टैटिक तौर पर शामिल करना होगा. इसके लिए, अपनी मेकफ़ाइल में ये चीज़ें जोड़ें:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
डिवाइस-साइड कलेक्टर के लिए भी योगदान दिए जा सकते हैं.
सुइट के लिए खास बातें
CTS जैसे सुइट के लिए, जिनमें कुछ मॉड्यूल कॉन्फ़िगरेशन चलाने वाला टॉप-लेवल कॉन्फ़िगरेशन होता है, हर मॉड्यूल कॉन्फ़िगरेशन (AndroidTest.xml
) में metrics_collector
बताने की ज़रूरत नहीं होती. असल में, ऐसा करने की अनुमति नहीं है.
यह पक्का करने के लिए कि मेट्रिक कलेक्शन हर मॉड्यूल पर बराबर लागू हो, ऊपर बताए गए तरीके से सिर्फ़ टॉप-लेवल कॉन्फ़िगरेशन (उदाहरण के लिए, cts.xml
) metrics_collector
तय कर सकता है. ये कलेक्टर, सुइट के हर मॉड्यूल पर लागू किए जाएंगे और चलाए जाएंगे.
किसी मॉड्यूल से डिवाइस की लॉग फ़ाइलें इकट्ठा करना
डिवाइस साइड टेस्ट के लिए, एक सेटअप उपलब्ध है, ताकि यह सूचना दी जा सके कि कुछ फ़ाइलें इकट्ठा की जानी चाहिए.
AndroidTest.xml
, किसी कलेक्टर को यह बता सकता है कि वह डिवाइस पर फ़ाइल ढूंढे और उन्हें खींचे.
<metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
<!-- repeatable: Pattern of key of a FILE we listen on that should be pulled -->
<option name = "pull-pattern-keys" value = "ScreenshotListener_.*" />
<!-- repeatable: The key of the DIRECTORY to pull -->
<option name = "directory-keys" value = "<example-key: /sdcard/atrace_logs>" />
</metrics_collector>
इन पैटर्न और कुंजी को तय करने पर, कलेक्टर को कुंजी दिखने पर, उससे जुड़ी फ़ाइल को खींचने और लॉग करने की कोशिश करेगा.
इन कुंजियों को जनरेट करने के लिए, डिवाइस-साइड टेस्ट (इंस्ट्रूमेंटेशन) को उस फ़ाइल के बारे में बताना चाहिए जिसे लॉग किया जाना चाहिए. यह उसी तरह से किया जाता है जैसे होस्ट-साइड (ऊपर बताया गया है) पर किया जाता है.
- मेक फ़ाइलों में, अपने टेस्ट APK में
collector-device-lib
जोड़ें:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- फ़ाइलों को लॉग करने के लिए, हमारे दिए गए @rule का इस्तेमाल करें:
@RunWith(AndroidJUnit4.class)
public static class Junit4TestClass {
@Rule
public TestLogData logs = new TestLogData();
@Test
public void testPass5() {
// test log through the rule.
File logFile = new File("whatever");
logs.addTestLog("KEY", logFile);
}
}
ऊपर दिए गए उदाहरण में KEY
नाम वह नाम है जिससे फ़ाइल की शिकायत की जाएगी. यह वह नाम है जिसे अपने-आप खींचने के लिए, आपको FilePullerDeviceMetricCollector
में मैच करना चाहिए. यह नाम यूनीक होना चाहिए.
ध्यान दें: फ़ाइल को खींचने के बाद, FilePullerDeviceMetricCollector
उसे डिवाइस से अपने-आप हटा देता है.
मुझे मेट्रिक कहां मिलेंगी?
यह आपके एक्सएमएल कॉन्फ़िगरेशन में बताए गए result_reporter
पर निर्भर करता है.