معیارها یا داده های یک آزمون Tradefed را گزارش دهید

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

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

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 را از یک کلاس TestCase معمولی JUnit3 گزارش دهید، باید آن را به یک 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 - تست خالص Tradefed

اگر در حال نوشتن کلاس یا runner تست Tradefed خودتان هستید، IRemoteTest را پیاده‌سازی خواهید کرد و از طریق متد run() یک ITestInvocationListener دریافت خواهید کرد. این listener می‌تواند برای ثبت معیارها به شرح زیر استفاده شود:

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

جمع‌آوری‌کنندگان معیارهای Tradefed

Tradefed یک شیء metrics_collector اختصاصی برای جمع‌آوری معیارها به موازات تست‌ها ارائه می‌دهد.

در سمت میزبان

BaseDeviceMetricCollector می‌تواند برای جمع‌آوری هرگونه معیار از سمت میزبان و گزارش آنها به عنوان بخشی از فراخوانی تست پیاده‌سازی شود. تعدادی از collectorهای عمومی در حال حاضر برای موارد استفاده مختلف در دسترس هستند، اما ما همیشه از مشارکت‌های جدید استقبال می‌کنیم.

برای مشخص کردن جمع‌کننده‌ای که قرار است در فراخوانی Tradefed شما استفاده شود، کافیست شیء را به پیکربندی Tradefed XML خود اضافه کنید:

مثال:

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

برخی از جمع‌آوری‌کننده‌های موجود: * TemperatureCollector که دما را به صورت دوره‌ای در طول اجرای تست جمع‌آوری می‌کند. * AtraceCollector که با استفاده از 'atrace' برای هر مورد تست، دما را جمع‌آوری می‌کند.

در سمت دستگاه

هنگام اجرای تست‌های سمت دستگاه (Instrumentations، تست‌های UIAutomator و غیره)، داشتن یک جمع‌کننده در سمت میزبان که به صورت ناهمگام جمع‌آوری می‌کند، ممکن است ایده‌آل نباشد. برای مثال، یک اسکرین‌شات که به صورت ناهمگام گرفته شده است، به احتمال زیاد صفحه مورد نظر را از دست می‌دهد و بی‌فایده خواهد بود.

برای برآورده کردن این موارد استفاده، یک نسخه سمت دستگاه از جمع‌کننده‌های ما وجود دارد و می‌تواند در هر ابزار «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 همانطور که در بالا توضیح داده شد، مشخص کند. این مجموعه‌ها در برابر هر ماژول از مجموعه اعمال و اجرا می‌شوند.

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

تنظیماتی در دسترس است تا یک تست جانبی دستگاه اعلام کند که برخی فایل‌ها باید جمع‌آوری شوند.

AndroidTest.xml می‌تواند یک جمع‌کننده (collector) را مشخص کند که به دنبال فایل روی دستگاه می‌گردد و آنها را دریافت می‌کند.

  <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 شما دارد.