Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

אתה יכול להריץ בדיקת Game Loop על מכשיר בדיקה בודד, קבוצה של מכשירי בדיקה או ב-Test Lab. עם זאת, אנו לא ממליצים להפעיל בדיקות 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 Lab להפעיל את המשחק שלך על ידי הפעלתו מתוך כוונה ספציפית.

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

    Java

    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
    }

    קוטלין+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. מומלץ: בסיום המבחן הוסיפו:

    Java

    yourActivity.finish();

    קוטלין+KTX

    yourActivity.finish()

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

צור והרץ מבחן Game Loop

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

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

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

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

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

הפעל במעבדת בדיקות

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

השתמש במסוף Firebase

  1. במסוף Firebase, לחץ Test Lab מהלוח השמאלי.
  2. לחץ מבחן ההפעלה הראשון שלך (או להפעיל מבחן אם הפרויקט שלך בעבר להפעיל מבחן).
  3. בחר משחק 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
    

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

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

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

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

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

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

Java

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

קוטלין+KTX

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

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

Java

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);

קוטלין+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);
}

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

אתה יכול להשתמש קבצי נתונים הפלט (מעוצבים כמו בדוגמא הבאה) תוצאות בדיקת תצוגת משחק לולאה בחלק Test Lab של קונסולת 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, להיכנס לרשימה או טווח של מספרי לולאה בתחום התרחישים.

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

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

    Java

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

    קוטלין+KTX

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

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

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

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

  • com.google.test.loops.player_experience : לולאות המשמשות לשחזר את חווית משתמש אמיתי כאשר אתה משחק את המשחק. המטרה של בדיקה עם לולאות אלה היא למצוא בעיות שמשתמש אמיתי יתמודד איתן בזמן משחק.
  • com.google.test.loops.gpu_compatibility : לולאות המשמשות סוגיות הקשורות GPU מבחן. המטרה של בדיקה עם לולאות אלה היא לבצע קוד GPU שאולי לא יפעל כראוי בייצור, כדי לחשוף בעיות בחומרה ובמנהלי התקנים.
  • com.google.test.loops.compatibility : לולאות משמשות לבדיקת מגוון רחב של בעיות תאימות, כולל I / O סוגיות ונושאים 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. באפליקציה של ניהול Loop מבחן, זן תווית אחת או יותר בתחום התוויות.

  • אם אתה מפעיל מבחן עם קונסולת Firebase, זן תווית אחת או יותר בתחום התוויות.

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

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

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

בעיות ידועות

לבדיקות Game Loop ב-Test Lab יש את הבעיות הידועות הבאות:

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