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

مثال:

  <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 الاختبارية في ملف "إنشاء":
  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.