گزارش کردن سنجه‌ها یا داده‌های آزمون Tradefed

این صفحه نحوه گزارش کردن سنجه‌ها را به‌همراه نتایج آزمایش هنگام نوشتن آزمایش در Tradefed شرح می‌دهد.

مزیت ثبت گزارش ازطریق خط لوله Tradefed این است که سنجه‌هایتان را درکنار نتایج عملکردی‌تان پیدا می‌کنید. ثبت سنجه‌ها می‌تواند به‌طور طبیعی در آزمایش‌ها انجام شود که این امر افزودن ابزارهای بیشتر را برای نویسندگان آزمایش آسان می‌کند.

DeviceTestCase - سبک JUnit3

اگر آزمایشتان DeviceTestCase را در نوعی آزمایش به‌سبک JUnit3 گسترش می‌دهد، می‌توانید روش 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 اجرا می‌شود، می‌توانید سنجه‌ها را در چارچوب تست (داخل @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» خودتان را می‌نویسید، 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» برای هر چارچوب تست جمع‌آوری می‌کند.

در سمت دستگاه

When running device-side tests (Instrumentations, UIAutomator tests, etc.), having a collector on the host-side collecting asynchronously might not be ideal. برای مثال، نماگرفتی که به‌صورت ناهمزمان گرفته شود به‌احتمال زیاد صفحه موردنظر را ازدست می‌دهد و بی‌فایده خواهد بود.

برای برآورده کردن این موارد استفاده، نسخه‌ای از جمع‌آورندگان ما در سمت دستگاه وجود دارد و می‌توان از آن در هر ابزار «AndroidJUnitRunner» استفاده کرد. BaseMetricListener می‌تواند به‌منظور گزارش خودکار سنجه‌هایی که به‌روشی کاملاً سازگار با خط لوله گزارش‌دهی Tradefed جمع‌آوری می‌شوند پیاده‌سازی شود.

اگر از دونده «AndroidJUnitTest» در Tradefed استفاده می‌کنید، می‌توانید به‌سادگی گزینه خط فرمان زیر را مشخص کنید تا جمع‌آورتان همراه با آزمایش‌هایتان اجرا شود:

  --device-listeners android.device.collectors.ScreenshotListener

احتیاط: برای اینکه کلاس‌های جمع‌آوری‌کننده در زمان اجرا حل‌وفصل شوند، فایل APK ابزار شما به‌احتمال زیاد باید آن‌ها را به‌صورت ایستا با افزودن موارد زیر به فایل makefile شما اضافه کند:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

همیاری در جمع‌آوری‌کننده‌های سمت دستگاه نیز مورد استقبال قرار می‌گیرد.

ملاحظات ویژه برای سوئیت‌ها

برای مجموعه‌هایی مثل CTS که پیکربندی سطح بالایی دارند که برخی پیکربندی‌های واحد را اجرا می‌کند، نیازی نیست metrics_collector در هر پیکربندی واحد (AndroidTest.xml) مشخص شود. درواقع این کار ممنوع است.

برای اطمینان از اینکه جمع‌آوری سنجه به‌طور مساوی برای هر ماژول اعمال می‌شود، فقط پیکربندی سطح بالا (برای مثال، cts.xml) می‌تواند metrics_collector را همان‌طور که در بالا توضیح داده شد مشخص کند. این جمع‌آورنده‌ها اعمال خواهند شد و در هریک از ماژول‌های مجموعه اجرا خواهند شد.

جمع‌آوری فایل‌های گزارش دستگاه از واحد

A setup is available in order for a device side test to notify that some files should be collected.

‫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 آزمایشی خود در فایل‌های make اضافه کنید:
  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 مشخص‌شده در پیکربندی XML شما بستگی دارد.