בדף הזה מוסבר איך לדווח על מדדים יחד עם תוצאות הבדיקה כשכותבים בדיקה ב-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). הפעולה מתבצעת באופן דומה לזה של הצד המארח (כפי שמתואר למעלה).
- מוסיפים את
collector-device-libלקובץ ה-APK לבדיקה בקובצי ה-make:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- משתמשים ב- @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.