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

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

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

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

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

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

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

Test Lab בהתאם לשיטות עבודה מומלצות על שיתוף קובץ בין האפליקציות מתואר שיתוף קובץ . בשנת הפעילות שלך 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);
}

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

אתה יכול להשתמש קבצי נתונים הפלט (מעוצבים כמו בדוגמה הבאה) תוצאות בדיקת תצוגת משחק לולאה בחלק 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 ++ המקורי שלך:

    ג'אווה

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

בעיות ידועות

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

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