זוהי הקדמה קצרה למיפוי בדיקות והסבר על תחילת ההגדרה של בדיקות ב-פרויקט קוד פתוח של Android (AOSP).
מידע על מיפוי בדיקות
מיפוי בדיקות הוא גישה שמבוססת על Gerrit ומאפשרת למפתחים ליצור כללי בדיקה לפני שליחה ואחרי שליחה ישירות בעץ המקור של Android, ולהשאיר את ההחלטות לגבי הענפים והמכשירים שייבדקו לתשתית הבדיקה.
הגדרות מיפוי לבדיקה הן קובצי JSON בשם TEST_MAPPING שאפשר למקם בכל ספריית קובצי המקור.
Atest יכול להשתמש בקבצים TEST_MAPPING כדי להריץ בדיקות לפני שליחה בספריות המשויכות. בעזרת מיפוי בדיקות, אתם יכולים להוסיף את אותו סט של בדיקות לבדיקות לפני שליחה, עם שינוי מינימלי בתוך עץ המקור של Android.
דוגמאות:
מיפוי הבדיקות מסתמך על Trade Federation (TF) test harness להרצת בדיקות ולדיווח על תוצאות.
הגדרת קבוצות בדיקה
בודקים קבוצות מיפוי באמצעות קבוצת בדיקה. השם של קבוצת בדיקה יכול להיות כל מחרוזת. לדוגמה, presubmit יכול להיות השם של קבוצת בדיקות שמופעלות כשמאמתים שינויים. postsubmit יכול להיות הבדיקות שמשמשות לאימות הגרסאות אחרי מיזוג השינויים.
כללים של סקריפט ליצירת חבילה
כדי ש-Trade Federation test harness יריץ מודולי בדיקה עבור גרסת build מסוימת, צריך להגדיר את המודולים האלה כך ש-test_suites יוגדר ל-Soong או ש-LOCAL_COMPATIBILITY_SUITE יוגדר ל-Make לאחת משתי החבילות האלה:
-
general-testsמיועד לבדיקות שלא תלויות ביכולות ספציפיות למכשיר (כמו חומרה ספציפית לספק שאין ברוב המכשירים). רוב הבדיקות צריכות להיות בחבילתgeneral-tests, גם אם הן ספציפיות ל-ABI אחד, לרוחב סיביות אחד או לתכונות חומרה כמו HWASan (יש יעדtest_suitesנפרד לכל ABI), וגם אם הן צריכות לפעול במכשיר. -
device-testsמיועד לבדיקות שתלויות ביכולות ספציפיות למכשיר. בדרך כלל הבדיקות האלה נמצאות בקטעvendor/. ספציפי למכשיר מתייחס רק ליכולות שייחודיות למכשיר מסוים, ולכן זה רלוונטי לבדיקות JUnit ולבדיקות GTest (שבדרך כלל צריך לסמן אותן כ-general-testsגם אם הן ספציפיות לממשק ABI).
דוגמאות:
Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests
הגדרת בדיקות להרצה בחבילת מקרים לבדיקה
כדי שבדיקה תפעל בתוך חבילת מקרים לבדיקה, הבדיקה צריכה:
- אסור להשתמש בספק build.
- צריך לבצע ניקוי אחרי שהבדיקה מסתיימת, למשל, למחוק קבצים זמניים שנוצרו במהלך הבדיקה.
- צריך לשנות את הגדרות המערכת לערך ברירת המחדל או לערך המקורי.
לא כדאי להניח שמכשיר נמצא במצב מסוים, למשל מוכן ל-root. ברוב הבדיקות לא נדרשת הרשאת root כדי להריץ אותן. אם בדיקה צריכה הרשאת root, צריך לציין זאת באמצעות
RootTargetPreparerב-AndroidTest.xmlשלה, כמו בדוגמה הבאה:<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
יצירת קובצי מיפוי לבדיקה
בספרייה שנדרש כיסוי בדיקות עבורה, מוסיפים קובץ JSON TEST_MAPPING שדומה לדוגמה. הכללים האלה מבטיחים שהבדיקות יפעלו בבדיקות לפני שליחה (presubmit) כשמבצעים שינויים בקבצים בספרייה הזו או בכל אחת מהספריות המשנה שלה.
דוגמה
זו דוגמה לקובץ TEST_MAPPING (בפורמט JSON אבל עם תמיכה בהערות):
{
"presubmit": [
// JUnit test with options and file patterns.
{
"name": "CtsWindowManagerDeviceTestCases",
"options": [
{
"include-annotation": "android.platform.test.annotations.RequiresDevice"
}
],
"file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
},
// Device-side GTest with options.
{
"name" : "hello_world_test",
"options": [
{
"native-test-flag": "\"servicename1 servicename2\""
},
{
"native-test-timeout": "6000"
}
]
}
// Host-side GTest.
{
"name" : "net_test_avrcp",
"host" : true
}
],
"postsubmit": [
{
"name": "CtsDeqpTestCases",
"options": [
{
// Use regex in include-filter which is supported in AndroidJUnitTest
"include-filter": "dEQP-EGL.functional.color_clears.*"
}
]
}
],
"imports": [
{
"path": "frameworks/base/services/core/java/com/android/server/am"
}
]
}
הגדרת מאפיינים
בדוגמה, presubmit ו-postsubmit הם השמות של כל קבוצת בדיקה. מידע נוסף על קבוצות בדיקה זמין במאמר הגדרת קבוצות בדיקה.
אפשר להגדיר את השם של מודול הבדיקה או את השם של בדיקת השילוב של Trade Federation (נתיב המשאב לקובץ ה-XML של הבדיקה, לדוגמה, uiautomator/uiautomator-demo) בערך של המאפיין name. שימו לב: בשדה name אי אפשר להשתמש במחלקה name או בשיטת הבדיקה name. כדי לצמצם את הבדיקות שיופעלו, אפשר להשתמש באפשרויות כמו include-filter. include-filter דוגמה לשימוש
ההגדרה host של בדיקה מציינת אם הבדיקה היא בדיקה ללא מכשיר שפועלת במארח או לא. ערך ברירת המחדל הוא false, כלומר כדי להריץ את הבדיקה נדרש מכשיר. סוגי הבדיקות הנתמכים הם HostGTest לקבצים בינאריים של GTest ו-HostTest לבדיקות JUnit.
המאפיין file_patterns מאפשר להגדיר רשימה של מחרוזות של ביטויים רגולריים להתאמה של הנתיב היחסי של כל קובץ קוד מקור (ביחס לספרייה שמכילה את הקובץ TEST_MAPPING). בדוגמה, הבדיקה CtsWindowManagerDeviceTestCases מופעלת לפני השליחה רק כשקובץ Java מתחיל ב-Window או ב-Activity, שקיימים באותה ספרייה כמו קובץ TEST_MAPPING או באחת מספריות המשנה שלו. צריך להוסיף תו בריחה ללוכסנים (\) כי הם נמצאים בקובץ JSON.
המאפיין imports מאפשר לכם לכלול בדיקות בקובצי TEST_MAPPING אחרים בלי להעתיק את התוכן. גם קובצי TEST_MAPPING בתיקיות האב של הנתיב המיובא נכללים. מיפוי בדיקות מאפשר ייבוא מקונן. כלומר, שני קובצי TEST_MAPPING יכולים לייבא אחד את השני, ומיפוי הבדיקות יכול למזג את הבדיקות הכלולות.
המאפיין options מכיל אפשרויות נוספות של שורת פקודה ב-Tradefed.
כדי לקבל רשימה מלאה של האפשרויות הזמינות לבדיקה מסוימת, מריצים את הפקודה:
tradefed.sh run commandAndExit [test_module] --help
מידע נוסף על האופן שבו האפשרויות פועלות זמין במאמר בנושא טיפול באפשרויות ב-Tradefed.
הרצת בדיקות באמצעות Atest
כדי להריץ את כללי הבדיקה לפני השליחה באופן מקומי:
- עוברים לספרייה שמכילה את הקובץ
TEST_MAPPING. מריצים את הפקודה:
atest
כל הבדיקות לפני שליחה שמוגדרות בקובצי TEST_MAPPING של הספרייה הנוכחית ושל ספריות ההורה שלה מופעלות. Atest מאתר ומריץ שתי בדיקות
לפני שליחת קוד (A ו-B).
זו הדרך הכי פשוטה להריץ בדיקות לפני שליחת קוד ל-TEST_MAPPING
קבצים בספריית העבודה הנוכחית (CWD) ובספריות האב. Atest מאתר את הקובץ TEST_MAPPING ב-CWD ומשתמש בו, וגם בכל ספריות האב שלו.
קוד מקור של מבנה
בדוגמה הזו אפשר לראות איך מגדירים קובצי TEST_MAPPING בעץ המקור:
src
├── project_1
│ └── TEST_MAPPING
├── project_2
│ └── TEST_MAPPING
└── TEST_MAPPING
תוכן של src/TEST_MAPPING:
{
"presubmit": [
{
"name": "A"
}
]
}
תוכן של src/project_1/TEST_MAPPING:
{
"presubmit": [
{
"name": "B"
}
],
"postsubmit": [
{
"name": "C"
}
],
"other_group": [
{
"name": "X"
}
]}
תוכן של src/project_2/TEST_MAPPING:
{
"presubmit": [
{
"name": "D"
}
],
"import": [
{
"path": "src/project_1"
}
]}
ציון ספריות יעד
אפשר לציין ספריית יעד להרצת בדיקות בקובצי TEST_MAPPING בספרייה הזו. הפקודה הבאה מריצה שתי בדיקות (A, B):
atest --test-mapping src/project_1
הרצת כללי בדיקה אחרי שליחה
אפשר להשתמש בפקודה הזו גם כדי להריץ את כללי הבדיקה של postsubmit שמוגדרים ב-TEST_MAPPING ב-src_path (ברירת המחדל היא CWD) ובספריות ברמה העליונה שלה:
atest [--test-mapping] [src_path]:postsubmit
הפעלת בדיקות שלא דורשות מכשיר
אפשר להשתמש באפשרות --host עבור Atest כדי להריץ רק את הבדיקות שהוגדרו מול המארח שלא דורש מכשיר. בלי האפשרות הזו, Atest מריץ את שני סוגי הבדיקות: בדיקות שדורשות מכשיר ובדיקות שרצות במארח שלא דורש מכשיר. הבדיקות מופעלות בשני חבילות נפרדות:
atest [--test-mapping] --host
זיהוי קבוצות בדיקה
אפשר לציין קבוצות בדיקה בפקודה Atest. הפקודה הבאה מריצה את כל הבדיקות של postsubmit שקשורות לקבצים בספרייה src/project_1, שמכילה רק בדיקה אחת (C).
אפשר גם להשתמש ב-:all כדי להריץ את כל הבדיקות בלי קשר לקבוצה. הפקודה הבאה מפעילה ארבע בדיקות (A, B, C ו-X):
atest --test-mapping src/project_1:all
כולל ספריות משנה
כברירת מחדל, כשמריצים בדיקות ב-TEST_MAPPING באמצעות Atest, מורצות רק בדיקות presubmit שהוגדרו בקובץ TEST_MAPPING ב-CWD (או בספרייה שצוינה) ובספריות ברמה העליונה שלה. אם רוצים להריץ בדיקות בכל הקבצים TEST_MAPPING בספריות המשנה, צריך להשתמש באפשרות --include-subdir כדי לחייב את Atest לכלול גם את הבדיקות האלה.
atest --include-subdir
בלי האפשרות --include-subdir, הפקודה Atest מריצה רק את בדיקה A. באפשרות --include-subdir, Atest מריץ שתי בדיקות (A, B).
תגובה ברמת השורה נתמכת
אפשר להוסיף הערה בפורמט // ברמת השורה כדי להוסיף תיאור להגדרה שמופיעה בהמשך הקובץ TEST_MAPPING.
ATest ו-Trade Federation מבצעים עיבוד מקדים של TEST_MAPPING לפורמט JSON תקין ללא הערות. כדי לשמור על קובץ ה-JSON נקי, נתמך רק פורמט ההערה // ברמת השורה.
דוגמה:
{
// For presubmit test group.
"presubmit": [
{
// Run test on module A.
"name": "A"
}
]
}