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