הרצת בדיקה של Game Loop

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

מידע על בדיקות של Game Loop

מהו בדיקת Game Loop?

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

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

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

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

  2. לוחצים על הכרטיסייה Info (מידע) ומוסיפים סוג כתובת URL חדש.

  3. בשדה כתובות URL, מזינים firebase-game-loop. אפשר גם לרשום את הסכימה של כתובת ה-URL בהתאמה אישית על ידי הוספה שלה לקובץ התצורה 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: אפשר להגדיר את האפליקציה

הפעלה של כמה לולאות

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

במתן הרשאות גישה לאפליקציה, צריך לשנות את השיטה application(_:open:options:):

Swift

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 שמשמש לאחזור הסכימה של כתובת ה-URL המותאמת אישית:

Swift

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).
        }
    }
}

סיום הבדיקה מוקדם יותר

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

Swift

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

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

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

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

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

  2. מכל מקום בקוד של האפליקציה (למשל, מה-delegate של האפליקציה), מוסיפים את הקוד הבא:

    Swift

    /// 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];
        }
    }
    

שלב 3: חתימה על האפליקציה

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

שלב 4: אורזים את האפליקציה להעלאה

יוצרים קובץ IPA לאפליקציה (תצטרכו לאתר אותו מאוחר יותר).

  1. בתפריט הנפתח שמופיע, לוחצים על מוצר > העברה לארכיון. בוחרים את הגרסה האחרונה שהועברה לארכיון ולוחצים על הפצת האפליקציה.

  2. בחלון שמופיע, לוחצים על פיתוח > הבא.

  3. אופציונלי: כדי לקבל גרסת build מהירה יותר, צריך לבטל את הבחירה האפשרות Rebuild from Bitcode (בנייה מחדש מ-Bitcode) ולוחצים על Next. Test Lab לא מצריכה דקיקים או בנייה מחדש של האפליקציה כדי להריץ בדיקה להשבית את האפשרות הזו בבטחה.

  4. לוחצים על ייצוא ומזינים את הספרייה שבה רוצים להוריד אותה. בקובץ ה-IPA של האפליקציה.

שלב 5: אימות חתימת האפליקציה

  1. כדי לאמת את חתימת האפליקציה, צריך לפתוח את קובץ ה-ZIP בקובץ ה- .ipa ואז להריץ את הפקודה codesign --verify --deep --verbose /path/to/MyApp.app כאשר "MyApp" הוא שם האפליקציה בתוך התיקייה המחולקת (משתנה בהתאם לפרויקט). הפלט הצפוי הוא MyApp.app: valid on disk.

שלב 6: מריצים את הבדיקה באופן מקומי

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

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

השלבים הבאים

מריצים את הבדיקה באמצעות מסוף Firebase או CLI של gcloud.