Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

התחל בעבודה עם מבחני Game Loop

זה יכול להיות קשה לבצע בדיקות משחק אוטומטיות כאשר אפליקציות משחק בנויות על מסגרות ממשק משתמש שונות. מבחני משחק לולאה מאפשרים לך לשלב את המבחנים המקוריים שלך עם מעבדת הבדיקה ולהפעיל אותם בקלות במכשירים שתבחר. מבחן Game Loop מריץ את הבדיקה שלך דרך אפליקציית המשחק שלך תוך כדי הדמיה של פעולות של שחקן אמיתי. מדריך זה מראה כיצד להריץ בדיקת Game Loop, ואז להציג ולנהל את תוצאות הבדיקה שלך במסוף Firebase.

תלוי במנוע המשחק שלך, תוכל ליישם בדיקות עם לולאות בודדות או מרובות . לולאה היא הפעלה מלאה או חלקית של הבדיקה שלך באפליקציית המשחק שלך. ניתן להשתמש בלולאות משחק ל:

  • הפעל רמה של המשחק שלך באותה צורה שמשתמש קצה היה משחק בה. אתה יכול לתסריט את קלט המשתמש, לתת למשתמש להיות סרק, או להחליף את המשתמש ב- AI אם זה הגיוני במשחק שלך (למשל, נניח שיש לך אפליקציית משחקי מכוניות מירוץ וכבר מיושמת לך AI. אתה יכול בקלות לשים נהג AI האחראי על קלט המשתמש).
  • הפעל את המשחק שלך באיכות הגבוהה ביותר כדי לראות אם מכשירים תומכים בו.
  • הפעל בדיקה טכנית (הידור מספר הצללות, בצע אותן, בדוק שהפלט כצפוי וכו ').

אתה יכול להריץ בדיקת Game Loop במכשיר בדיקה בודד, קבוצה של מכשירי בדיקה או במעבדת Test. עם זאת, אנו לא ממליצים להריץ בדיקות Game Loop במכשירים וירטואליים מכיוון שיש להם קצב פריימים גרפי נמוך יותר מאשר מכשירים פיזיים.

לפני שאתה מתחיל

כדי ליישם בדיקה, תחילה עליך להגדיר את האפליקציה שלך לבדיקות Game Loop.

  1. במניפסט האפליקציה שלך, הוסף מסנן כוונות חדש לפעילות שלך:

    <activity android:name=".MyActivity">
       <intent-filter>
           <action android:name="com.google.intent.action.TEST_LOOP"/>
           <category android:name="android.intent.category.DEFAULT"/>
           <data android:mimeType="application/javascript"/>
       </intent-filter>
       <intent-filter>
          ... (other intent filters here)
       </intent-filter>
    </activity>
    

    זה מאפשר למעבדת Test להפעיל את המשחק שלך על ידי הפעלתו מתוך כוונה ספציפית.

  2. בקוד שלך (אנו ממליצים בתוך הצהרת שיטת onCreate ), הוסף את הדברים הבאים:

    ג'אווה

    Intent launchIntent = getIntent();
    if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) {
        int scenario = launchIntent.getIntExtra("scenario", 0);
        // Code to handle your game loop here
    }

    Kotlin + KTX

    val launchIntent = intent
    if (launchIntent.action == "com.google.intent.action.TEST_LOOP") {
        val scenario = launchIntent.getIntExtra("scenario", 0)
        // Code to handle your game loop here
    }

    זה מאפשר לפעילות שלך לבדוק את הכוונה שמפעילה אותה. תוכל גם להוסיף קוד זה מאוחר יותר אם תרצה בכך (למשל לאחר טעינת תחילת מנוע המשחק שלך).

  3. מומלץ: בסוף הבדיקה הוסף:

    ג'אווה

    yourActivity.finish();

    Kotlin + KTX

    yourActivity.finish()

    פעולה זו סוגרת את האפליקציה שלך כאשר המבחן Game Loop הושלם. הבדיקה נשענת על מסגרת ממשק המשתמש של היישום שלך כדי להתחיל את הלולאה הבאה, וסגירת האפליקציה שלך אומרת לה שהבדיקה הסתיימה.

צור והפעל מבחן Game Loop

לאחר שתגדיר את האפליקציה שלך לבדיקות Game Loop, תוכל ליצור בדיקה מיידית ולהריץ אותה באפליקציית המשחק שלך. אתה יכול לבחור להריץ בדיקה במעבדת Test באמצעות מסוף Firebase או ממשק שורת הפקודה gcloud (CLI) , או במכשיר מקומי באמצעות מנהל לולאת הבדיקה .

הפעל במכשיר מקומי

מנהל לולאת המבחנים של Test Lab הוא אפליקציית קוד פתוח המסייעת לך לשלב מבחני Game Loop ולהריץ אותם במכשירים המקומיים שלך. זה גם מאפשר לצוות אבטחת האיכות שלך להפעיל את אותם לולאות משחק במכשירים שלהם.

כדי להריץ בדיקה במכשיר מקומי באמצעות מנהל לולאת הבדיקה:

  1. הורד את מנהל לולאת הבדיקה בטלפון או בטאבלט והתקן אותו על ידי הפעלת:
    adb install testloopmanager.apk
  2. במכשיר שלך, פתח את אפליקציית Test Loop Apps בטלפון או בטאבלט שלך. האפליקציה מציגה רשימת אפליקציות במכשיר שניתן להריץ באמצעות לולאות משחק. אם אינך רואה את אפליקציית המשחק שלך כאן, ודא שמסנן הכוונות שלך תואם לזה שתואר בשלב הראשון של החלק לפני שתתחיל .
  3. בחר באפליקציית המשחק שלך, ואז בחר במספר הלולאות שאתה רוצה להריץ. הערה: בשלב זה, תוכלו לבחור להריץ קבוצת לולאות במקום לולאה אחת בלבד. למידע נוסף על הפעלת מספר לולאות בו זמנית, ראה תכונות אופציונליות.
  4. לחץ על הפעל בדיקה . הבדיקה שלך מתחילה לרוץ מיד.

לרוץ במעבדת הבדיקה

אתה יכול להריץ בדיקת Game Loop במעבדת Test באמצעות קונסולת Firebase או ה- CLI של gcloud. לפני שתתחיל, אם עדיין לא עשית זאת, פתח את קונסולת Firebase וצור פרויקט.

השתמש במסוף Firebase

  1. במסוף Firebase, לחץ על Test Lab מהחלונית הימנית.
  2. לחץ על הפעל את הבדיקה הראשונה שלך (או על הפעל בדיקה אם הפרויקט שלך ריצה בעבר בדיקה).
  3. בחר Game Loop כסוג הבדיקה ואז לחץ על המשך .
  4. לחץ על עיון ואז דפדף לקובץ ה- .apk של האפליקציה שלך. הערה: בשלב זה, תוכלו לבחור להריץ קבוצת לולאות במקום לולאה אחת בלבד. למידע נוסף על הפעלת לולאות מרובות בו זמנית, ראה תכונות אופציונליות.
  5. לחץ על המשך .
  6. בחר את המכשירים הפיזיים שישמשו לבדיקת האפליקציה שלך.
  7. לחץ על התחל בדיקות .

לקבלת מידע נוסף אודות תחילת העבודה עם מסוף Firebase, ראה התחל לבדוק באמצעות מסוף Firebase.

השתמש בשורת הפקודה gcloud (CLI)

  1. אם עדיין לא עשית זאת, הורד והתקן את Google Cloud SDK.

  2. היכנס ל- gcloud CLI באמצעות חשבון Google שלך:

    gcloud auth login

  3. הגדר את פרויקט Firebase שלך ​​ב- gcloud, כאשר PROJECT_ID הוא המזהה של פרויקט Firebase שלך:

    gcloud config set project PROJECT_ID
    
  4. הפעל את הבדיקה הראשונה שלך:

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

לקבלת מידע נוסף על תחילת העבודה עם gcloud CLI, ראה התחל בדיקה משורת הפקודה gcloud.

תכונות אופציונליות

מעבדת הבדיקה מציעה מספר תכונות אופציונליות המאפשרות התאמה אישית נוספת של הבדיקות, כולל יכולת לכתוב נתוני פלט, תמיכה במספר לולאות משחק ותוויות לולאות קשורות.

כתוב נתוני פלט

בדיקת Game Loop שלך יכולה לכתוב פלט לקובץ שצוין בשיטת launchIntent.getData() . לאחר הפעלת בדיקה, תוכל לגשת לנתוני פלט אלה בקטע מעבדת הבדיקה במסוף Firebase (ראה דוגמה לקובץ פלט בדיקת Game Loop ).

מעבדת הבדיקה פועלת לפי שיטות עבודה מומלצות לשיתוף קובץ בין אפליקציות המתוארות בשיתוף קובץ . בשיטת onCreate() של הפעילות שלך, בה נמצאת כוונתך, תוכל לבדוק את קובץ פלט הנתונים שלך על ידי הפעלת הקוד הבא:

ג'אווה

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

Kotlin + KTX

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

אם ברצונך לכתוב לקובץ מצד C ++ של אפליקציית המשחק שלך, תוכל להעביר למתאר הקבצים במקום לנתיב הקובץ:

ג'אווה

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
int fd = -1;
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    try {
        fd = getContentResolver()
                .openAssetFileDescriptor(logFile, "w")
                .getParcelFileDescriptor()
                .getFd();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        fd = -1;
    } catch (NullPointerException e) {
        e.printStackTrace();
        fd = -1;
    }
}

// C++ code invoked here.
// native_function(fd);

Kotlin + KTX

val launchIntent = intent
val logFile = launchIntent.data
var fd = -1
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    fd = try {
        contentResolver
                .openAssetFileDescriptor(logFile, "w")!!
                .parcelFileDescriptor
                .fd
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
        -1
    } catch (e: NullPointerException) {
        e.printStackTrace()
        -1
    }
}

// C++ code invoked here.
// native_function(fd);

C ++

#include <unistd.h>
JNIEXPORT void JNICALL
Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) {
// The file descriptor needs to be duplicated.
int my_file_descriptor = dup(log_file_descriptor);
}

דוגמה לקובץ פלט

באפשרותך להשתמש בקובצי נתוני פלט (מעוצבים כמו הדוגמה למטה) כדי להציג תוצאות בדיקת לולאת משחק בקטע מעבדת הבדיקה במסוף Firebase. אזורים המוצגים כ /.../ יכולים להכיל כל שדה מותאם אישית שאתה זקוק לו, כל עוד הם אינם מתנגשים עם שמות שדות אחרים המשמשים בקובץ זה:

{
  "name": "test name",
  "start_timestamp": 0, // Timestamp of the test start (in us).
                           Can be absolute or relative
  "driver_info": "...",
  "frame_stats": [
    {
      "timestamp": 1200000, // Timestamp at which this section was written
                               It contains value regarding the period
                               start_timestamp(0) -> this timestamp (1200000 us)
      "avg_frame_time": 15320, // Average time to render a frame in ns
      "nb_swap": 52, // Number of frame rendered
      "threads": [
        {
          "name": "physics",
          "Avg_time": 8030 // Average time spent in this thread per frame in us
        },
        {
          "name": "AI",
          "Avg_time": 2030 // Average time spent in this thread per frame in us
        }
      ],
      /.../ // Any custom field you want (vertices display on the screen, nb units …)
    },
    {
      // Next frame data here, same format as above
    }
  ],
  "loading_stats": [
    {
      "name": "assets_level_1",
      "total_time": 7850, // in us
      /.../
    },
    {
      "name": "victory_screen",
      "total_time": 554, // in us
      /.../
    }

  ],
  /.../, // You can add custom fields here
}

לולאות משחק מרובות

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

כדי לאפשר לאפליקציה שלך להריץ מספר לולאות בו זמנית:

  • אם אתה מבצע בדיקה עם מנהל לולאת הבדיקה:

    1. הוסף את השורה הבאה למניפסט של האפליקציה שלך, בתוך האלמנט <application> :

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />
      

      כוונת השקה זו מכילה את לולאת היעד כפרמטר שלם. בשדה android:value ניתן להגדיר מספר שלם בין 1 ל -1024 (המספר המרבי של לולאות המותר לבדיקה בודדת). שים לב שלולאות באינדקס החל מ- 1 ולא מ- 0.

    2. באפליקציית Test Loop Manager מופיע מסך בחירה המאפשר לבחור אילו לולאות (ים) שברצונך להפעיל. אם תבחר לולאות מרובות, כל לולאה מופעלת ברצף לאחר השלמת הלולאה הקודמת.

  • אם אתה מבצע בדיקה עם מסוף Firebase, הזן רשימה או טווח של מספרי לולאה בשדה תרחישים .

  • אם אתה מריץ בדיקה עם gcloud CLI, ציין רשימה של מספרי לולאה באמצעות הדגל --scenario-numbers . לדוגמא --scenario-numbers=1,3,5 לולאות 1, 3 ו- 5.

  • אם אתה כותב C ++ ורוצה לשנות את התנהגות הלולאה שלך, העביר את התוספת הבאה לקוד C ++ המקורי שלך:

    ג'אווה

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    Kotlin + KTX

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    כעת תוכל לשנות את התנהגות הלולאה שלך על סמך ערך ה- int המתקבל.

תייג לולאות משחק

כאשר אתה מתייג את לולאות המשחק שלך בתוויות תרחיש אחת או יותר, אתה וצוות ה- QA שלך יכולים להשיק בקלות קבוצה של לולאות משחק קשורות (למשל, "כל לולאות משחק תאימות") ולבדוק אותן במטריצה ​​אחת. אתה יכול ליצור תוויות משלך או להשתמש בתוויות המוגדרות מראש שמציעה מעבדת הבדיקה:

  • com.google.test.loops.player_experience : לולאות המשמשות להעתקת חוויית משתמש אמיתית בעת משחק המשחק. מטרת הבדיקה באמצעות לולאות אלה היא למצוא בעיות שמשתמש אמיתי יתמודד איתן בזמן משחק המשחק.
  • com.google.test.loops.gpu_compatibility : לולאות המשמשות לבדיקת בעיות הקשורות ל- GPU. מטרת הבדיקה עם לולאות אלה היא לבצע קוד GPU שאולי לא יופעל כראוי בייצור, כדי לחשוף בעיות עם חומרה ומנהלי התקנים.
  • com.google.test.loops.compatibility : לולאות המשמשות לבדיקת מגוון רחב של בעיות תאימות, כולל בעיות קלט / פלט ובעיות OpenSSL.
  • com.google.test.loops.performance : לולאות המשמשות לבדיקת ביצועי המכשיר. לדוגמה, משחק עשוי לרוץ בהגדרות הגרפיקה המורכבות ביותר כדי לראות כיצד מכשיר חדש מתנהג.

כדי לאפשר לאפליקציה שלך להריץ לולאות עם אותה תווית:

  • אם אתה מבצע בדיקה עם מנהל לולאת הבדיקה:

    1. במניפסט של האפליקציה שלך, הוסף את שורת המטא-נתונים הבאה והחלף את LABEL_NAME בתווית שתבחר:

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />
      

      בשדה הערך android:value , אתה יכול לציין טווח או קבוצה של מספרים שלמים בין 1 ל -1024 (המספר המרבי של לולאות המותר לבדיקה בודדת) המייצגים את הלולאות שברצונך לתייג. שים לב כי לולאות באינדקס החל מ- 1, ולא 0. לדוגמה, android:value="1,3-5" חל על LABEL_NAME על לולאות 1, 3, 4 ו- 5.

    2. באפליקציית Test Loop Manager, הזן תווית אחת או יותר בשדה תוויות .

  • אם אתה מבצע בדיקה עם מסוף Firebase, הזן תווית אחת או יותר בשדה תוויות .

  • אם אתה מריץ בדיקה עם gcloud CLI, ציין תווית תרחיש אחת או יותר באמצעות הדגל --scenario-labels (למשל, --scenario-labels=performance,gpu ).

תמיכה ברישוי אפליקציות

מעבדת הבדיקה תומכת באפליקציות המשתמשות בשירות רישוי אפליקציות המוצע על ידי Google Play. כדי לבדוק בהצלחה רישוי בעת בדיקת האפליקציה שלך במעבדת Test, עליך לפרסם את האפליקציה שלך לערוץ הייצור בחנות Play. כדי לבדוק את האפליקציה שלך בערוץ אלפא או בטא באמצעות Test Lab, הסר את בדיקת הרישוי לפני שתעלה את היישום שלך ל- Test Lab.

בעיות ידועות

במבחני לולאת המשחק במעבדת הבדיקה יש את הבעיות הידועות הבאות:

  • חלק מההתרסקויות אינן תומכות במעקב אחורי. לדוגמה, כמה prctl(PR_SET_DUMPABLE, 0) בנייה עשויות לדכא את הפלט של תהליך debuggerd באמצעות prctl(PR_SET_DUMPABLE, 0) . למידע נוסף, ראה debuggerd .
  • API רמת 19 אינו נתמך כרגע בגלל שגיאות הרשאת קבצים.