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 - regular JUnit3 test

আপনি যদি সাধারণ JUnit3 TestCase ক্লাস থেকে Tradefed-এর মধ্যে মেট্রিক রিপোর্ট করতে চান, তাহলে এটিকে MetricTestCase-এ কনভার্ট করতে হবে, যা একটি অতিরিক্ত পদ্ধতি সহ ঠিক একই ক্লাস: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - JUnit4 স্টাইল

আপনার JUnit4 স্টাইল টেস্ট DeviceJUnit4ClassRunner-এর সাথে রান করলে, আপনি টেস্ট কেসের ( @Test-এর মধ্যে) মধ্যেও মেট্রিক লগ করতে পারবেন যা 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 - pure Tradefed Test

আপনি নিজের Tradefed Test ক্লাস বা রানার লিখলে, আপনাকে IRemoteTest ইমপ্লিমেন্ট করতে হবে এবং run() পদ্ধতির মাধ্যমে ITestInvocationListener পেতে হবে। এই লিসেনার নিম্নলিখিত উপায়ে মেট্রিক লগ করতে ব্যবহার করা যেতে পারে:

    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-এর মতো স্যুটের ক্ষেত্রে, যেগুলির টপ-লেভেল কনফিগারেশন কিছু মডিউল কনফিগারেশন রান করায়, প্রতিটি মডিউল কনফিগারেশনে metrics_collector উল্লেখ করার প্রয়োজন নেই (AndroidTest.xml)। এটি আসলে নিষিদ্ধ।

প্রতিটি মডিউলে যাতে সমানভাবে মেট্রিক সংগ্রহ করা হয় তা নিশ্চিত করতে, শুধুমাত্র টপ-লেভেল কনফিগারেশন (যেমন, 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 নির্দিষ্ট করা আছে কিনা তার উপর নির্ভর করে।