Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

הפעל מבחן Game Loop

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

אודות מבחני Game Loop

מהו מבחן Game Loop?

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

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

שלב 1 : רשום את תוכנית ה- URL המותאמת אישית של מעבדת הבדיקה

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

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

  3. בשדה תוכניות כתובות אתרים , הזן 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>
    

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

שלב 2 : תצורה אופציונלית של האפליקציה שלך

הפעל לולאות מרובות

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

בנציג האפליקציה שלך, עקוף את 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
}

מטרה-ג

- (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 המותאמת אישית:

מָהִיר

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

מטרה-ג

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

לסיים טסט מוקדם

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

מטרה-ג

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

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

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

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

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

    מטרה-ג

    /// 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 : חבילת האפליקציה שלך להעלאה

לבסוף, צור קובץ IPA עבור האפליקציה שלך (יהיה עליך לאתר אותו מאוחר יותר).

  1. ב- Xcode בחר פרופיל הקצאה לאפליקציית היעד.

  2. מהתפריט הנפתח שמופיע, לחץ על מוצר> ארכיב . בחר בארכיון האחרון ולחץ על הפץ אפליקציה .

  3. בחלון שמופיע, לחץ על פיתוח> הבא .

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

  5. לחץ על ייצא והזן ספרייה בה ברצונך להוריד את קובץ ה- IPA של האפליקציה שלך.

שלב 4 : הפעל את הבדיקה שלך באופן מקומי

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

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 או gcloud CLI .