דיווח על מדדים או נתונים מבדיקת 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 הזה כדי לרשום מדדים ביומן באופן הבא:

    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' לכל מקרה בדיקה.

בצד המכשיר

כשמריצים בדיקות בצד המכשיר (Instrumentations, בדיקות UIAutomator וכו'), יכול להיות שלא כדאי להשתמש באיסוף אסינכרוני בצד המארח. לדוגמה, צילום מסך שמתבצע באופן אסינכרוני כנראה לא יכלול את המסך הרצוי ולא יהיה שימושי.

כדי לעמוד בתרחישי השימוש האלה, קיימת גרסה של כלי האיסוף שלנו בצד המכשיר, שאפשר להשתמש בה בכל מכשיר עם מכשור מסוג AndroidJUnitRunner. אפשר להטמיע את BaseMetricListener כדי לדווח באופן אוטומטי על מדדים שנאספים בצורה שתואמת באופן מלא לצינור הדיווח של Tradefed.

אם אתם משתמשים ב-runner‏ AndroidJUnitTest מ-Tradefed, אתם יכולים פשוט לציין את האפשרות הבאה בשורת הפקודה כדי שהכלי לאיסוף נתונים יפעל עם הבדיקות שלכם:

  --device-listeners android.device.collectors.ScreenshotListener

שימו לב: כדי שהמערכת תוכל לפתור את בעיות המחלקות של אוספי הנתונים בזמן הריצה, סביר להניח שחבילת ה-APK של כלי המדידה תצטרך לכלול אותן באופן סטטי. לשם כך, צריך להוסיף את השורה הבאה לקובץ ה-Makefile:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

נשמח לקבל תרומות גם לכלים לאיסוף נתונים בצד המכשיר.

שיקולים מיוחדים לגבי סוויטות

במערכות כמו CTS שיש להן הגדרה ברמה העליונה שמפעילה חלק מההגדרות של המודולים, אין צורך לציין metrics_collector בכל הגדרה של מודול (AndroidTest.xml). למעשה, זה אסור.

כדי לוודא שאיסוף המדדים יחול באופן שווה על כל מודול, אפשר לציין את metrics_collector רק בהגדרה ברמה העליונה (לדוגמה, cts.xml), כמו שמוסבר למעלה. הכלים האלה יופעלו על כל מודול בחבילה.

איסוף קובצי יומן במכשיר ממודול

יש הגדרה שמאפשרת לבדיקה בצד המכשיר להודיע שצריך לאסוף קבצים מסוימים.

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>

אם תציינו את הדפוסים ומילת המפתח האלה, הכלי לאיסוף נתונים ינסה לשלוף ולתעד את הקובץ המשויך אם הוא יזהה את מילת המפתח.

כדי שהמפתחות האלה ייווצרו, צריך לציין בקובץ שצריך להיכנס ליומן הבדיקה בצד המכשיר (instrumentation). הפעולה מתבצעת באופן דומה לזה של הצד המארח (כפי שמתואר למעלה).

  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.