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

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

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

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

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

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

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

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

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

ראשית, עליך לרשום את תוכנית ה- URL המותאמת אישית של מעבדת הבדיקה של Firebase באפליקציה שלך:

  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>
    

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

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

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

בשנת 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
}

מטרה-ג

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

מטרה-ג

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 פקודה ולהשתמש הדגלים הבאים כדי להגדיר את הריצה:

דגלים למבחני Game Loop
--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

לקבלת מידע נוסף על 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)
}

מטרה-ג

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

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

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

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

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