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

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

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

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

מהו מבחן לולאת משחקים?

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

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

  • הפעל את המשחק שלך באיכות הגבוהה ביותר כדי לגלות אילו מכשירים יכולים לתמוך בו.

  • הפעל בדיקה טכנית, כגון ריכוז מספר רב של צללים, ביצועם ובדיקת הפלט כצפוי.

שלב 1: רשום את ערכת כתובת האתר המותאמת אישית של Test Lab

ראשית, עליך לרשום את ערכת כתובות האתרים המותאמות אישית של Firebase Test ביישום שלך:

  1. ב- Xcode, בחר יעד פרויקט.

  2. לחץ על הכרטיסייה מידע, ואז להוסיף סוג חדש של כתובות אתרים.

  3. בתחום סכימות ה- URL, הזן firebase-game-loop . אתה יכול גם להירשם לתוכנית אתר מותאמת אישית על-ידי הוספתו של הפרויקט שלך Info.plist בכל מקום בקובץ התצורה בתוך <dict> תג:

    <key>CFBundleURLTypes</key>
     <array>
         <dict>
             <key>CFBundleURLName</key>
             <string></string>
             <key>CFBundleTypeRole</key>
             <string>Editor</string>
             <key>CFBundleURLSchemes</key>
             <array>
                 <string>firebase-game-loop</string>
             </array>
         </dict>
     </array>
    

האפליקציה שלך מוגדרת כעת להפעלת בדיקה באמצעות Test Lab.

שלב 2 (אופציונלי): הגדר את האפליקציה שלך להפעלת לולאות מרובות

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

בשנת delegate של היישום שלך, לעקוף את application(_:open:options:) שיטה:

מָהִיר

func application(_app: UIApplication,
                 open url: URL
                 options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let components = URLComponents(url: url, resolvingAgainstBaseURL: true)!
    if components.scheme == "firebase-game-loop" {
        // ...Enter Game Loop Test logic to override application(_:open:options:).
    }
    return true
}

Objective-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary &lt;UIApplicationOpenURLOptionsKey, id&gt; *)options {
  if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
      // ...Enter Game Loop Test logic to override application(_:open:options:).
  }
}

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

מָהִיר

if components.scheme == "firebase-game-loop" {
    // Iterate over all parameters and find the one with the key "scenario".
    let scenarioNum = Int(components.queryItems!.first(where: { $0.name == "scenario" })!.value!)!
    // ...Write logic specific to the current loop (scenarioNum).
}

Objective-C

if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
    // Launch the app as part of a game loop.
    NSURLComponents *components = [NSURLComponents componentsWithURL:url
                                             resolvingAgainstBaseURL:YES];
    for (NSURLQueryItem *item in [components queryItems]) {
        if ([item.name isEqualToString:@"scenario"]) {
            NSInteger scenarioNum = [item.value integerValue];
            // ...Write logic specific to the current loop (scenarioNum).
        }
    }
}

שלב 3: צור והרץ בדיקה

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

הפעל בדיקה במסוף Firebase

  1. אם לא עשית זאת עדיין, פתח את קונסולת Firebase וליצור פרויקט.

  2. בדף Test Lab של קונסולת Firebase, לחץ מבחן ההפעלה הראשון שלך> הפעלת לולאת משחק iOS.

  3. בחלק App העלה, לחץ על עיון, ולאחר מכן בחר קובץ IPA של האפליקציה (אם עדיין אין לך חשבון, ליצור קובץ IPA של האפליקציה שלך).

  4. אופציונלי: אם אתה רוצה להריץ לולאות מרובות (aka תרחישים) בכול פעם, או לבחור לולאות ספציפיות להופעה, הזן את מספרי הלולאה בתחום התרחישים.

    לדוגמה, כאשר אתם נכנסים "1-3, 5", Test Lab רץ לולאות 1, 2, 3, ו -5 כברירת מחדל (אם לא תזינו דבר בתחום התרחישים), מבחן המעבדה פועלת רק לולאה 1.

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

הפעל בדיקה עם גרסת הבטא CLI של gcloud

  1. אם לא כבר, להגדיר את סביבת SDK gcloud המקומית שלך, אז לוודא כדי להתקין את הרכיב בטא gcloud .

  2. הפעל את gcloud beta firebase test ios run פקודה ולהשתמש הדגלים הבאים כדי להגדיר את הריצה:

דגלים למבחני לולאת המשחק
--type

נדרש: מציין את סוג מבחן iOS שברצונך להפעיל. אתה יכול להיכנס מבחן סוגים xctest (ברירת מחדל) או game-loop .

--app

נדרש: נתיב מוחלט (Google Cloud Storage או הקבצים) בקובץ IPA של האפליקציה שלך. דגל זה תקף רק בעת הפעלת בדיקות לולאת המשחק.

--scenario-numbers

הלולאות (תרחישים הידועים) שאתה רוצה להריץ באפליקציה שלך. ניתן להזין לולאה אחת, רשימה או לולאות, או טווח לולאות. לולאת ברירת המחדל היא 1.

לדוגמה, --scenario-numbers=1-3,5 ריצות לולאות 1, 2, 3, ו 5.

--device-model

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

--timeout

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

לדוגמה:

  • --timeout=200 כוחות המבחן שלך להפסיק כאשר הוא פועל עד 200 שניות.
  • --timeout=1h מאלצת הבדיקה שלך להפסיק כאשר הוא פועל עד שעה.

לדוגמה, הפקודה הבאה מריצה בדיקת Game Loop שמבצעת לולאות 1, 4, 6, 7 ו -8 באייפון 8 פלוס:

gcloud beta firebase test ios run
 --type game-loop --app path/to/my/App.ipa --scenario-numbers 1,4,6-8
 --device-model=iphone8plus

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

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

כדי להריץ את הבדיקה באופן מקומי, טען את אפליקציית הגיימינג שלך בסימולטור והפעל:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • אתה יכול למצוא UDID של סימולטור שלך על ידי הפעלת instruments -s devices פקוד.

  • אם יש רק סימולטור אחד פועל, הזן את המחרוזת המיוחדת "booted" במקום SIMULATOR_UDID .

אם הבדיקה שלך מכילה לולאות מרובות, תוכל לפרט לאיזו לולאה שברצונך להפעיל על ידי העברת מספר הלולאה על scenario הדגל. שים לב שאתה יכול להריץ לולאה אחת בכל פעם בעת הפעלת הבדיקה שלך באופן מקומי. לדוגמה, אם ברצונך להריץ לולאות 1, 2 ו -5, עליך להריץ פקודה נפרדת עבור כל לולאה:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=1
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5

לסיים בדיקה מוקדם

כברירת מחדל, בדיקת Game Loop ממשיכה לפעול עד שהיא מגיעה לפסק זמן של חמש דקות, גם כאשר כל הלולאות בוצעו. עם הגעת הזמן הקצוב, הבדיקה מסתיימת ומבטלת כל לולאות ממתינות. אתה יכול לזרז הבדיקה שלך או לסיים אותו מוקדם על ידי התקשרות ערכת האתר המותאמת אישית של מבחן מעבדת firebase-game-loop-complete ב AppDelegate של האפליקציה שלך. לדוגמה:

מָהִיר

/// End the loop by calling our custom url scheme.
func finishLoop() {
    let url = URL(string: "firebase-game-loop-complete://")!
    UIApplication.shared.open(url)
}

Objective-C

- (void)finishLoop {
  UIApplication *app = [UIApplication sharedApplication];
  [app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
      options:@{}
completionHandler:^(BOOL success) {}];
}

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

כתוב תוצאות בדיקה מותאמות אישית

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

  • כל קבצי התוצאות מועלים ללא קשר לסוג הקובץ, הגודל או הכמות.

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

כדי להגדיר את הבדיקה לכתיבת תוצאות בדיקה מותאמות אישית:

  1. בשינה באפליקצית Documents הספרייה, ליצור ספרייה בשם GameLoopResults .

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

    מָהִיר

    /// Write to a results file.
    func writeResults() {
      let text = "Greetings from game loops!"
      let fileName = "results.txt"
      let fileManager = FileManager.default
      do {
    
      let docs = try fileManager.url(for: .documentDirectory,
                                     in: .userDomainMask,
                                     appropriateFor: nil,
                                     create: true)
      let resultsDir = docs.appendingPathComponent("GameLoopResults")
      try fileManager.createDirectory(
          at: resultsDir,
          withIntermediateDirectories: true,
          attributes: nil)
      let fileURL = resultsDir.appendingPathComponent(fileName)
      try text.write(to: fileURL, atomically: false, encoding: .utf8)
      } catch {
        // ...Handle error writing to file.
      }
    }
    

    Objective-C

    /// Write to a results file.
    - (void)writeResults:(NSString *)message {
        // Locate and create the results directory (if it doesn't exist already).
        NSFileManager *manager = [NSFileManager defaultManager];
        NSURL* url = [[manager URLsForDirectory:NSDocumentDirectory
                                      inDomains:NSUserDomainMask] lastObject];
        NSURL* resultsDir = [url URLByAppendingPathComponent:@"GameLoopResults"
                                                 isDirectory:YES];
        [manager createDirectoryAtURL:resultsDir
          withIntermediateDirectories:NO
                           attributes:nil
                                error:nil];
    
        // Write the result message to a text file.
        NSURL* resultFile = [resultsDir URLByAppendingPathComponent:@"result.txt"];
        if ([manager fileExistsAtPath:[resultFile path]]) {
            // Append to the existing file
            NSFileHandle *handle = [NSFileHandle fileHandleForWritingToURL:resultFile
                                                                     error:nil];
            [handle seekToEndOfFile];
            [handle writeData:[message dataUsingEncoding:NSUTF8StringEncoding]];
            [handle closeFile];
        } else {
            // Create and write to the file.
            [message writeToURL:resultFile
                     atomically:NO
                       encoding:NSUTF8StringEncoding error:nil];
        }
    }