الإبلاغ عن مقاييس أو بيانات من اختبار 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 - اختبار Tradefed خالص

إذا كنت تكتب فئة اختبار أو مشغّل Tradefed خاصًا بك، عليك تنفيذ IRemoteTest والحصول على ITestInvocationListener من خلال الطريقة run(). يمكن استخدام هذا المستمع لتسجيل المقاييس على النحو التالي:

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

جامعو مقاييس Tradefed

توفّر Tradefed عنصر metrics_collector مخصّصًا لجمع المقاييس بالتوازي مع الاختبارات.

على جانب المضيف

BaseDeviceMetricCollector يمكن تنفيذه لجمع أي مقاييس من جانب المضيف والإبلاغ عنها كجزء من استدعاء الاختبار. يتوفّر عدد من أدوات الجمع العامة لحالات استخدام مختلفة، ولكنّنا نرحّب دائمًا بالمساهمات الجديدة.

لتحديد أداة الجمع التي سيتم استخدامها في استدعاء Tradefed، ما عليك سوى إضافة العنصر إلى إعدادات XML في Tradefed:

مثال:

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

بعض أدوات الجمع الحالية: * TemperatureCollector التي تجمع درجة الحرارة بشكل دوري أثناء تشغيل الاختبار. * AtraceCollector التي تجمع البيانات باستخدام 'atrace' لكل حالة اختبار.

على جانب الجهاز

عند تشغيل اختبارات على جانب الجهاز (أدوات القياس، واختبارات 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 أداة جمع ستبحث عن ملف على الجهاز وتسحبه.

  <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 الخاصة بالاختبار في ملفات makefile:
  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.