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

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

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

  • הפעל רמה של המשחק שלך באותו אופן שבו משתמש קצה היה משחק בו. אתה יכול לסקריפט את הקלט של המשתמש, לאפשר למשתמש להיות פעיל, או להחליף את המשתמש ב-AI אם זה הגיוני במשחק שלך (למשל, נניח שיש לך אפליקציית משחקי מכוניות מירוץ וכבר מיושם בינה מלאכותית. אתה יכול לשים בקלות דרייבר 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 ), הוסף את הדברים הבאים:

    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
    }

    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
    }

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

  3. מומלץ: בסיום המבחן הוסיפו:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

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

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

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

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

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

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

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

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

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

השתמש במסוף Firebase

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

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

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

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

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

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

Kotlin+KTX

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

Java

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

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

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

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

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, הזן רשימה או טווח של מספרי לולאה בשדה תרחישים .

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

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

    Kotlin+KTX

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

    Java

    Intent launchIntent = getIntent();
    int 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 : עבור לולאות המשמשות לבדיקת מגוון רחב של בעיות תאימות, כולל בעיות קלט/פלט ובעיות 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 ).

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

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

בעיות ידועות

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

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