Tradefed टेस्ट से मिली मेट्रिक या डेटा की शिकायत करना

इस पेज पर, 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 टेस्ट

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

DeviceJUnit4ClassRunner - JUnit4 स्टाइल

अगर आपका JUnit4 स्टाइल टेस्ट, DeviceJUnit4ClassRunner के साथ चल रहा है, तो Tradefed से रिपोर्ट करने के लिए, किसी टेस्ट केस (ऐट द रेट टेस्ट के अंदर) में मेट्रिक को भी लॉग किया जा सकता है. आपको अपनी मेट्रिक की रिपोर्ट करने के लिए, 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 को लागू करना होगा. साथ ही, ITestInvocationListener तरीके से run() मिलेगा. इस लिसनर का इस्तेमाल, मेट्रिक को लॉग करने के लिए किया जा सकता है. इसके लिए, यह तरीका अपनाएं:

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

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

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

होस्ट की ओर से

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

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

उदाहरण:

  <metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
      <option name="categories" value="freq"/>
  </metrics_collector>

फ़िलहाल मौजूद कुछ कलेक्टर: * TemperatureCollector जो टेस्ट रन के दौरान समय-समय पर तापमान इकट्ठा करता है. * AtraceCollector जो हर टेस्ट केस के लिए 'atrace' का इस्तेमाल करके डेटा इकट्ठा करता है.

डिवाइस की ओर से

डिवाइस की ओर से टेस्ट (इंस्ट्रूमेंटेशन, UIAutomator टेस्ट वगैरह) चलाते समय, होस्ट की ओर से एसिंक्रोनस तरीके से डेटा इकट्ठा करने वाला कलेक्टर इस्तेमाल करना सही नहीं हो सकता. उदाहरण के लिए, एसिंक्रोनस तरीके से लिया गया स्क्रीनशॉट, ज़्यादातर मामलों में काम की स्क्रीन को कैप्चर नहीं कर पाएगा. इसलिए, वह किसी काम का नहीं होगा.

इन इस्तेमाल के उदाहरणों के लिए, हमारे कलेक्टर का डिवाइस-साइड वर्शन मौजूद है. इसका इस्तेमाल, 'AndroidJUnitRunner' इंस्ट्रूमेंटेशन में किया जा सकता है. Tradefed रिपोर्टिंग पाइपलाइन के साथ पूरी तरह से काम करने वाले तरीके से इकट्ठा की गई मेट्रिक की रिपोर्ट अपने-आप करने के लिए, BaseMetricListener को लागू किया जा सकता है.

अगर 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. मेक फ़ाइलों में, अपने टेस्ट APK में collector-device-lib जोड़ें:
  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 उसे डिवाइस से अपने-आप मिटा देता है.

मुझे मेट्रिक कहां दिखेंगी?

यह आपके XML कॉन्फ़िगरेशन में तय किए गए result_reporter पर निर्भर करता है.