דיווח על מדדים או נתונים מבדיקת Tradefed

בדף הזה מוסבר איך לדווח על מדדים יחד עם תוצאות הבדיקה כשכותבים בדיקה ב-Tradefed.

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

DeviceTestCase – בסגנון JUnit3

אם הבדיקה שלכם היא סוג של בדיקה בסגנון JUnit3 שמרחיבה את DeviceTestCase, תוכלו להפעיל את השיטה 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 טהורה

אם אתם כותבים את מחלקת הבדיקה או את ה-runner של 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' לכל מקרה בדיקה.

בצד המכשיר

כשמריצים בדיקות בצד המכשיר (Instrumentations, בדיקות 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.