تقرير المقاييس أو البيانات من اختبار 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 Test الخاص بك، فسوف تقوم بتنفيذ 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 الخاص بالأجهزة إلى تضمينها بشكل ثابت عن طريق إضافة ما يلي إلى ملف التعريف الخاص بك:

  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. استخدم القاعدة التي نقدمها لتسجيل الملفات:
    @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 الخاص بك.