آزمون Game Loop را اجرا کنید

وقتی برنامه های بازی بر روی چارچوب های مختلف رابط کاربری ساخته می شوند ، ممکن است خودکار تست بازی سخت باشد. تست های حلقه بازی به شما امکان می دهد تست های اصلی خود را با Test Lab ادغام کرده و به راحتی آنها را در دستگاه هایی که انتخاب می کنید اجرا کنید. این راهنما نحوه آماده سازی یک تست بازی حلقه را برای اجرا با استفاده از Firebase Test Lab توضیح می دهد.

درباره آزمایشات حلقه بازی

تست حلقه بازی چیست؟

یک تست حلقه بازی عملکردهای یک بازیکن واقعی را شبیه سازی می کند تا مطمئن شود که بازی شما برای کاربران شما به روشی سریع و مقیاس پذیر خوب عمل می کند. یک حلقه یک آزمایش کامل یا جزئی از برنامه بازی شما است. می توانید یک تست حلقه بازی را به صورت محلی روی شبیه ساز یا روی مجموعه ای از دستگاه ها در Test Lab اجرا کنید. از تست های حلقه بازی می توان برای موارد زیر استفاده کرد:

  • بازی خود را طوری اجرا کنید که کاربر نهایی آن را بازی کند. شما می توانید ورودی کاربر را اسکریپت کنید ، اجازه دهید کاربر بیکار باشد یا کاربر را با هوش مصنوعی جایگزین کنید (به عنوان مثال ، اگر هوش مصنوعی را در یک مسابقه اتومبیلرانی پیاده سازی کرده اید ، می توانید یک راننده هوش مصنوعی را مسئول ورودی کاربر قرار دهید) به
  • بازی خود را با بالاترین کیفیت اجرا کنید تا بدانید کدام دستگاه ها می توانند از آن پشتیبانی کنند.
  • یک آزمایش فنی انجام دهید ، مانند جمع آوری چندین سایه زن ، اجرای آنها و بررسی اینکه خروجی مطابق انتظار است.

مرحله 1: طرح URL سفارشی ثبت نام آزمون آزمایشگاه

  1. در Xcode ، هدف پروژه را انتخاب کنید.

  2. با کلیک بر روی برگه اطلاعات و سپس یک نوع URL جدید اضافه کنید.

  3. در زمینه طرح URL، را وارد کنید 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>
    

اکنون برنامه شما پیکربندی شده است تا با استفاده از 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
}

هدف-ج

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

هنگامی که چندین حلقه را در آزمایش خود اجرا می کنید ، حلقه فعلی به عنوان یک پارامتر به URL مورد استفاده برای راه اندازی برنامه منتقل می شود. شما همچنین می توانید تعداد حلقه در حال حاضر توسط تجزیه به دست آوردن 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).
        }
    }
}

یک آزمایش را زود تمام کنید

به طور پیش فرض ، یک آزمایش حلقه بازی همچنان اجرا می شود تا زمانی که به پنج دقیقه برسد ، حتی زمانی که همه حلقه ها اجرا شده اند. پس از اتمام زمان ، آزمون پایان می یابد و هر حلقه معلق را لغو می کند. شما می توانید سرعت خود را تست یا اوایل پایان آن را با تماس طرح 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 خود را برای نوشتن نتایج آزمایش سفارشی در سیستم فایل دستگاه خود پیکربندی کنید. به این ترتیب، زمانی که آزمون شروع به در حال اجرا، تست آزمایشگاه ذخیره فایل های نتیجه در یک GameLoopsResults دایرکتوری بر روی دستگاه تست خود را (که شما باید خود را ایجاد کنید). هنگامی که به پایان می رسد آزمون، تست آزمایشگاه حرکت می کند تمام فایل ها از GameLoopResults دایرکتوری به سطل پروژه خود را. هنگام تنظیم آزمون خود موارد زیر را در نظر داشته باشید:

  • همه فایلهای نتیجه بدون در نظر گرفتن نوع ، اندازه یا مقدار فایل بارگذاری می شوند.

  • Test Lab تا زمانی که تمام حلقه های تست شما به پایان نرسد ، نتایج آزمایش شما را پردازش نمی کند ، بنابراین اگر آزمایش شما شامل چندین حلقه است که خروجی را می نویسند ، مطمئن شوید که آنها را به یک فایل نتیجه منحصر به فرد اضافه کرده یا یک فایل نتیجه برای هر حلقه ایجاد کنید. به این ترتیب می توانید از بازنویسی نتایج حلقه قبلی جلوگیری کنید.

برای تنظیم تست خود برای نوشتن نتایج آزمایش سفارشی:

  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. در پنجره ای که ظاهر می شود، با توسعه وب> Next کلیک کنید.

  4. اختیاری: برای دریافت یک ساخت سریع تر، علامت بازسازی از گزینه Bitcode، و سپس روی Next کلیک کنید. Test Lab برای اجرای آزمایش نیازی به نازک شدن یا بازسازی برنامه شما ندارد تا بتوانید با خیال راحت این گزینه را غیرفعال کنید.

  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

گام بعدی

اجرای آزمون خود را با استفاده از فایربیس کنسول یا CLI gcloud .