ट्रेडेड टेस्ट से मिली मेट्रिक या डेटा की रिपोर्ट करें

इस पेज पर बताया गया है कि ट्रेडेड में टेस्ट लिखते समय, टेस्ट के नतीजों के साथ मेट्रिक की रिपोर्ट कैसे करें.

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 टेस्ट

अगर आपको किसी सामान्य JUnit3 TestCase क्लास से Trefed में मेट्रिक की रिपोर्ट करनी है, तो इसे MetricTestCase में बदलना होगा. इसके बजाय, इसे MetricTestCase में बदलना होगा. यह वही क्लास है जो इस अतिरिक्त तरीके से मिलती है: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - JUnit4 स्टाइल

अगर आपका JUnit4 स्टाइल टेस्ट DeviceJUnit4ClassRunner के साथ चल रहा है, तो टेस्ट केस (@Test में) में भी मेट्रिक को लॉग किया जा सकता है, ताकि Trefed की ओर से रिपोर्ट की जा सके. अपनी मेट्रिक की रिपोर्ट करने के लिए, आपको 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);
            }
        }
    }

Iरिमोटटेस्ट - प्योर ट्रेडेड टेस्ट

अगर आपको अपनी Tradefed टेस्ट क्लास या रननर लिखनी है, तो आपको IRemoteTest लागू करना होगा और run() तरीके से ITestInvocationListener मिलेगा. इस लिसनर का इस्तेमाल करके, मेट्रिक इस तरह से लॉग किए जा सकते हैं:

    listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);

Tradefed मेट्रिक कलेक्टर

Tradefed, टेस्ट के साथ-साथ मेट्रिक इकट्ठा करने के लिए, एक खास metrics_collector ऑब्जेक्ट उपलब्ध कराता है.

होस्ट के लिए

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

यह तय करने के लिए कि आपके ट्रेडेडेड एक्सएमएल कॉन्फ़िगरेशन में कलेक्टर का इस्तेमाल किया जाए, आपको बस ऑब्जेक्ट को अपने ट्रेडेड एक्सएमएल कॉन्फ़िगरेशन में जोड़ना होगा:

उदाहरण:

  <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>

इन पैटर्न और कुंजी को तय करने पर, कलेक्टर को कुंजी दिखने पर, उससे जुड़ी फ़ाइल को खींचने और लॉग करने की कोशिश करेगा.

इन कुंजियों को जनरेट करने के लिए, डिवाइस-साइड टेस्ट (इंस्ट्रूमेंटेशन) को उस फ़ाइल के बारे में बताना चाहिए जिसे लॉग करना है. यह उसी तरह से किया जाता है जैसे होस्ट-साइड (ऊपर बताया गया है) पर किया जाता है.

  1. बनाने वाली फ़ाइलों में collector-device-lib को अपने परीक्षण APK में जोड़ें:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. फ़ाइलों को लॉग करने के लिए, हमारे दिए गए @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 पर निर्भर करता है.