زمانی که برنامههای بازی بر روی چارچوبهای مختلف رابط کاربری ساخته میشوند، آزمایش خودکار بازی دشوار است. تستهای حلقه بازی به شما این امکان را میدهند که تستهای بومی خود را با Test Lab ادغام کنید و به راحتی آنها را روی دستگاههایی که انتخاب میکنید اجرا کنید. این راهنما نحوه آماده سازی یک تست Game Loop برای اجرا با استفاده از Firebase Test Lab را شرح می دهد.
درباره تست های حلقه بازی
تست حلقه بازی چیست؟
تست Game Loop اقدامات یک بازیکن واقعی را شبیه سازی می کند تا تأیید کند که بازی شما به روشی سریع و مقیاس پذیر برای کاربران شما خوب عمل می کند. یک حلقه آزمایش کامل یا جزئی از آزمایش شما در برنامه بازی شما است. میتوانید یک تست Game Loop را به صورت محلی روی یک شبیهساز یا روی مجموعهای از دستگاهها در Test Lab اجرا کنید. از تست های حلقه بازی می توان برای موارد زیر استفاده کرد:
- همانطور که کاربر نهایی آن را بازی می کند، بازی خود را اجرا کنید. می توانید ورودی کاربر را اسکریپت کنید، اجازه دهید کاربر بیکار باشد، یا کاربر را با یک هوش مصنوعی جایگزین کنید (به عنوان مثال، اگر هوش مصنوعی را در یک بازی اتومبیل رانی پیاده سازی کرده اید، می توانید یک راننده هوش مصنوعی را مسئول ورودی کاربر قرار دهید) .
- بازی خود را با بالاترین کیفیت اجرا کنید تا بدانید کدام دستگاه ها می توانند از آن پشتیبانی کنند.
- یک تست فنی مانند کامپایل کردن چندین سایه زن، اجرای آنها و بررسی اینکه خروجی مطابق انتظار است را اجرا کنید.
مرحله 1 : طرح URL سفارشی Test Lab ثبت کنید
در Xcode، یک هدف پروژه را انتخاب کنید.
روی برگه Info کلیک کنید، سپس یک نوع URL جدید اضافه کنید.
در قسمت URL Schemes ،
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
}
هدف-C
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary <UIApplicationOpenURLOptionsKey, id> *)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).
}
هدف-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).
}
}
}
یک آزمایش را زودتر تمام کنید
بهطور پیشفرض، آزمایش حلقه بازی تا زمانی که به پنج دقیقه باز میگردد، اجرا میشود، حتی زمانی که همه حلقهها اجرا شده باشند. زمانی که به مهلت پایان رسید، آزمایش پایان مییابد و حلقههای معلق را لغو میکند. میتوانید با فراخوانی طرح URL سفارشی firebase-game-loop-complete
در AppDelegate برنامه Test Lab آزمایش خود را سرعت بخشیده یا آن را زودتر تمام کنید. به عنوان مثال:
سویفت
/// End the loop by calling our custom url scheme.
func finishLoop() {
let url = URL(string: "firebase-game-loop-complete://")!
UIApplication.shared.open(url)
}
هدف-C
- (void)finishLoop {
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
options:@{}
completionHandler:^(BOOL success) {}];
}
تست حلقه بازی شما حلقه فعلی را خاتمه می دهد و حلقه بعدی را اجرا می کند. هنگامی که حلقه دیگری برای اجرا وجود ندارد، آزمایش به پایان می رسد.
نتایج آزمون سفارشی را بنویسید
میتوانید تست حلقه بازی خود را برای نوشتن نتایج آزمایشی سفارشی در سیستم فایل دستگاه خود پیکربندی کنید. به این ترتیب، هنگامی که تست شروع به اجرا می کند، Test Lab فایل های نتیجه را در یک پوشه GameLoopsResults
در دستگاه تست شما (که باید خودتان ایجاد کنید) ذخیره می کند. هنگامی که آزمایش به پایان می رسد، Test Lab همه فایل ها را از دایرکتوری GameLoopResults
به سطل پروژه شما منتقل می کند. هنگام تنظیم تست به نکات زیر توجه کنید:
همه فایل های نتیجه بدون در نظر گرفتن نوع، اندازه یا کمیت فایل آپلود می شوند.
Test Lab تا زمانی که تمام حلقههای تست شما به پایان نرسیده است، نتایج آزمایش شما را پردازش نمیکند، بنابراین اگر آزمایش شما شامل چندین حلقه است که خروجی نوشتن دارند، مطمئن شوید که آنها را به یک فایل نتیجه منحصربفرد اضافه کردهاید یا یک فایل نتیجه برای هر حلقه ایجاد کنید. به این ترتیب، می توانید از بازنویسی نتایج حلقه قبلی جلوگیری کنید.
برای تنظیم تست خود برای نوشتن نتایج تست سفارشی:
در دایرکتوری
Documents
برنامه خود، دایرکتوری به نامGameLoopResults
ایجاد کنید.از هر کجای کد برنامه خود (به عنوان مثال، نماینده برنامه خود)، موارد زیر را اضافه کنید:
سویفت
/// 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. } }
هدف-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]; } }
مرحله 3 : برنامه خود را امضا کنید
مطمئن شوید که تمام مصنوعات در برنامه امضا شده اند. به عنوان مثال، میتوانید این کار را از طریق Xcode با تعیین تنظیمات امضا مانند تهیه نمایه و هویت انجام دهید. برای اطلاعات بیشتر به: Apple Codesigning مراجعه کنید
مرحله 4 : برنامه خود را برای آپلود بسته بندی کنید
یک فایل IPA برای برنامه خود ایجاد کنید (شما باید بعداً آن را پیدا کنید).
از منوی کشویی که ظاهر میشود، روی محصول > بایگانی کلیک کنید. جدیدترین بایگانی را انتخاب کنید، سپس روی توزیع برنامه کلیک کنید.
در پنجره ای که ظاهر می شود، روی توسعه > بعدی کلیک کنید.
اختیاری: برای دریافت ساخت سریعتر، گزینه Rebuild from Bitcode را از حالت انتخاب خارج کنید، سپس روی Next کلیک کنید. Test Lab برای اجرای آزمایش نیازی به نازک کردن یا بازسازی برنامه شما ندارد تا بتوانید با خیال راحت این گزینه را غیرفعال کنید.
روی صادرات کلیک کنید، سپس فهرستی را وارد کنید که میخواهید فایل IPA برنامه خود را در آن دانلود کنید.
مرحله 5 : تأیید امضای برنامه
- امضای برنامه را با خارج کردن فایل .ipa و سپس اجرای
codesign --verify --deep --verbose /path/to/MyApp.app
تأیید کنید که در آن "MyApp" نام برنامه داخل پوشه زیپ نشده است (برای هر پروژه متفاوت است. ). خروجی مورد انتظارMyApp.app: valid on disk
.
مرحله 6 : آزمون خود را به صورت محلی اجرا کنید
می توانید تست خود را به صورت محلی اجرا کنید تا رفتار آن را قبل از اجرای آن با Test Lab بررسی کنید. برای آزمایش محلی، برنامه بازی خود را در شبیه ساز بارگیری کنید و اجرا کنید:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
با اجرای دستور
instruments -s devices
می توانید UDID شبیه ساز خود را پیدا کنید.اگر فقط یک شبیهساز در حال اجرا است، رشته ویژه
"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 یا gcloud CLI اجرا کنید.