Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

با آزمونهای Game Loop برای iOS شروع کنید

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

این صفحه به شما نشان می دهد که چگونه یک بازی Game Loop را اجرا کنید ، سپس نتایج آزمایش خود را در صفحه آزمایشگاه کنسول Firebase مشاهده و مدیریت کنید. شما همچنین می توانید سفارشی کردن بیشتر آزمون خود را با ویژگی های اختیاری، مانند نوشتن نتایج آزمون های سفارشی و یا پایان دادن به آزمون خود را در اوایل .

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

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

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

  • بازی خود را با بالاترین کیفیت اجرا کنید تا بدانید کدام دستگاه ها می توانند از آن پشتیبانی کنند.

  • یک آزمایش فنی انجام دهید ، مانند جمع آوری چندین سایه زن ، اجرای آنها و بررسی اینکه خروجی مطابق انتظار است.

مرحله 1: طرح URL سفارشی Test Lab را ثبت کنید

ابتدا ، باید برنامه URL سفارشی Firebase Test Lab را در برنامه خود ثبت کنید:

  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 (اختیاری): برنامه خود را برای اجرای چندین حلقه پیکربندی کنید

اگر برنامه شما چندین طرح 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
}

هدف-ج

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

مرحله 3: یک آزمایش ایجاد و اجرا کنید

پس از ثبت نام طرح URL سفارشی تست آزمایشگاه، شما می توانید آزمون خود را در اجرا فایربیس کنسول و یا با CLI gcloud بتا . اگر قبلاً این کار را نکرده اید ، یک فایل IPA برای برنامه خود ایجاد کنید (بعداً باید آن را پیدا کنید).

آزمایشی را در کنسول Firebase اجرا کنید

  1. اگر شما در حال حاضر، باز کردن کنسول فایربیس و ایجاد یک پروژه است.

  2. در صفحه تست آزمایشگاه از فایربیس کنسول، کلیک کنید تست اجرای اول شما> اجرای iOS بازی حلقه.

  3. در بخش بارگذاری برنامه، با کلیک بر مرور، سپس فایل IPA برنامه خود را انتخاب کنید (اگر در حال حاضر، ایجاد یک فایل IPA برای برنامه شما).

  4. اختیاری: اگر می خواهید برای اجرای حلقه های متعدد (با نام مستعار سناریو) در یک زمان و یا حلقه خاص را انتخاب کنید برای اجرا، در زمینه سناریوهای وارد کردن شماره حلقه.

    به عنوان مثال، زمانی که شما وارد "1/3، 5"، تست آزمایشگاه اجرا می شود حلقه 1، 2، 3 و 5. به طور پیش فرض (اگر شما هیچ چیز در این زمینه سناریوهای وارد کنید)، تست آزمایشگاه تنها اجرا می شود حلقه 1.

  5. در بخش دستگاه ها، یک یا فیزیکی بیشتری از دستگاه های شما می خواهید برای تست برنامه های خود را، و سپس کلیک کنید تست شروع را انتخاب کنید.

آزمایشی را با gcloud beta CLI اجرا کنید

  1. اگر شما در حال حاضر، پیکربندی محیط gcloud SDK محلی خود، پس مطمئن شوید که برای نصب کامپوننت gcloud بتا .

  2. اجرای gcloud beta firebase test ios run دستور و با استفاده از پرچم زیر برای پیکربندی اجرا:

پرچم های تست حلقه بازی
--type

مورد نیاز: مشخص کردن نوع آزمون در iOS شما می خواهید را اجرا کنند. شما می توانید انواع آزمون را وارد کنید xctest (پیش فرض) یا game-loop .

--app

مورد نیاز: مسیر مطلق (گوگل ابر ذخیره سازی و یا فایل سیستم) به فایل IPA برنامه شما هستند. این پرچم فقط هنگام اجرای تست های Game Loop معتبر است.

--scenario-numbers

حلقه ها (سناریوهای معروف) که می خواهید در برنامه خود اجرا کنید. می توانید یک حلقه ، یک لیست یا حلقه ها یا طیف وسیعی از حلقه ها را وارد کنید. حلقه پیش فرض 1 است.

به عنوان مثال، --scenario-numbers=1-3,5 اجرا می شود حلقه 1، 2، 3 و 5.

--device-model

دستگاه فیزیکی می خواهید برای اجرای آزمون خود را در (پیدا کردن که دستگاه های موجود شما می توانید استفاده کنید).

--timeout

حداکثر مدت زمانی که می خواهید آزمون شما اجرا شود. می توانید یک عدد صحیح برای نشان دادن مدت زمان در ثانیه ، یا یک عدد صحیح و شمارش برای نشان دادن مدت زمان به عنوان یک واحد زمان بیشتر وارد کنید.

مثلا:

  • --timeout=200 نیروهای آزمون خود را برای پایان دادن هنگامی که آن را اجرا می کند تا 200 ثانیه صورت گرفت.
  • --timeout=1h مجبور آزمون خود را برای پایان دادن هنگامی که آن را اجرا می کند تا یک ساعت.

به عنوان مثال ، دستور زیر یک تست حلقه بازی را اجرا می کند که حلقه های 1 ، 4 ، 6 ، 7 و 8 را در iPhone 8 Plus اجرا می کند:

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

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

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