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

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

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

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

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

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

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

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

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

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

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

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

לאחר שתרשום את ערכת ה-URL המותאמת אישית של Test Lab, תוכל להריץ את הבדיקה שלך במסוף Firebase או עם GCloud Beta CLI . אם עדיין לא עשית זאת, צור קובץ IPA עבור האפליקציה שלך (תצטרך לאתר אותו מאוחר יותר).

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

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

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

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

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

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

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

הפעל בדיקה עם GCloud Beta CLI

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

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

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

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

--app

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

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

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

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

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

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