Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

הפעל מבחן Game Loop

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

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

על מבחני Game Loop

מהו מבחן Game Loop?

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

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

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

  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 : אופציונלי להגדיר את האפליקציה שלך

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

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

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

סיים מבחן מוקדם

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

    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 : ארוז את האפליקציה שלך להעלאה

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

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

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

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

  4. אופציונלי: כדי לקבל בנייה מהירה יותר, בטל את הבחירה באפשרות Rebuild from Bitcode ולאחר מכן לחץ על Next . Test Lab לא מצריך דילול או בנייה מחדש של האפליקציה שלך כדי להפעיל בדיקה כדי שתוכל להשבית בבטחה אפשרות זו.

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

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

אתה יכול להריץ את הבדיקה שלך באופן מקומי כדי לבדוק את ההתנהגות שלה לפני הפעלתה עם 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 או gcloud CLI .