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

بعض أجهزة التجميع الحالية حاليًا: * أداة جمع درجة الحرارة التي تجمع درجة الحرارة بشكلٍ دوري أثناء إجراء الاختبار * 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 الاختبارية في ملفات 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.