הפעל מבחן Game Loop

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

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

מהו מבחן Game Loop?

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

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

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

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

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

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

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

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

כברירת מחדל, בדיקת 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];
        }
    }
    

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

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

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

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

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

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

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